Skip to content

Commit

Permalink
implemented categories search (#1467)
Browse files Browse the repository at this point in the history
  • Loading branch information
Vlad authored and teolemon committed Apr 22, 2018
1 parent 2d16125 commit 957c145
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 24 deletions.
10 changes: 8 additions & 2 deletions app/src/main/AndroidManifest.xml
Expand Up @@ -91,8 +91,6 @@

android:parentActivityName=".views.MainActivity"


android:screenOrientation="portrait">
android:screenOrientation="portrait">

<meta-data
Expand All @@ -117,10 +115,18 @@
</activity>
<activity
android:name=".views.category.activity.CategoryActivity"
android:launchMode="singleTop"
android:parentActivityName=".views.MainActivity">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>

<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".views.MainActivity" />
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
<activity android:name=".views.PrefManager"></activity>
<activity android:name=".views.WelcomeActivity"></activity>
Expand Down
@@ -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 {

Expand Down
@@ -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;

Expand All @@ -30,15 +36,21 @@ public class CategoryListFragment extends MvvmFragment<CategoryFragmentViewModel
CategoryFragmentViewModel viewModel;

private FragmentCategoryListBinding binding;
private MenuItem searchMenuItem;

public CategoryListFragment() {
// Required empty public constructor
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_category_list, container, false);
View rootView = inflater.inflate(R.layout.fragment_category_list, container, false);
fastScroller = rootView.findViewById(R.id.fast_scroller);
return rootView;
}
Expand All @@ -53,21 +65,46 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
binding.setViewModel(getViewModel());
fastScroller.setRecyclerView(binding.recycler);
binding.recycler.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
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;
Expand All @@ -76,7 +113,7 @@ protected CategoryFragmentViewModel getViewModel() {
@NonNull
@Override
protected FragmentComponent createComponent() {
return ((BaseActivity)getActivity()).getActivityComponent().plusFragmentComponent();
return ((BaseActivity) getActivity()).getActivityComponent().plusFragmentComponent();
}

@Override
Expand Down
Expand Up @@ -28,19 +28,21 @@

public class CategoryFragmentViewModel extends ViewModel {
private final IProductRepository repository;
private final ObservableField<List<CategoryName>> categories;
private final List<CategoryName> categories;
private final ObservableField<List<CategoryName>> 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<List<CategoryName>> getCategories() {
return categories;
public ObservableField<List<CategoryName>> getFilteredCategories() {
return filteredCategories;
}

public ObservableInt getShowProgress() {
Expand Down Expand Up @@ -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)));
Expand All @@ -97,4 +100,15 @@ public List<CategoryName> extractCategoriesNames(List<Category> categories) {
Collections.sort(categoryNames, (o1, o2) -> o1.getName().compareTo(o2.getName()));
return categoryNames;
}

public void searchCategories(String query) {
List<CategoryName> newFilteredCategories = new ArrayList<>();
for (CategoryName categoryName : categories) {
if (categoryName.getName().toLowerCase().startsWith(query)) {
newFilteredCategories.add(categoryName);
}
}

filteredCategories.set(newFilteredCategories);
}
}
2 changes: 1 addition & 1 deletion app/src/main/res/layout/fragment_category_list.xml
Expand Up @@ -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}" />


<openfoodfacts.github.scrachx.openfood.FastScroller
Expand Down

0 comments on commit 957c145

Please sign in to comment.