diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d62be6edc9d3..fa1fb749a556 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -91,8 +91,6 @@ android:parentActivityName=".views.MainActivity" - - android:screenOrientation="portrait"> android:screenOrientation="portrait"> + + + + + diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/category/activity/CategoryActivity.java b/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/category/activity/CategoryActivity.java index dc144ec9e355..b70b32a3c7f8 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/category/activity/CategoryActivity.java +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/category/activity/CategoryActivity.java @@ -1,27 +1,19 @@ package openfoodfacts.github.scrachx.openfood.views.category.activity; -import android.Manifest; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; -import android.content.pm.PackageManager; import android.hardware.Sensor; import android.hardware.SensorManager; import android.os.Bundle; import android.preference.PreferenceManager; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; import android.view.View; -import com.afollestad.materialdialogs.MaterialDialog; - import openfoodfacts.github.scrachx.openfood.R; import openfoodfacts.github.scrachx.openfood.utils.ShakeDetector; import openfoodfacts.github.scrachx.openfood.utils.Utils; import openfoodfacts.github.scrachx.openfood.views.BaseActivity; -import openfoodfacts.github.scrachx.openfood.views.MainActivity; -import openfoodfacts.github.scrachx.openfood.views.ScannerFragmentActivity; public class CategoryActivity extends BaseActivity { diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/category/fragment/CategoryListFragment.java b/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/category/fragment/CategoryListFragment.java index 3a661c564064..63d94b4fb5a7 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/category/fragment/CategoryListFragment.java +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/category/fragment/CategoryListFragment.java @@ -1,13 +1,19 @@ package openfoodfacts.github.scrachx.openfood.views.category.fragment; +import android.app.SearchManager; +import android.content.Context; import android.databinding.DataBindingUtil; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.SearchView; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; @@ -30,15 +36,21 @@ public class CategoryListFragment extends MvvmFragment { - if(binding.getViewModel().getCategories().get().isEmpty()){ + if (binding.getViewModel().getFilteredCategories().get().isEmpty()) { fastScroller.setVisibility(View.GONE); - } - else { + } else { fastScroller.setVisibility(View.VISIBLE); // check for an empty item in the start of the list - if(viewModel.getCategories().get().get(0).getName().isEmpty()){ - viewModel.getCategories().get().remove(0); + if (viewModel.getFilteredCategories().get().get(0).getName().isEmpty()) { + viewModel.getFilteredCategories().get().remove(0); binding.recycler.getAdapter().notifyItemRemoved(0); - binding.recycler.getAdapter().notifyItemRangeChanged(0,binding.recycler.getAdapter().getItemCount()); + binding.recycler.getAdapter().notifyItemRangeChanged(0, binding.recycler.getAdapter().getItemCount()); } } }); } + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.menu_main, menu); + + SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE); + searchMenuItem = menu.findItem(R.id.action_search); + SearchView searchView = (SearchView) searchMenuItem.getActionView(); + if (searchManager.getSearchableInfo(getActivity().getComponentName()) != null) { + searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName())); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String query) { + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + viewModel.searchCategories(newText.toLowerCase()); + return false; + } + }); + } + + super.onCreateOptionsMenu(menu, inflater); + } + @Override protected CategoryFragmentViewModel getViewModel() { return viewModel; @@ -76,7 +113,7 @@ protected CategoryFragmentViewModel getViewModel() { @NonNull @Override protected FragmentComponent createComponent() { - return ((BaseActivity)getActivity()).getActivityComponent().plusFragmentComponent(); + return ((BaseActivity) getActivity()).getActivityComponent().plusFragmentComponent(); } @Override diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/viewmodel/category/CategoryFragmentViewModel.java b/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/viewmodel/category/CategoryFragmentViewModel.java index fdda5f5fc076..d1530c00699b 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/viewmodel/category/CategoryFragmentViewModel.java +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/viewmodel/category/CategoryFragmentViewModel.java @@ -28,19 +28,21 @@ public class CategoryFragmentViewModel extends ViewModel { private final IProductRepository repository; - private final ObservableField> categories; + private final List categories; + private final ObservableField> filteredCategories; private final ObservableInt showProgress; private final String languageCode; public CategoryFragmentViewModel() { this.repository = ProductRepository.getInstance(); - this.categories = new ObservableField<>(Collections.emptyList()); + this.categories = new ArrayList<>(); + this.filteredCategories = new ObservableField<>(Collections.emptyList()); this.showProgress = new ObservableInt(View.VISIBLE); this.languageCode = Locale.getDefault().getLanguage(); } - public ObservableField> getCategories() { - return categories; + public ObservableField> getFilteredCategories() { + return filteredCategories; } public ObservableInt getShowProgress() { @@ -71,7 +73,8 @@ protected void subscribe(@NonNull CompositeDisposable subscriptions) { .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(categoryList -> { - categories.set(categoryList); + categories.addAll(categoryList); + filteredCategories.set(categoryList); showProgress.set(View.GONE); }, throwable -> Log.e(CategoryFragmentViewModel.class.getCanonicalName(), "Error loading categories", throwable))); @@ -97,4 +100,15 @@ public List extractCategoriesNames(List categories) { Collections.sort(categoryNames, (o1, o2) -> o1.getName().compareTo(o2.getName())); return categoryNames; } + + public void searchCategories(String query) { + List newFilteredCategories = new ArrayList<>(); + for (CategoryName categoryName : categories) { + if (categoryName.getName().toLowerCase().startsWith(query)) { + newFilteredCategories.add(categoryName); + } + } + + filteredCategories.set(newFilteredCategories); + } } diff --git a/app/src/main/res/layout/fragment_category_list.xml b/app/src/main/res/layout/fragment_category_list.xml index 426c7a0a1b0f..be5e3906e44f 100644 --- a/app/src/main/res/layout/fragment_category_list.xml +++ b/app/src/main/res/layout/fragment_category_list.xml @@ -21,7 +21,7 @@ android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="match_parent" - app:categories="@{viewModel.categories}" /> + app:categories="@{viewModel.filteredCategories}" />