diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..a9854ef --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..164b6b0 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..51100c4 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,42 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdk 32 + + defaultConfig { + applicationId "com.searchablespinner.searchablespinner" + minSdk 21 + targetSdk 32 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.google.android.material:material:1.6.1' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'com.facebook.stetho:stetho:1.5.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + + implementation project(path: ':searchspinnerlibrary') + implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# 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 *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/searchablespinner/searchablespinner/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/searchablespinner/searchablespinner/ExampleInstrumentedTest.java new file mode 100644 index 0000000..395f0ef --- /dev/null +++ b/app/src/androidTest/java/com/searchablespinner/searchablespinner/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.searchablespinner.searchablespinner; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.searchablespinner.searchablespinner", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..2d09c2c --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/searchablespinner/searchablespinner/MainActivity.java b/app/src/main/java/com/searchablespinner/searchablespinner/MainActivity.java new file mode 100644 index 0000000..04a5881 --- /dev/null +++ b/app/src/main/java/com/searchablespinner/searchablespinner/MainActivity.java @@ -0,0 +1,208 @@ +package com.searchablespinner.searchablespinner; + +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + + +import com.searchablespinner.searchspinnerlibrary.SearchableSpinner; +import com.searchablespinner.searchspinnerlibrary.interfaces.IStatusListener; +import com.searchablespinner.searchspinnerlibrary.interfaces.OnItemSelectedListener; + +import java.util.ArrayList; + +public class MainActivity extends AppCompatActivity { + + private final ArrayList mStrings = new ArrayList<>(); + private SearchableSpinner mSearchableSpinner; + private SearchableSpinner mSearchableSpinner1; + private SearchableSpinner mSearchableSpinner2; + private SearchableSpinner mSearchableSpinner3; + private SimpleListAdapter mSimpleListAdapter; + private SimpleArrayListAdapter mSimpleArrayListAdapter; + private OnItemSelectedListener mOnItemSelectedListener = new OnItemSelectedListener() { + @Override + public void onItemSelected(View view, int position, long id) { + Toast.makeText(MainActivity.this, "Item on position " + position + " : " + mSimpleListAdapter.getItem(position) + " Selected", Toast.LENGTH_SHORT).show(); + } + + @Override + public void onNothingSelected() { + Toast.makeText(MainActivity.this, "Nothing Selected", Toast.LENGTH_SHORT).show(); + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + initListValues(); + mSimpleListAdapter = new SimpleListAdapter(this, mStrings); + mSimpleArrayListAdapter = new SimpleArrayListAdapter(this, mStrings); + + mSearchableSpinner = findViewById(R.id.SearchableSpinner); + mSearchableSpinner.setAdapter(mSimpleArrayListAdapter); + mSearchableSpinner.setOnItemSelectedListener(mOnItemSelectedListener); + mSearchableSpinner.setStatusListener(new IStatusListener() { + @Override + public void spinnerIsOpening() { + mSearchableSpinner1.hideEdit(); + mSearchableSpinner2.hideEdit(); + } + + @Override + public void spinnerIsClosing() { + + } + }); + + mSearchableSpinner1 = findViewById(R.id.SearchableSpinner1); + mSearchableSpinner1.setAdapter(mSimpleListAdapter); + mSearchableSpinner1.setOnItemSelectedListener(mOnItemSelectedListener); + mSearchableSpinner1.setStatusListener(new IStatusListener() { + @Override + public void spinnerIsOpening() { + mSearchableSpinner.hideEdit(); + mSearchableSpinner2.hideEdit(); + } + + @Override + public void spinnerIsClosing() { + + } + }); + + mSearchableSpinner2 = findViewById(R.id.SearchableSpinner2); + mSearchableSpinner2.setAdapter(mSimpleListAdapter); + mSearchableSpinner2.setOnItemSelectedListener(mOnItemSelectedListener); + mSearchableSpinner2.setStatusListener(new IStatusListener() { + @Override + public void spinnerIsOpening() { + mSearchableSpinner.hideEdit(); + mSearchableSpinner1.hideEdit(); + } + + @Override + public void spinnerIsClosing() { + + } + }); + + mSearchableSpinner3 = findViewById(R.id.SearchableSpinner3); + mSearchableSpinner3.setAdapter(mSimpleListAdapter); + mSearchableSpinner3.setOnItemSelectedListener(mOnItemSelectedListener); + mSearchableSpinner3.setStatusListener(new IStatusListener() { + @Override + public void spinnerIsOpening() { + mSearchableSpinner.hideEdit(); + mSearchableSpinner3.hideEdit(); + } + + @Override + public void spinnerIsClosing() { + + } + }); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (!mSearchableSpinner.isInsideSearchEditText(event)) { + mSearchableSpinner.hideEdit(); + } + if (!mSearchableSpinner1.isInsideSearchEditText(event)) { + mSearchableSpinner1.hideEdit(); + } + if (!mSearchableSpinner2.isInsideSearchEditText(event)) { + mSearchableSpinner2.hideEdit(); + } + return super.onTouchEvent(event); + } + + private void initListValues() { + mStrings.add("Samwel Nyandoro"); + mStrings.add("Samwel Nyandoro1"); + mStrings.add("Samwel Nyandoro2"); + mStrings.add("Samwel Nyandoro3"); + mStrings.add("Samwel Nyandoro4"); + mStrings.add("Samwel Nyandoro5"); + mStrings.add("Samwel Nyandoro6"); + mStrings.add("Samwel Nyandoro7"); + mStrings.add("Samwel Nyandoro8"); + mStrings.add("Samwel Nyandoro9"); + mStrings.add("Samwel Nyandoro10"); + mStrings.add("Samwel Nyandoro11"); + mStrings.add("Samwel Nyandoro12"); + mStrings.add("Samwel Nyandoro13"); + mStrings.add("Samwel Nyandoro14"); + mStrings.add("Samwel Nyandoro15"); + mStrings.add("Samwel Nyandoro16"); + mStrings.add("Samwel Nyandoro17"); + mStrings.add("Samwel Nyandoro18"); + mStrings.add("Samwel Nyandoro19"); + mStrings.add("Samwel Nyandoro20"); + mStrings.add("Samwel Nyandoro21"); + mStrings.add("Samwel Nyandoro22"); + mStrings.add("Samwel Nyandoro23"); + mStrings.add("Samwel Nyandoro24"); + mStrings.add("Samwel Nyandoro25"); + mStrings.add("Samwel Nyandoro26"); + mStrings.add("Samwel Nyandoro27"); + mStrings.add("Samwel Nyandoro28"); + mStrings.add("Samwel Nyandoro29"); + mStrings.add("Samwel Nyandoro30"); + mStrings.add("Samwel Nyandoro31"); + mStrings.add("Samwel Nyandoro32"); + mStrings.add("Samwel Nyandoro33"); + mStrings.add("Samwel Nyandoro34"); + mStrings.add("Samwel Nyandoro35"); + mStrings.add("Samwel Nyandoro36"); + mStrings.add("Samwel Nyandoro37"); + mStrings.add("Samwel Nyandoro38"); + mStrings.add("Samwel Nyandoro39"); + mStrings.add("Samwel Nyandoro40"); + mStrings.add("Samwel Nyandoro41"); + mStrings.add("Samwel Nyandoro42"); + mStrings.add("Samwel Nyandoro43"); + mStrings.add("Samwel Nyandoro44"); + mStrings.add("Samwel Nyandoro45"); + mStrings.add("Samwel Nyandoro46"); + mStrings.add("Samwel Nyandoro48"); + mStrings.add("Samwel Nyandoro49"); + mStrings.add("Samwel Nyandoro50"); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_main, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + + //noinspection SimplifiableIfStatement + if (id == R.id.action_reset) { + mSearchableSpinner.setSelectedItem(0); + mSearchableSpinner1.setSelectedItem(0); + mSearchableSpinner2.setSelectedItem(0); + return true; + } + + return super.onOptionsItemSelected(item); + } +} diff --git a/app/src/main/java/com/searchablespinner/searchablespinner/SearchableSpinnerApp.java b/app/src/main/java/com/searchablespinner/searchablespinner/SearchableSpinnerApp.java new file mode 100644 index 0000000..caf2851 --- /dev/null +++ b/app/src/main/java/com/searchablespinner/searchablespinner/SearchableSpinnerApp.java @@ -0,0 +1,17 @@ +package com.searchablespinner.searchablespinner; + +import android.app.Application; + +import com.facebook.stetho.Stetho; + +/** + * Created by samwel nyandoro on 01/08/2022. + */ + +public class SearchableSpinnerApp extends Application { + @Override + public void onCreate() { + super.onCreate(); + Stetho.initializeWithDefaults(this); + } +} diff --git a/app/src/main/java/com/searchablespinner/searchablespinner/SimpleArrayListAdapter.java b/app/src/main/java/com/searchablespinner/searchablespinner/SimpleArrayListAdapter.java new file mode 100644 index 0000000..014dcc3 --- /dev/null +++ b/app/src/main/java/com/searchablespinner/searchablespinner/SimpleArrayListAdapter.java @@ -0,0 +1,162 @@ +package com.searchablespinner.searchablespinner; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Filter; +import android.widget.Filterable; +import android.widget.ImageView; +import android.widget.TextView; + +import com.amulyakhare.textdrawable.TextDrawable; +import com.amulyakhare.textdrawable.util.ColorGenerator; +import com.searchablespinner.searchspinnerlibrary.interfaces.ISpinnerSelectedView; + +import java.util.ArrayList; + + +/** + * Created by samwel nyandoro on 01/08/2022. + */ + +public class SimpleArrayListAdapter extends ArrayAdapter implements Filterable, ISpinnerSelectedView { + + private Context mContext; + private ArrayList mBackupStrings; + private ArrayList mStrings; + private StringFilter mStringFilter = new StringFilter(); + + public SimpleArrayListAdapter(Context context, ArrayList strings) { + super(context, R.layout.view_list_item); + mContext = context; + mStrings = strings; + mBackupStrings = strings; + } + + @Override + public int getCount() { + return mStrings == null ? 0 : mStrings.size() + 1; + } + + @Override + public String getItem(int position) { + if (mStrings != null && position > 0) + return mStrings.get(position - 1); + else + return null; + } + + @Override + public long getItemId(int position) { + if (mStrings == null && position > 0) + return mStrings.get(position).hashCode(); + else + return -1; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View view = null; + if (position == 0) { + view = getNoSelectionView(); + } else { + view = View.inflate(mContext, R.layout.view_list_item, null); + ImageView letters = view.findViewById(R.id.ImgVw_Letters); + TextView dispalyName = view.findViewById(R.id.TxtVw_DisplayName); + letters.setImageDrawable(getTextDrawable(mStrings.get(position - 1))); + dispalyName.setText(mStrings.get(position - 1)); + } + return view; + } + + @Override + public View getSelectedView(int position) { + View view = null; + if (position == 0) { + view = getNoSelectionView(); + } else { + view = View.inflate(mContext, R.layout.view_list_item, null); + ImageView letters = view.findViewById(R.id.ImgVw_Letters); + TextView dispalyName = view.findViewById(R.id.TxtVw_DisplayName); + letters.setImageDrawable(getTextDrawable(mStrings.get(position - 1))); + dispalyName.setText(mStrings.get(position - 1)); + } + return view; + } + + @Override + public View getNoSelectionView() { + View view = View.inflate(mContext, R.layout.view_list_no_selection_item, null); + return view; + } + + private TextDrawable getTextDrawable(String displayName) { + TextDrawable drawable = null; + if (!TextUtils.isEmpty(displayName)) { + int color2 = ColorGenerator.MATERIAL.getColor(displayName); + drawable = TextDrawable.builder() + .beginConfig() + .width(UiTools.dpToPx(mContext, 32)) + .height(UiTools.dpToPx(mContext, 32)) + .textColor(Color.WHITE) + .toUpperCase() + .endConfig() + .round() + .build(displayName.substring(0, 1), color2); + } else { + drawable = TextDrawable.builder() + .beginConfig() + .width(UiTools.dpToPx(mContext, 32)) + .height(UiTools.dpToPx(mContext, 32)) + .endConfig() + .round() + .build("?", Color.GRAY); + } + return drawable; + } + + @Override + public Filter getFilter() { + return mStringFilter; + } + + public enum ItemViewType { + ITEM, NO_SELECTION_ITEM + } + + public class StringFilter extends Filter { + + @Override + protected FilterResults performFiltering(CharSequence constraint) { + final FilterResults filterResults = new FilterResults(); + if (TextUtils.isEmpty(constraint)) { + filterResults.count = mBackupStrings.size(); + filterResults.values = mBackupStrings; + return filterResults; + } + final ArrayList filterStrings = new ArrayList<>(); + for (String text : mBackupStrings) { + if (text.toLowerCase().contains(constraint)) { + filterStrings.add(text); + } + } + filterResults.count = filterStrings.size(); + filterResults.values = filterStrings; + return filterResults; + } + + @Override + protected void publishResults(CharSequence constraint, FilterResults results) { + mStrings = (ArrayList) results.values; + notifyDataSetChanged(); + } + } + + private class ItemView { + public ImageView mImageView; + public TextView mTextView; + } +} diff --git a/app/src/main/java/com/searchablespinner/searchablespinner/SimpleListAdapter.java b/app/src/main/java/com/searchablespinner/searchablespinner/SimpleListAdapter.java new file mode 100644 index 0000000..df98668 --- /dev/null +++ b/app/src/main/java/com/searchablespinner/searchablespinner/SimpleListAdapter.java @@ -0,0 +1,160 @@ +package com.searchablespinner.searchablespinner; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.Filter; +import android.widget.Filterable; +import android.widget.ImageView; +import android.widget.TextView; + +import com.amulyakhare.textdrawable.TextDrawable; +import com.amulyakhare.textdrawable.util.ColorGenerator; +import com.searchablespinner.searchspinnerlibrary.interfaces.ISpinnerSelectedView; + +import java.util.ArrayList; + +/** + * Created by samwel nyandoro on 01/08/2022. + */ + +public class SimpleListAdapter extends BaseAdapter implements Filterable, ISpinnerSelectedView { + + private Context mContext; + private ArrayList mBackupStrings; + private ArrayList mStrings; + private StringFilter mStringFilter = new StringFilter(); + + public SimpleListAdapter(Context context, ArrayList strings) { + mContext = context; + mStrings = strings; + mBackupStrings = strings; + } + + @Override + public int getCount() { + return mStrings == null ? 0 : mStrings.size() + 1; + } + + @Override + public Object getItem(int position) { + if (mStrings != null && position > 0) + return mStrings.get(position - 1); + else + return null; + } + + @Override + public long getItemId(int position) { + if (mStrings == null && position > 0) + return mStrings.get(position).hashCode(); + else + return -1; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View view = null; + if (position == 0) { + view = getNoSelectionView(); + } else { + view = View.inflate(mContext, R.layout.view_list_item, null); + ImageView letters = view.findViewById(R.id.ImgVw_Letters); + TextView dispalyName = view.findViewById(R.id.TxtVw_DisplayName); + letters.setImageDrawable(getTextDrawable(mStrings.get(position - 1))); + dispalyName.setText(mStrings.get(position - 1)); + } + return view; + } + + @Override + public View getSelectedView(int position) { + View view = null; + if (position == 0) { + view = getNoSelectionView(); + } else { + view = View.inflate(mContext, R.layout.view_list_item, null); + ImageView letters = view.findViewById(R.id.ImgVw_Letters); + TextView dispalyName = view.findViewById(R.id.TxtVw_DisplayName); + letters.setImageDrawable(getTextDrawable(mStrings.get(position - 1))); + dispalyName.setText(mStrings.get(position - 1)); + } + return view; + } + + @Override + public View getNoSelectionView() { + View view = View.inflate(mContext, R.layout.view_list_no_selection_item, null); + return view; + } + + private TextDrawable getTextDrawable(String displayName) { + TextDrawable drawable = null; + if (!TextUtils.isEmpty(displayName)) { + int color2 = ColorGenerator.MATERIAL.getColor(displayName); + drawable = TextDrawable.builder() + .beginConfig() + .width(UiTools.dpToPx(mContext, 32)) + .height(UiTools.dpToPx(mContext, 32)) + .textColor(Color.WHITE) + .toUpperCase() + .endConfig() + .round() + .build(displayName.substring(0, 1), color2); + } else { + drawable = TextDrawable.builder() + .beginConfig() + .width(UiTools.dpToPx(mContext, 32)) + .height(UiTools.dpToPx(mContext, 32)) + .endConfig() + .round() + .build("?", Color.GRAY); + } + return drawable; + } + + @Override + public Filter getFilter() { + return mStringFilter; + } + + public enum ItemViewType { + ITEM, NO_SELECTION_ITEM + } + + public class StringFilter extends Filter { + + @Override + protected FilterResults performFiltering(CharSequence constraint) { + final FilterResults filterResults = new FilterResults(); + if (TextUtils.isEmpty(constraint)) { + filterResults.count = mBackupStrings.size(); + filterResults.values = mBackupStrings; + return filterResults; + } + final ArrayList filterStrings = new ArrayList<>(); + for (String text : mBackupStrings) { + if (text.toLowerCase().contains(constraint)) { + filterStrings.add(text); + } + } + filterResults.count = filterStrings.size(); + filterResults.values = filterStrings; + return filterResults; + } + + @Override + protected void publishResults(CharSequence constraint, FilterResults results) { + mStrings = (ArrayList) results.values; + notifyDataSetChanged(); + } + } + + private class ItemView { + public ImageView mImageView; + public TextView mTextView; + } +} diff --git a/app/src/main/java/com/searchablespinner/searchablespinner/UiTools.java b/app/src/main/java/com/searchablespinner/searchablespinner/UiTools.java new file mode 100644 index 0000000..776bbfb --- /dev/null +++ b/app/src/main/java/com/searchablespinner/searchablespinner/UiTools.java @@ -0,0 +1,11 @@ +package com.searchablespinner.searchablespinner; + +import android.content.Context; + +public class UiTools { + + public static int dpToPx(Context context, float dp) { + final float scale = context.getResources().getDisplayMetrics().density; + return Math.round(dp * scale); + } +} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..2c4e943 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml new file mode 100644 index 0000000..af49b44 --- /dev/null +++ b/app/src/main/res/layout/content_main.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/view_list_item.xml b/app/src/main/res/layout/view_list_item.xml new file mode 100644 index 0000000..47936c7 --- /dev/null +++ b/app/src/main/res/layout/view_list_item.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_list_no_selection_item.xml b/app/src/main/res/layout/view_list_no_selection_item.xml new file mode 100644 index 0000000..b569cf4 --- /dev/null +++ b/app/src/main/res/layout/view_list_no_selection_item.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml new file mode 100644 index 0000000..c1a49cb --- /dev/null +++ b/app/src/main/res/menu/menu_main.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000..c209e78 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000..b2dfe3d Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000..4f0f1d6 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000..62b611d Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000..948a307 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..1b9a695 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000..28d4b77 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9287f50 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000..aa7d642 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9126ae3 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..a11ac56 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,7 @@ + + + #3F51B5 + #303F9F + #FF4081 + #BDBDBD + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..59a0b0c --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,3 @@ + + 16dp + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..c45c27a --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,5 @@ + + SearchableSpinner + Reset + No Selection + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..545b9c6 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + +