Commit 2ce9a7db authored by Muhammad Suryono's avatar Muhammad Suryono

update form

parent 265410a3
......@@ -12,6 +12,8 @@
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
<option value="$PROJECT_DIR$/library" />
<option value="$PROJECT_DIR$/spinner" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
......
......@@ -45,6 +45,7 @@ dependencies {
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'com.github.bumptech.glide:glide:4.3.1'
implementation project(':library')
def room_version = "2.2.5"
......
package com.yono.messeripos;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
......@@ -36,6 +38,7 @@ public class CartActivity extends AppCompatActivity {
RecyclerView recyclerView;
List<ProductCartModels> dataCart = null;
public static Boolean statusPost;
SharedPreferences sharedPreferences;
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
......@@ -45,6 +48,7 @@ public class CartActivity extends AppCompatActivity {
Button btnCheckout;
Window w = getWindow();
w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
sharedPreferences = getSharedPreferences(SplashScreen.MY_SHARED_PREFERENCES, Context.MODE_PRIVATE);
// Toolbars
MaterialToolbar toolbars = findViewById(R.id.cAppBar);
......@@ -119,9 +123,14 @@ public class CartActivity extends AppCompatActivity {
ordersResponse.setProduct_cart(dataCart);
modelsCart.insertOrders(ordersResponse);
progressDialog.dismiss();
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean(SplashScreen.CHECKOUT, true);
if(editor.commit()){
startActivity(new Intent(CartActivity.this, PaymentActivity.class));
finish();
}
}
});
}
......
......@@ -30,6 +30,7 @@ import androidx.core.content.FileProvider;
import androidx.databinding.DataBindingUtil;
import com.google.android.material.appbar.MaterialToolbar;
import com.jaredrummler.materialspinner.MaterialSpinner;
import com.yono.messeripos.databinding.FormProductBinding;
import com.yono.messeripos.models.ProductModels;
......@@ -49,8 +50,20 @@ public class FormProductActivity extends AppCompatActivity {
private Spinner splistCategory;
String kondisi_spin;
private String[] default_category = {
"--pilih category--",
private static final String[] ANDROID_VERSIONS = {
"Cupcake",
"Donut",
"Eclair",
"Froyo",
"Gingerbread",
"Honeycomb",
"Ice Cream Sandwich",
"Jelly Bean",
"KitKat",
"Lollipop",
"Marshmallow",
"Nougat",
"Oreo"
};
@Override
......@@ -77,21 +90,8 @@ public class FormProductActivity extends AppCompatActivity {
binding.btnAdd.setOnClickListener(view -> saveProduct());
//spinner
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, default_category);
splistCategory = findViewById(R.id.listCategory);
splistCategory.setAdapter(adapter);
splistCategory.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
kondisi_spin = splistCategory.getSelectedItem().toString();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
MaterialSpinner spinner = findViewById(R.id.listCategory);
spinner.setItems(ANDROID_VERSIONS);
}
......
......@@ -2,7 +2,9 @@ package com.yono.messeripos;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
......@@ -54,7 +56,9 @@ public class MainActivity extends AppCompatActivity {
public static Boolean status_update = false;
MainViewModelsCart mainViewModelsCart;
public static Boolean cartIsEmpty;
SharedPreferences sharedPreferences;
@SuppressLint("LongLogTag")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
......@@ -63,12 +67,13 @@ public class MainActivity extends AppCompatActivity {
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.rvProduct.setAdapter(adapter);
binding.appBarUpdate.setVisibility(View.GONE);
Log.i("Status Checkout main activity", "onCreate: "+SplashScreen.checkout);
showLoading(true);
categoryAdapter = new CategoryAdapter();
productAdapter = new ProductAdapter();
mainViewModelsCart = new ViewModelProvider(MainActivity.this).get(MainViewModelsCart.class);
sharedPreferences = getSharedPreferences(SplashScreen.MY_SHARED_PREFERENCES, Context.MODE_PRIVATE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
......@@ -82,7 +87,11 @@ public class MainActivity extends AppCompatActivity {
public boolean onMenuItemClick(MenuItem item) {
int id = item.getItemId();
if (id == R.id.menu_cart) {
if (SplashScreen.checkout){
startActivity(new Intent(getApplicationContext(), PaymentActivity.class));
}else{
startActivity(new Intent(getApplicationContext(), CartActivity.class));
}
}else if (id == R.id.update){
status_update = true;
binding.topAppBar.setVisibility(View.GONE);
......@@ -242,10 +251,9 @@ public class MainActivity extends AppCompatActivity {
@Override
public void onChanged(DataResponse<List<ProductModels>> listDataResponse) {
if (listDataResponse != null) {
List<ProductModels> productModels = listDataResponse.getData();
ArrayList<ProductModels> productModelsArrayList = new ArrayList<>();
productModelsArrayList.addAll(productModels);
productModelsArrayList.addAll(listDataResponse.getData());
progressDialog.dismiss();
showLoading(false);
if (productModelsArrayList.isEmpty()) {
......
......@@ -41,7 +41,7 @@ public class PaymentActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment);
Log.i("Status Checkout payment", "onCreate: "+SplashScreen.checkout);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window w = getWindow();
w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
......@@ -93,6 +93,8 @@ public class PaymentActivity extends AppCompatActivity {
@Override
public void onBackPressed() {
super.onBackPressed();
startActivity(new Intent(PaymentActivity.this, MainActivity.class));
finish();
}
}
......@@ -4,11 +4,16 @@ import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.jaredrummler.materialspinner.MaterialSpinner;
public class ProductActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_product);
}
}
\ No newline at end of file
......@@ -24,7 +24,9 @@ public class SplashScreen extends AppCompatActivity {
SharedPreferences sharedPreferences;
public static final String MY_SHARED_PREFERENCES = "my_shared_preferences";
public static final String SESSION = "session";
public static final String CHECKOUT = "checkout";
public static Boolean session;
public static Boolean checkout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
......@@ -48,6 +50,7 @@ public class SplashScreen extends AppCompatActivity {
}, 700);
sharedPreferences = getSharedPreferences(MY_SHARED_PREFERENCES, Context.MODE_PRIVATE);
session = sharedPreferences.getBoolean(SESSION, false);
checkout = sharedPreferences.getBoolean(CHECKOUT, false);
......
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<stroke android:color="#333" android:width="2dp"/>
</shape>
</item>
</selector>
\ No newline at end of file
......@@ -66,7 +66,7 @@
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvCategory"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_height="60dp"
android:layout_marginStart="5dp"
app:layout_constraintTop_toBottomOf="@id/topBar"
android:layout_marginTop="10dp"
......
......@@ -93,32 +93,38 @@
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tfStock"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:hint="@string/stock"
android:textColor="#fff"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
app:layout_constraintTop_toBottomOf="@id/tfPrice">
app:layout_constraintTop_toBottomOf="@id/tfPrice"
tools:layout_editor_absoluteX="10dp">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etStock"
android:text="@{productForm.stockProduct+``}"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{productForm.stockProduct+``}"
android:textColor="#fff" />
</com.google.android.material.textfield.TextInputLayout>
<Spinner
<com.jaredrummler.materialspinner.MaterialSpinner
android:id="@+id/listCategory"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/listCategory"
android:padding="25dp"
android:layout_margin="10dp"
android:textAlignment="textStart"
android:spinnerMode="dropdown"
app:layout_constraintTop_toBottomOf="@id/tfStock"/>
android:background="@drawable/stroke_spinner"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tfStock"
app:layout_constraintVertical_bias="0.0"
app:ms_dropdown_height="wrap_content"
app:ms_dropdown_max_height="350dp"
app:ms_background_color="#8888"
app:ms_background_selector="0xFFFFFF"
tools:layout_editor_absoluteX="0dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnAdd"
......
......@@ -115,8 +115,9 @@
<com.google.android.material.button.MaterialButton
android:id="@+id/materialBtnAddCart"
android:padding="1dp"
android:layout_width="match_parent"
android:layout_height="35dp"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
......
......@@ -69,4 +69,9 @@
<item name="android:textSize">16sp</item>
</style>
<style name="Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu">
<item name="strokeColor">@color/colorPrimary</item>
<item name="android:hint">Select kategori</item>
</style>
</resources>
\ No newline at end of file
/*
* Copyright 2013 Chris Banes
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
apply plugin: 'maven'
apply plugin: 'signing'
def isReleaseBuild() {
return VERSION_NAME.contains("SNAPSHOT") == false
}
def getReleaseRepositoryUrl() {
return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL
: "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
}
def getSnapshotRepositoryUrl() {
return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL
: "https://oss.sonatype.org/content/repositories/snapshots/"
}
def getRepositoryUsername() {
return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : ""
}
def getRepositoryPassword() {
return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : ""
}
afterEvaluate { project ->
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
pom.groupId = GROUP
pom.artifactId = POM_ARTIFACT_ID
pom.version = VERSION_NAME
repository(url: getReleaseRepositoryUrl()) {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}
snapshotRepository(url: getSnapshotRepositoryUrl()) {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}
pom.project {
name POM_NAME
packaging POM_PACKAGING
description POM_DESCRIPTION
url POM_URL
scm {
url POM_SCM_URL
connection POM_SCM_CONNECTION
developerConnection POM_SCM_DEV_CONNECTION
}
licenses {
license {
name POM_LICENCE_NAME
url POM_LICENCE_URL
distribution POM_LICENCE_DIST
}
}
developers {
developer {
id POM_DEVELOPER_ID
name POM_DEVELOPER_NAME
}
}
}
}
}
}
signing {
required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.sourceFiles
}
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}
}
\ No newline at end of file
apply plugin: 'com.android.library'
android {
compileSdkVersion 28
buildToolsVersion '28.0.3'
resourcePrefix 'ms__'
defaultConfig {
minSdkVersion 14
targetSdkVersion 28
}
}
dependencies {
implementation 'androidx.annotation:annotation:1.0.0'
testImplementation 'junit:junit:4.12'
}
apply from: rootProject.file('gradle/maven-push.gradle')
VERSION_NAME=1.3.1
VERSION_CODE=131
GROUP=com.jaredrummler
POM_NAME=Material Spinner
POM_ARTIFACT_ID=material-spinner
POM_PACKAGING=aar
POM_DESCRIPTION=A spinner view for Android
POM_URL=https://github.com/jaredrummler/Material-Spinner
POM_SCM_URL=https://github.com/jaredrummler/MaterialSpinner
POM_SCM_CONNECTION=scm:git@github.com:jaredrummler/MaterialSpinner.git
POM_SCM_DEV_CONNECTION=scm:git@github.com:jaredrummler/MaterialSpinner.git
POM_LICENCE_NAME=The Apache Software License, Version 2.0
POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENCE_DIST=repo
POM_DEVELOPER_ID=jaredrummler
POM_DEVELOPER_NAME=Jared Rummler
SNAPSHOT_REPOSITORY_URL=https://oss.sonatype.org/content/repositories/snapshots
RELEASE_REPOSITORY_URL=https://oss.sonatype.org/service/local/staging/deploy/maven2
\ No newline at end of file
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\android-sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
<manifest package="com.jaredrummler.materialspinner"/>
\ No newline at end of file
/*
* Copyright (C) 2016 Jared Rummler
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.jaredrummler.materialspinner;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.StateListDrawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Parcelable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
/**
* A spinner that shows a {@link PopupWindow} under the view when clicked.
*/
public class MaterialSpinner extends TextView {
private OnNothingSelectedListener onNothingSelectedListener;
private OnItemSelectedListener onItemSelectedListener;
private MaterialSpinnerBaseAdapter adapter;
private PopupWindow popupWindow;
private ListView listView;
private Drawable arrowDrawable;
private boolean hideArrow;
private boolean nothingSelected;
private int popupWindowMaxHeight;
private int popupWindowHeight;
private int selectedIndex;
private int backgroundColor;
private int backgroundSelector;
private int arrowColor;
private int arrowColorDisabled;
private int textColor;
private int hintColor;
private int popupPaddingTop;
private int popupPaddingLeft;
private int popupPaddingBottom;
private int popupPaddingRight;
private String hintText;
public MaterialSpinner(Context context) {
super(context);
init(context, null);
}
public MaterialSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public MaterialSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MaterialSpinner);
int defaultColor = getTextColors().getDefaultColor();
boolean rtl = Utils.isRtl(context);
int paddingLeft, paddingTop, paddingRight, paddingBottom;
int defaultPaddingLeft, defaultPaddingTop, defaultPaddingRight, defaultPaddingBottom;
int defaultPopupPaddingLeft, defaultPopupPaddingTop, defaultPopupPaddingRight, defaultPopupPaddingBottom;
Resources resources = getResources();
defaultPaddingLeft = defaultPaddingRight =
defaultPaddingBottom = defaultPaddingTop = resources.getDimensionPixelSize(R.dimen.ms__padding_top);
if (rtl) {
defaultPaddingRight = resources.getDimensionPixelSize(R.dimen.ms__padding_left);
} else {
defaultPaddingLeft = resources.getDimensionPixelSize(R.dimen.ms__padding_left);
}
defaultPopupPaddingLeft =
defaultPopupPaddingRight = resources.getDimensionPixelSize(R.dimen.ms__popup_padding_left);
defaultPopupPaddingTop = defaultPopupPaddingBottom = resources.getDimensionPixelSize(R.dimen.ms__popup_padding_top);
try {
backgroundColor = ta.getColor(R.styleable.MaterialSpinner_ms_background_color, Color.WHITE);
backgroundSelector = ta.getResourceId(R.styleable.MaterialSpinner_ms_background_selector, 0);
textColor = ta.getColor(R.styleable.MaterialSpinner_ms_text_color, defaultColor);
hintColor = ta.getColor(R.styleable.MaterialSpinner_ms_hint_color, defaultColor);
arrowColor = ta.getColor(R.styleable.MaterialSpinner_ms_arrow_tint, textColor);
hideArrow = ta.getBoolean(R.styleable.MaterialSpinner_ms_hide_arrow, false);
hintText = ta.getString(R.styleable.MaterialSpinner_ms_hint) == null ? ""
: ta.getString(R.styleable.MaterialSpinner_ms_hint);
popupWindowMaxHeight = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_dropdown_max_height, 0);
popupWindowHeight = ta.getLayoutDimension(R.styleable.MaterialSpinner_ms_dropdown_height,
WindowManager.LayoutParams.WRAP_CONTENT);
paddingTop = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_padding_top, defaultPaddingTop);
paddingLeft = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_padding_left, defaultPaddingLeft);
paddingBottom = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_padding_bottom, defaultPaddingBottom);
paddingRight = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_padding_right, defaultPaddingRight);
popupPaddingTop =
ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_popup_padding_top, defaultPopupPaddingTop);
popupPaddingLeft =
ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_popup_padding_left, defaultPopupPaddingLeft);
popupPaddingBottom =
ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_popup_padding_bottom, defaultPopupPaddingBottom);
popupPaddingRight =
ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_popup_padding_right, defaultPopupPaddingRight);
arrowColorDisabled = Utils.lighter(arrowColor, 0.8f);
} finally {
ta.recycle();
}
nothingSelected = true;
setGravity(Gravity.CENTER_VERTICAL | Gravity.START);
setClickable(true);
setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
setBackgroundResource(R.drawable.ms__selector);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && rtl) {
setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
setTextDirection(View.TEXT_DIRECTION_RTL);
}
if (!hideArrow) {
arrowDrawable = Utils.getDrawable(context, R.drawable.ms__arrow).mutate();
arrowDrawable.setColorFilter(arrowColor, PorterDuff.Mode.SRC_IN);
Drawable[] drawables = getCompoundDrawables();
if (rtl) {
drawables[0] = arrowDrawable;
} else {
drawables[2] = arrowDrawable;
}
setCompoundDrawablesWithIntrinsicBounds(drawables[0], drawables[1], drawables[2], drawables[3]);
}
listView = new ListView(context);
listView.setId(getId());
listView.setDivider(null);
listView.setItemsCanFocus(true);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position >= selectedIndex
&& position < adapter.getCount()
&& adapter.getItems().size() != 1
&& TextUtils.isEmpty(hintText)) {
position++;
}
selectedIndex = position;
nothingSelected = false;
Object item = adapter.get(position);
adapter.notifyItemSelected(position);
setTextColor(textColor);
setText(item.toString());
collapse();
if (onItemSelectedListener != null) {
//noinspection unchecked
onItemSelectedListener.onItemSelected(MaterialSpinner.this, position, id, item);
}
}
});
popupWindow = new PopupWindow(context);
popupWindow.setContentView(listView);
popupWindow.setOutsideTouchable(true);
popupWindow.setFocusable(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
popupWindow.setElevation(16);
popupWindow.setBackgroundDrawable(Utils.getDrawable(context, R.drawable.ms__drawable));
} else {
popupWindow.setBackgroundDrawable(Utils.getDrawable(context, R.drawable.ms__drop_down_shadow));
}
if (backgroundColor != Color.WHITE) { // default color is white
setBackgroundColor(backgroundColor);
} else if (backgroundSelector != 0) {
setBackgroundResource(backgroundSelector);
}
if (textColor != defaultColor) {
setTextColor(textColor);
}
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override public void onDismiss() {
if (nothingSelected && onNothingSelectedListener != null) {
onNothingSelectedListener.onNothingSelected(MaterialSpinner.this);
}
if (!hideArrow) {
animateArrow(false);
}
}
});
}
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
popupWindow.setWidth(MeasureSpec.getSize(widthMeasureSpec));
popupWindow.setHeight(calculatePopupWindowHeight());
if (adapter != null) {
CharSequence currentText = getText();
String longestItem = currentText.toString();
for (int i = 0; i < adapter.getCount(); i++) {
String itemText = adapter.getItemText(i);
if (itemText.length() > longestItem.length()) {
longestItem = itemText;
}
}
setText(longestItem);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setText(currentText);
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
@Override public boolean onTouchEvent(@NonNull MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
if (isEnabled() && isClickable()) {
if (!popupWindow.isShowing()) {
expand();
} else {
collapse();
}
}
}
return super.onTouchEvent(event);
}
@Override public void setBackgroundColor(int color) {
backgroundColor = color;
Drawable background = getBackground();
if (background instanceof StateListDrawable) { // pre-L
try {
Method getStateDrawable = StateListDrawable.class.getDeclaredMethod("getStateDrawable", int.class);
if (!getStateDrawable.isAccessible()) getStateDrawable.setAccessible(true);
int[] colors = { Utils.darker(color, 0.85f), color };
for (int i = 0; i < colors.length; i++) {
ColorDrawable drawable = (ColorDrawable) getStateDrawable.invoke(background, i);
drawable.setColor(colors[i]);
}
} catch (Exception e) {
Log.e("MaterialSpinner", "Error setting background color", e);
}
} else if (background != null) { // 21+ (RippleDrawable)
background.setColorFilter(color, PorterDuff.Mode.SRC_IN);
}
popupWindow.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_IN);
}
@Override public void setTextColor(int color) {
textColor = color;
if (adapter != null) {
adapter.setTextColor(textColor);
adapter.notifyDataSetChanged();
}
super.setTextColor(color);
}
public void setHintColor(int color) {
hintColor = color;
super.setTextColor(color);
}
@Override public Parcelable onSaveInstanceState() {
Bundle bundle = new Bundle();
bundle.putParcelable("state", super.onSaveInstanceState());
bundle.putInt("selected_index", selectedIndex);
bundle.putBoolean("nothing_selected", nothingSelected);
if (popupWindow != null) {
bundle.putBoolean("is_popup_showing", popupWindow.isShowing());
collapse();
} else {
bundle.putBoolean("is_popup_showing", false);
}
return bundle;
}
@Override public void onRestoreInstanceState(Parcelable savedState) {
if (savedState instanceof Bundle) {
Bundle bundle = (Bundle) savedState;
selectedIndex = bundle.getInt("selected_index");
nothingSelected = bundle.getBoolean("nothing_selected");
if (adapter != null) {
if (nothingSelected && !TextUtils.isEmpty(hintText)) {
setHintColor(hintColor);
setText(hintText);
} else {
setTextColor(textColor);
setText(adapter.get(selectedIndex).toString());
}
adapter.notifyItemSelected(selectedIndex);
}
if (bundle.getBoolean("is_popup_showing")) {
if (popupWindow != null) {
// Post the show request into the looper to avoid bad token exception
post(new Runnable() {
@Override public void run() {
expand();
}
});
}
}
savedState = bundle.getParcelable("state");
}
super.onRestoreInstanceState(savedState);
}
@Override public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
if (arrowDrawable != null) {
arrowDrawable.setColorFilter(enabled ? arrowColor : arrowColorDisabled, PorterDuff.Mode.SRC_IN);
}
}
/**
* @return the selected item position
*/
public int getSelectedIndex() {
return selectedIndex;
}
/**
* Set the default spinner item using its index
*
* @param position the item's position
*/
public void setSelectedIndex(int position) {
if (adapter != null) {
if (position >= 0 && position <= adapter.getCount()) {
adapter.notifyItemSelected(position);
selectedIndex = position;
setText(adapter.get(position).toString());
} else {
throw new IllegalArgumentException("Position must be lower than adapter count!");
}
}
}
/**
* Register a callback to be invoked when an item in the dropdown is selected.
*
* @param onItemSelectedListener The callback that will run
*/
public void setOnItemSelectedListener(@Nullable OnItemSelectedListener onItemSelectedListener) {
this.onItemSelectedListener = onItemSelectedListener;
}
/**
* Register a callback to be invoked when the {@link PopupWindow} is shown but the user didn't select an item.
*
* @param onNothingSelectedListener the callback that will run
*/
public void setOnNothingSelectedListener(@Nullable OnNothingSelectedListener onNothingSelectedListener) {
this.onNothingSelectedListener = onNothingSelectedListener;
}
/**
* Set the dropdown items
*
* @param items A list of items
* @param <T> The item type
*/
public <T> void setItems(@NonNull T... items) {
setItems(Arrays.asList(items));
}
/**
* Set the dropdown items
*
* @param items A list of items
* @param <T> The item type
*/
public <T> void setItems(@NonNull List<T> items) {
adapter = new MaterialSpinnerAdapter<>(getContext(), items)
.setPopupPadding(popupPaddingLeft, popupPaddingTop, popupPaddingRight, popupPaddingBottom)
.setBackgroundSelector(backgroundSelector)
.setTextColor(textColor);
setAdapterInternal(adapter);
}
/**
* Set a custom adapter for the dropdown items
*
* @param adapter The list adapter
*/
public void setAdapter(@NonNull ListAdapter adapter) {
this.adapter = new MaterialSpinnerAdapterWrapper(getContext(), adapter)
.setPopupPadding(popupPaddingLeft, popupPaddingTop, popupPaddingRight, popupPaddingBottom)
.setBackgroundSelector(backgroundSelector)
.setTextColor(textColor);
setAdapterInternal(this.adapter);
}
/**
* Set the custom adapter for the dropdown items
*
* @param adapter The adapter
* @param <T> The type
*/
public <T> void setAdapter(MaterialSpinnerAdapter<T> adapter) {
this.adapter = adapter;
this.adapter.setTextColor(textColor);
this.adapter.setBackgroundSelector(backgroundSelector);
this.adapter.setPopupPadding(popupPaddingLeft, popupPaddingTop, popupPaddingRight, popupPaddingBottom);
setAdapterInternal(adapter);
}
private void setAdapterInternal(@NonNull MaterialSpinnerBaseAdapter adapter) {
boolean shouldResetPopupHeight = listView.getAdapter() != null;
adapter.setHintEnabled(!TextUtils.isEmpty(hintText));
listView.setAdapter(adapter);
if (selectedIndex >= adapter.getCount()) {
selectedIndex = 0;
}
if (adapter.getItems().size() > 0) {
if (nothingSelected && !TextUtils.isEmpty(hintText)) {
setText(hintText);
setHintColor(hintColor);
} else {
setTextColor(textColor);
setText(adapter.get(selectedIndex).toString());
}
} else {
setText("");
}
if (shouldResetPopupHeight) {
popupWindow.setHeight(calculatePopupWindowHeight());
}
}
/**
* Get the list of items in the adapter
*
* @param <T> The item type
* @return A list of items or {@code null} if no items are set.
*/
public <T> List<T> getItems() {
if (adapter == null) {
return null;
}
//noinspection unchecked
return adapter.getItems();
}
/**
* Show the dropdown menu
*/
public void expand() {
if (canShowPopup()) {
if (!hideArrow) {
animateArrow(true);
}
nothingSelected = true;
popupWindow.showAsDropDown(this);
}
}
/**
* Closes the dropdown menu
*/
public void collapse() {
if (!hideArrow) {
animateArrow(false);
}
popupWindow.dismiss();
}
/**
* Set the tint color for the dropdown arrow
*
* @param color the color value
*/
public void setArrowColor(@ColorInt int color) {
arrowColor = color;
arrowColorDisabled = Utils.lighter(arrowColor, 0.8f);
if (arrowDrawable != null) {
arrowDrawable.setColorFilter(arrowColor, PorterDuff.Mode.SRC_IN);
}
}
private boolean canShowPopup() {
Activity activity = getActivity();
if (activity == null || activity.isFinishing()) {
return false;
}
boolean isLaidOut;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
isLaidOut = isLaidOut();
} else {
isLaidOut = getWidth() > 0 && getHeight() > 0;
}
return isLaidOut;
}
private Activity getActivity() {
Context context = getContext();
while (context instanceof ContextWrapper) {
if (context instanceof Activity) {
return (Activity) context;
}
context = ((ContextWrapper) context).getBaseContext();
}
return null;
}
private void animateArrow(boolean shouldRotateUp) {
int start = shouldRotateUp ? 0 : 10000;
int end = shouldRotateUp ? 10000 : 0;
ObjectAnimator animator = ObjectAnimator.ofInt(arrowDrawable, "level", start, end);
animator.start();
}
/**
* Set the maximum height of the dropdown menu.
*
* @param height the height in pixels
*/
public void setDropdownMaxHeight(int height) {
popupWindowMaxHeight = height;
popupWindow.setHeight(calculatePopupWindowHeight());
}
/**
* Set the height of the dropdown menu
*
* @param height the height in pixels
*/
public void setDropdownHeight(int height) {
popupWindowHeight = height;
popupWindow.setHeight(calculatePopupWindowHeight());
}
private int calculatePopupWindowHeight() {
if (adapter == null) {
return WindowManager.LayoutParams.WRAP_CONTENT;
}
float itemHeight = getResources().getDimension(R.dimen.ms__item_height);
float listViewHeight = adapter.getCount() * itemHeight;
if (popupWindowMaxHeight > 0 && listViewHeight > popupWindowMaxHeight) {
return popupWindowMaxHeight;
} else if (popupWindowHeight != WindowManager.LayoutParams.MATCH_PARENT
&& popupWindowHeight != WindowManager.LayoutParams.WRAP_CONTENT
&& popupWindowHeight <= listViewHeight) {
return popupWindowHeight;
} else if (listViewHeight == 0 && adapter.getItems().size() == 1) {
return (int) itemHeight;
}
return WindowManager.LayoutParams.WRAP_CONTENT;
}
/**
* Get the {@link PopupWindow}.
*
* @return The {@link PopupWindow} that is displayed when the view has been clicked.
*/
public PopupWindow getPopupWindow() {
return popupWindow;
}
/**
* Get the {@link ListView} that is used in the dropdown menu
*
* @return the ListView shown in the PopupWindow.
*/
public ListView getListView() {
return listView;
}
/**
* Interface definition for a callback to be invoked when an item in this view has been selected.
*
* @param <T> Adapter item type
*/
public interface OnItemSelectedListener<T> {
/**
* <p>Callback method to be invoked when an item in this view has been selected. This callback is invoked only when
* the newly selected position is different from the previously selected position or if there was no selected
* item.</p>
*
* @param view The {@link MaterialSpinner} view
* @param position The position of the view in the adapter
* @param id The row id of the item that is selected
* @param item The selected item
*/
void onItemSelected(MaterialSpinner view, int position, long id, T item);
}
/**
* Interface definition for a callback to be invoked when the dropdown is dismissed and no item was selected.
*/
public interface OnNothingSelectedListener {
/**
* Callback method to be invoked when the {@link PopupWindow} is dismissed and no item was selected.
*
* @param spinner the {@link MaterialSpinner}
*/
void onNothingSelected(MaterialSpinner spinner);
}
}
\ No newline at end of file
/*
* Copyright (C) 2016 Jared Rummler
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.jaredrummler.materialspinner;
import android.content.Context;
import java.util.List;
public class MaterialSpinnerAdapter<T> extends MaterialSpinnerBaseAdapter {
private final List<T> items;
public MaterialSpinnerAdapter(Context context, List<T> items) {
super(context);
this.items = items;
}
@Override public int getCount() {
int size = items.size();
if (size == 1 || isHintEnabled()) return size;
return size - 1;
}
@Override public T getItem(int position) {
if (isHintEnabled()) {
return items.get(position);
} else if (position >= getSelectedIndex() && items.size() != 1) {
return items.get(position + 1);
} else {
return items.get(position);
}
}
@Override public T get(int position) {
return items.get(position);
}
@Override public List<T> getItems() {
return items;
}
}
\ No newline at end of file
/*
* Copyright (C) 2016 Jared Rummler
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.jaredrummler.materialspinner;
import android.content.Context;
import android.widget.ListAdapter;
import java.util.ArrayList;
import java.util.List;
final class MaterialSpinnerAdapterWrapper extends MaterialSpinnerBaseAdapter {
private final ListAdapter listAdapter;
public MaterialSpinnerAdapterWrapper(Context context, ListAdapter toWrap) {
super(context);
listAdapter = toWrap;
}
@Override public int getCount() {
int size = listAdapter.getCount();
if (size == 1 || isHintEnabled()) return size;
return size - 1;
}
@Override public Object getItem(int position) {
if (isHintEnabled()) {
return listAdapter.getItem(position);
} else if (position >= getSelectedIndex() && listAdapter.getCount() != 1) {
return listAdapter.getItem(position + 1);
} else {
return listAdapter.getItem(position);
}
}
@Override public Object get(int position) {
return listAdapter.getItem(position);
}
@Override public List<Object> getItems() {
List<Object> items = new ArrayList<>();
for (int i = 0; i < listAdapter.getCount(); i++) {
items.add(listAdapter.getItem(i));
}
return items;
}
}
\ No newline at end of file
/*
* Copyright (C) 2016 Jared Rummler
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.jaredrummler.materialspinner;
import android.content.Context;
import android.content.res.Configuration;
import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import androidx.annotation.ColorInt;
import androidx.annotation.DrawableRes;
import java.util.List;
public abstract class MaterialSpinnerBaseAdapter<T> extends BaseAdapter {
private final Context context;
private int selectedIndex;
private int textColor;
private int backgroundSelector;
private int popupPaddingTop;
private int popupPaddingLeft;
private int popupPaddingBottom;
private int popupPaddingRight;
private boolean isHintEnabled;
public MaterialSpinnerBaseAdapter(Context context) {
this.context = context;
}
@Override public View getView(int position, View convertView, ViewGroup parent) {
final TextView textView;
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.ms__list_item, parent, false);
textView = (TextView) convertView.findViewById(R.id.tv_tinted_spinner);
textView.setTextColor(textColor);
textView.setPadding(popupPaddingLeft, popupPaddingTop, popupPaddingRight, popupPaddingBottom);
//
// int left, right, bottom, top;
// if (popupPaddingTop != -1) {
// left = textView.getPaddingLeft();
// right = textView.getPaddingRight();
// bottom = textView.getPaddingBottom();
//
// textView.setPadding(left, popupPaddingTop, right, bottom);
// }
//
// if (popupPaddingLeft != -1) {
// top = textView.getPaddingTop();
// right = textView.getPaddingRight();
// bottom = textView.getPaddingBottom();
//
// textView.setPadding(popupPaddingLeft, top, right, bottom);
// }
//
// if (popupPaddingBottom != -1) {
// left = textView.getPaddingLeft();
// top = textView.getPaddingTop();
// right = textView.getPaddingRight();
//
// textView.setPadding(left, top, right, popupPaddingBottom);
// }
//
// if (popupPaddingRight != -1) {
// left = textView.getPaddingLeft();
// top = textView.getPaddingTop();
// bottom = textView.getPaddingBottom();
//
// textView.setPadding(left, top, popupPaddingRight, bottom);
// }
if (backgroundSelector != 0) {
textView.setBackgroundResource(backgroundSelector);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
Configuration config = context.getResources().getConfiguration();
if (config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
textView.setTextDirection(View.TEXT_DIRECTION_RTL);
}
}
convertView.setTag(new ViewHolder(textView));
} else {
textView = ((ViewHolder) convertView.getTag()).textView;
}
textView.setText(getItemText(position));
return convertView;
}
public String getItemText(int position) {
return getItem(position).toString();
}
public int getSelectedIndex() {
return selectedIndex;
}
public void notifyItemSelected(int index) {
selectedIndex = index;
}
@Override public long getItemId(int position) {
return position;
}
@Override public abstract T getItem(int position);
@Override public abstract int getCount();
public abstract T get(int position);
public abstract List<T> getItems();
public void setHintEnabled(boolean isHintEnabled) {
this.isHintEnabled = isHintEnabled;
}
public boolean isHintEnabled() {
return this.isHintEnabled;
}
public MaterialSpinnerBaseAdapter<T> setTextColor(@ColorInt int textColor) {
this.textColor = textColor;
return this;
}
public MaterialSpinnerBaseAdapter<T> setBackgroundSelector(@DrawableRes int backgroundSelector) {
this.backgroundSelector = backgroundSelector;
return this;
}
public MaterialSpinnerBaseAdapter<T> setPopupPadding(int left, int top, int right, int bottom) {
this.popupPaddingLeft = left;
this.popupPaddingTop = top;
this.popupPaddingRight = right;
this.popupPaddingBottom = bottom;
return this;
}
private static class ViewHolder {
private TextView textView;
private ViewHolder(TextView textView) {
this.textView = textView;
}
}
}
\ No newline at end of file
/*
* Copyright (C) 2016 Jared Rummler
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.jaredrummler.materialspinner;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.view.View;
final class Utils {
/**
* Darkens a color by a given factor.
*
* @param color the color to darken
* @param factor The factor to darken the color.
* @return darker version of specified color.
*/
static int darker(int color, float factor) {
return Color.argb(Color.alpha(color), Math.max((int) (Color.red(color) * factor), 0),
Math.max((int) (Color.green(color) * factor), 0), Math.max((int) (Color.blue(color) * factor), 0));
}
/**
* Lightens a color by a given factor.
*
* @param color The color to lighten
* @param factor The factor to lighten the color. 0 will make the color unchanged. 1 will make the
* color white.
* @return lighter version of the specified color.
*/
static int lighter(int color, float factor) {
int red = (int) ((Color.red(color) * (1 - factor) / 255 + factor) * 255);
int green = (int) ((Color.green(color) * (1 - factor) / 255 + factor) * 255);
int blue = (int) ((Color.blue(color) * (1 - factor) / 255 + factor) * 255);
return Color.argb(Color.alpha(color), red, green, blue);
}
/**
* Check if layout direction is RTL
*
* @param context the current context
* @return {@code true} if the layout direction is right-to-left
*/
static boolean isRtl(Context context) {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1
&& context.getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
}
/**
* Return a drawable object associated with a particular resource ID.
*
* <p>Starting in {@link android.os.Build.VERSION_CODES#LOLLIPOP}, the returned drawable will be styled for the
* specified Context's theme.</p>
*
* @param id The desired resource identifier, as generated by the aapt tool.
* This integer encodes the package, type, and resource entry.
* The value 0 is an invalid identifier.
* @return Drawable An object that can be used to draw this resource.
*/
static Drawable getDrawable(Context context, int id) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return context.getDrawable(id);
}
return context.getResources().getDrawable(id);
}
}
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<ripple
xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?android:attr/colorControlHighlight">
<item
android:id="@android:id/mask"
android:drawable="@android:color/white"/>
<item android:bottom="1dp">
<shape>
<solid android:color="@android:color/white"/>
</shape>
</item>
</ripple>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ms__menu_down"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="180"/>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:top="3dp">
<shape android:shape="rectangle">
<solid android:color="@android:color/white"/>
<corners
android:bottomLeftRadius="1dp"
android:bottomRightRadius="1dp"
android:topLeftRadius="1dp"
android:topRightRadius="1dp"/>
</shape>
</item>
</layer-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24"
android:width="24dp">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M7,10L12,15L17,10H7Z"/>
</vector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/darker_gray" android:state_pressed="true"/>
<item android:drawable="@android:color/white" android:state_pressed="false"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_tinted_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:ellipsize="marquee"
android:gravity="center_vertical"
android:minHeight="@dimen/ms__item_height"
android:paddingBottom="@dimen/ms__popup_padding_top"
android:paddingLeft="@dimen/ms__popup_padding_left"
android:paddingRight="@dimen/ms__popup_padding_left"
android:paddingStart="@dimen/ms__popup_padding_left"
android:paddingTop="@dimen/ms__popup_padding_top"
android:singleLine="true"
/>
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<resources xmlns:tools="http://schemas.android.com/tools">
<declare-styleable name="MaterialSpinner" tools:ignore="ResourceName">
<attr format="color" name="ms_arrow_tint"/>
<attr format="boolean" name="ms_hide_arrow"/>
<attr format="color" name="ms_background_color"/>
<attr format="color" name="ms_text_color"/>
<attr format="dimension" name="ms_dropdown_max_height"/>
<attr format="dimension" name="ms_dropdown_height">
<enum name="fill_parent" value="-1"/>
<enum name="match_parent" value="-1"/>
<enum name="wrap_content" value="-2"/>
</attr>
<attr format="integer" name="ms_background_selector"/>
<attr format="dimension" name="ms_padding_top"/>
<attr format="dimension" name="ms_padding_left"/>
<attr format="dimension" name="ms_padding_bottom"/>
<attr format="dimension" name="ms_padding_right"/>
<attr format="dimension" name="ms_popup_padding_top"/>
<attr format="dimension" name="ms_popup_padding_left"/>
<attr format="dimension" name="ms_popup_padding_bottom"/>
<attr format="dimension" name="ms_popup_padding_right"/>
<attr format="string" name="ms_hint"/>
<attr format="color" name="ms_hint_color"/>
</declare-styleable>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<resources>
<dimen name="ms__padding_left">24dp</dimen>
<dimen name="ms__padding_top">12dp</dimen>
<dimen name="ms__item_height">48dp</dimen>
<dimen name="ms__popup_padding_left">24dp</dimen>
<dimen name="ms__popup_padding_top">12dp</dimen>
</resources>
\ No newline at end of file
include ':library'
include ':spinner'
include ':app'
rootProject.name = "Messeri POS"
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment