FoodPlugin injection
This commit is contained in:
parent
4dbf199685
commit
c45b434647
|
@ -134,6 +134,7 @@ public class MainApp extends DaggerApplication {
|
||||||
@Inject DanaRv2Plugin danaRv2Plugin;
|
@Inject DanaRv2Plugin danaRv2Plugin;
|
||||||
@Inject DanaRKoreanPlugin danaRKoreanPlugin;
|
@Inject DanaRKoreanPlugin danaRKoreanPlugin;
|
||||||
@Inject DstHelperPlugin dstHelperPlugin;
|
@Inject DstHelperPlugin dstHelperPlugin;
|
||||||
|
@Inject FoodPlugin foodPlugin;
|
||||||
@Inject InsulinOrefFreePeakPlugin insulinOrefFreePeakPlugin;
|
@Inject InsulinOrefFreePeakPlugin insulinOrefFreePeakPlugin;
|
||||||
@Inject InsulinOrefRapidActingPlugin insulinOrefRapidActingPlugin;
|
@Inject InsulinOrefRapidActingPlugin insulinOrefRapidActingPlugin;
|
||||||
@Inject InsulinOrefUltraRapidActingPlugin insulinOrefUltraRapidActingPlugin;
|
@Inject InsulinOrefUltraRapidActingPlugin insulinOrefUltraRapidActingPlugin;
|
||||||
|
@ -260,7 +261,7 @@ public class MainApp extends DaggerApplication {
|
||||||
pluginsList.add(eversensePlugin);
|
pluginsList.add(eversensePlugin);
|
||||||
pluginsList.add(randomBgPlugin);
|
pluginsList.add(randomBgPlugin);
|
||||||
if (!Config.NSCLIENT) pluginsList.add(smsCommunicatorPlugin);
|
if (!Config.NSCLIENT) pluginsList.add(smsCommunicatorPlugin);
|
||||||
pluginsList.add(FoodPlugin.getPlugin());
|
pluginsList.add(foodPlugin);
|
||||||
|
|
||||||
pluginsList.add(wearPlugin);
|
pluginsList.add(wearPlugin);
|
||||||
pluginsList.add(statusLinePlugin);
|
pluginsList.add(statusLinePlugin);
|
||||||
|
|
|
@ -33,6 +33,7 @@ import info.nightscout.androidaps.plugins.treatments.TreatmentsFragment
|
||||||
import info.nightscout.androidaps.dialogs.WizardInfoDialog
|
import info.nightscout.androidaps.dialogs.WizardInfoDialog
|
||||||
import info.nightscout.androidaps.plugins.general.careportal.CareportalFragment
|
import info.nightscout.androidaps.plugins.general.careportal.CareportalFragment
|
||||||
import info.nightscout.androidaps.plugins.general.careportal.Dialogs.NewNSTreatmentDialog
|
import info.nightscout.androidaps.plugins.general.careportal.Dialogs.NewNSTreatmentDialog
|
||||||
|
import info.nightscout.androidaps.plugins.general.food.FoodFragment
|
||||||
import info.nightscout.androidaps.plugins.general.maintenance.MaintenanceFragment
|
import info.nightscout.androidaps.plugins.general.maintenance.MaintenanceFragment
|
||||||
import info.nightscout.androidaps.plugins.treatments.fragments.TreatmentsBolusFragment
|
import info.nightscout.androidaps.plugins.treatments.fragments.TreatmentsBolusFragment
|
||||||
import info.nightscout.androidaps.plugins.treatments.fragments.TreatmentsCareportalFragment
|
import info.nightscout.androidaps.plugins.treatments.fragments.TreatmentsCareportalFragment
|
||||||
|
@ -50,6 +51,7 @@ abstract class FragmentsModule {
|
||||||
@ContributesAndroidInjector abstract fun contributesCareportalFragment(): CareportalFragment
|
@ContributesAndroidInjector abstract fun contributesCareportalFragment(): CareportalFragment
|
||||||
@ContributesAndroidInjector abstract fun contributesConfigBuilderFragment(): ConfigBuilderFragment
|
@ContributesAndroidInjector abstract fun contributesConfigBuilderFragment(): ConfigBuilderFragment
|
||||||
@ContributesAndroidInjector abstract fun contributesDanaRFragment(): DanaRFragment
|
@ContributesAndroidInjector abstract fun contributesDanaRFragment(): DanaRFragment
|
||||||
|
@ContributesAndroidInjector abstract fun contributesFoodFragment(): FoodFragment
|
||||||
@ContributesAndroidInjector abstract fun contributesLocalProfileFragment(): LocalProfileFragment
|
@ContributesAndroidInjector abstract fun contributesLocalProfileFragment(): LocalProfileFragment
|
||||||
@ContributesAndroidInjector abstract fun contributesObjectivesFragment(): ObjectivesFragment
|
@ContributesAndroidInjector abstract fun contributesObjectivesFragment(): ObjectivesFragment
|
||||||
@ContributesAndroidInjector abstract fun contributesOpenAPSAMAFragment(): OpenAPSAMAFragment
|
@ContributesAndroidInjector abstract fun contributesOpenAPSAMAFragment(): OpenAPSAMAFragment
|
||||||
|
|
|
@ -1,285 +0,0 @@
|
||||||
package info.nightscout.androidaps.plugins.general.food;
|
|
||||||
|
|
||||||
import android.graphics.Paint;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.text.Editable;
|
|
||||||
import android.text.TextWatcher;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.ArrayAdapter;
|
|
||||||
import android.widget.EditText;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.MainApp;
|
|
||||||
import info.nightscout.androidaps.R;
|
|
||||||
import info.nightscout.androidaps.events.EventFoodDatabaseChanged;
|
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBus;
|
|
||||||
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload;
|
|
||||||
import info.nightscout.androidaps.utils.FabricPrivacy;
|
|
||||||
import info.nightscout.androidaps.utils.OKDialog;
|
|
||||||
import info.nightscout.androidaps.utils.SpinnerHelper;
|
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
|
||||||
import io.reactivex.disposables.CompositeDisposable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by mike on 16.10.2017.
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class FoodFragment extends Fragment {
|
|
||||||
private CompositeDisposable disposable = new CompositeDisposable();
|
|
||||||
|
|
||||||
private EditText filter;
|
|
||||||
private SpinnerHelper category;
|
|
||||||
private SpinnerHelper subcategory;
|
|
||||||
private RecyclerView recyclerView;
|
|
||||||
|
|
||||||
private List<Food> unfiltered;
|
|
||||||
private List<Food> filtered;
|
|
||||||
|
|
||||||
private final String EMPTY = MainApp.gs(R.string.none);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
|
||||||
Bundle savedInstanceState) {
|
|
||||||
View view = inflater.inflate(R.layout.food_fragment, container, false);
|
|
||||||
filter = view.findViewById(R.id.food_filter);
|
|
||||||
ImageView clearFilter = view.findViewById(R.id.food_clearfilter);
|
|
||||||
category = new SpinnerHelper(view.findViewById(R.id.food_category));
|
|
||||||
subcategory = new SpinnerHelper(view.findViewById(R.id.food_subcategory));
|
|
||||||
recyclerView = view.findViewById(R.id.food_recyclerview);
|
|
||||||
recyclerView.setHasFixedSize(true);
|
|
||||||
LinearLayoutManager llm = new LinearLayoutManager(view.getContext());
|
|
||||||
recyclerView.setLayoutManager(llm);
|
|
||||||
|
|
||||||
clearFilter.setOnClickListener(v -> {
|
|
||||||
filter.setText("");
|
|
||||||
category.setSelection(0);
|
|
||||||
subcategory.setSelection(0);
|
|
||||||
filterData();
|
|
||||||
});
|
|
||||||
|
|
||||||
category.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
|
||||||
@Override
|
|
||||||
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
|
||||||
fillSubcategories();
|
|
||||||
filterData();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onNothingSelected(AdapterView<?> parent) {
|
|
||||||
fillSubcategories();
|
|
||||||
filterData();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
subcategory.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
|
||||||
@Override
|
|
||||||
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
|
||||||
filterData();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onNothingSelected(AdapterView<?> parent) {
|
|
||||||
filterData();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
filter.addTextChangedListener(new TextWatcher() {
|
|
||||||
@Override
|
|
||||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
|
||||||
filterData();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void afterTextChanged(Editable s) {
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
RecyclerViewAdapter adapter = new RecyclerViewAdapter(FoodPlugin.getPlugin().getService().getFoodData());
|
|
||||||
recyclerView.setAdapter(adapter);
|
|
||||||
|
|
||||||
loadData();
|
|
||||||
fillCategories();
|
|
||||||
fillSubcategories();
|
|
||||||
filterData();
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public synchronized void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
disposable.add(RxBus.Companion.getINSTANCE()
|
|
||||||
.toObservable(EventFoodDatabaseChanged.class)
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
.subscribe(event -> updateGui(), FabricPrivacy::logException)
|
|
||||||
);
|
|
||||||
updateGui();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public synchronized void onPause() {
|
|
||||||
super.onPause();
|
|
||||||
disposable.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadData() {
|
|
||||||
unfiltered = FoodPlugin.getPlugin().getService().getFoodData();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void fillCategories() {
|
|
||||||
Set<CharSequence> catSet = new HashSet<>();
|
|
||||||
|
|
||||||
for (Food f : unfiltered) {
|
|
||||||
if (f.category != null && !f.category.equals(""))
|
|
||||||
catSet.add(f.category);
|
|
||||||
}
|
|
||||||
|
|
||||||
// make it unique
|
|
||||||
ArrayList<CharSequence> categories = new ArrayList<>(catSet);
|
|
||||||
categories.add(0, MainApp.gs(R.string.none));
|
|
||||||
|
|
||||||
ArrayAdapter<CharSequence> adapterCategories = new ArrayAdapter<>(getContext(),
|
|
||||||
R.layout.spinner_centered, categories);
|
|
||||||
category.setAdapter(adapterCategories);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void fillSubcategories() {
|
|
||||||
String categoryFilter = category.getSelectedItem().toString();
|
|
||||||
|
|
||||||
Set<CharSequence> subCatSet = new HashSet<>();
|
|
||||||
|
|
||||||
if (!categoryFilter.equals(EMPTY)) {
|
|
||||||
for (Food f : unfiltered) {
|
|
||||||
if (f.category != null && f.category.equals(categoryFilter))
|
|
||||||
if (f.subcategory != null && !f.subcategory.equals(""))
|
|
||||||
subCatSet.add(f.subcategory);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// make it unique
|
|
||||||
ArrayList<CharSequence> subcategories = new ArrayList<>(subCatSet);
|
|
||||||
subcategories.add(0, MainApp.gs(R.string.none));
|
|
||||||
|
|
||||||
ArrayAdapter<CharSequence> adapterSubcategories = new ArrayAdapter<>(getContext(),
|
|
||||||
R.layout.spinner_centered, subcategories);
|
|
||||||
subcategory.setAdapter(adapterSubcategories);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void filterData() {
|
|
||||||
String textFilter = filter.getText().toString();
|
|
||||||
String categoryFilter = category.getSelectedItem().toString();
|
|
||||||
String subcategoryFilter = subcategory.getSelectedItem().toString();
|
|
||||||
|
|
||||||
filtered = new ArrayList<>();
|
|
||||||
|
|
||||||
for (Food f : unfiltered) {
|
|
||||||
if (f.name == null || f.category == null || f.subcategory == null)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!subcategoryFilter.equals(EMPTY) && !f.subcategory.equals(subcategoryFilter))
|
|
||||||
continue;
|
|
||||||
if (!categoryFilter.equals(EMPTY) && !f.category.equals(categoryFilter))
|
|
||||||
continue;
|
|
||||||
if (!textFilter.equals("") && !f.name.toLowerCase().contains(textFilter.toLowerCase()))
|
|
||||||
continue;
|
|
||||||
filtered.add(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
updateGui();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void updateGui() {
|
|
||||||
recyclerView.swapAdapter(new FoodFragment.RecyclerViewAdapter(filtered), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.FoodsViewHolder> {
|
|
||||||
|
|
||||||
List<Food> foodList;
|
|
||||||
|
|
||||||
RecyclerViewAdapter(List<Food> foodList) {
|
|
||||||
this.foodList = foodList;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public FoodsViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
|
|
||||||
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.food_item, viewGroup, false);
|
|
||||||
return new FoodsViewHolder(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(FoodsViewHolder holder, int position) {
|
|
||||||
Food food = foodList.get(position);
|
|
||||||
holder.ns.setVisibility(food._id != null ? View.VISIBLE : View.GONE);
|
|
||||||
holder.name.setText(food.name);
|
|
||||||
holder.portion.setText(food.portion + food.units);
|
|
||||||
holder.carbs.setText(food.carbs + MainApp.gs(R.string.shortgramm));
|
|
||||||
holder.fat.setText(MainApp.gs(R.string.shortfat) + ": " + food.fat + MainApp.gs(R.string.shortgramm));
|
|
||||||
if (food.fat == 0)
|
|
||||||
holder.fat.setVisibility(View.INVISIBLE);
|
|
||||||
holder.protein.setText(MainApp.gs(R.string.shortprotein) + ": " + food.protein + MainApp.gs(R.string.shortgramm));
|
|
||||||
if (food.protein == 0)
|
|
||||||
holder.protein.setVisibility(View.INVISIBLE);
|
|
||||||
holder.energy.setText(MainApp.gs(R.string.shortenergy) + ": " + food.energy + MainApp.gs(R.string.shortkilojoul));
|
|
||||||
if (food.energy == 0)
|
|
||||||
holder.energy.setVisibility(View.INVISIBLE);
|
|
||||||
holder.remove.setTag(food);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return foodList.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
class FoodsViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
TextView name;
|
|
||||||
TextView portion;
|
|
||||||
TextView carbs;
|
|
||||||
TextView fat;
|
|
||||||
TextView protein;
|
|
||||||
TextView energy;
|
|
||||||
TextView ns;
|
|
||||||
TextView remove;
|
|
||||||
|
|
||||||
FoodsViewHolder(View itemView) {
|
|
||||||
super(itemView);
|
|
||||||
name = itemView.findViewById(R.id.food_name);
|
|
||||||
portion = itemView.findViewById(R.id.food_portion);
|
|
||||||
carbs = itemView.findViewById(R.id.food_carbs);
|
|
||||||
fat = itemView.findViewById(R.id.food_fat);
|
|
||||||
protein = itemView.findViewById(R.id.food_protein);
|
|
||||||
energy = itemView.findViewById(R.id.food_energy);
|
|
||||||
ns = itemView.findViewById(R.id.ns_sign);
|
|
||||||
remove = itemView.findViewById(R.id.food_remove);
|
|
||||||
remove.setOnClickListener(v -> {
|
|
||||||
final Food food = (Food) v.getTag();
|
|
||||||
OKDialog.showConfirmation(getContext(), MainApp.gs(R.string.confirmation), MainApp.gs(R.string.removerecord) + "\n" + food.name, (dialog, id) -> {
|
|
||||||
final String _id = food._id;
|
|
||||||
if (_id != null && !_id.equals("")) {
|
|
||||||
NSUpload.removeFoodFromNS(_id);
|
|
||||||
}
|
|
||||||
FoodPlugin.getPlugin().getService().delete(food);
|
|
||||||
}, null);
|
|
||||||
});
|
|
||||||
remove.setPaintFlags(remove.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,211 @@
|
||||||
|
package info.nightscout.androidaps.plugins.general.food
|
||||||
|
|
||||||
|
import android.content.DialogInterface
|
||||||
|
import android.graphics.Paint
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.text.Editable
|
||||||
|
import android.text.TextWatcher
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.AdapterView
|
||||||
|
import android.widget.ArrayAdapter
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import dagger.android.support.DaggerFragment
|
||||||
|
import info.nightscout.androidaps.R
|
||||||
|
import info.nightscout.androidaps.events.EventFoodDatabaseChanged
|
||||||
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
|
import info.nightscout.androidaps.plugins.general.food.FoodFragment.RecyclerViewAdapter.FoodsViewHolder
|
||||||
|
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
|
||||||
|
import info.nightscout.androidaps.utils.FabricPrivacy
|
||||||
|
import info.nightscout.androidaps.utils.OKDialog.showConfirmation
|
||||||
|
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||||
|
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||||
|
import io.reactivex.disposables.CompositeDisposable
|
||||||
|
import kotlinx.android.synthetic.main.food_fragment.*
|
||||||
|
import java.util.*
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class FoodFragment : DaggerFragment() {
|
||||||
|
|
||||||
|
@Inject lateinit var rxBus: RxBusWrapper
|
||||||
|
@Inject lateinit var resourceHelper: ResourceHelper
|
||||||
|
@Inject lateinit var foodPlugin: FoodPlugin
|
||||||
|
|
||||||
|
private val disposable = CompositeDisposable()
|
||||||
|
private lateinit var unfiltered: List<Food>
|
||||||
|
private lateinit var filtered: MutableList<Food>
|
||||||
|
|
||||||
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||||
|
return inflater.inflate(R.layout.food_fragment, container, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
|
food_recyclerview.setHasFixedSize(true)
|
||||||
|
food_recyclerview.setLayoutManager(LinearLayoutManager(view.context))
|
||||||
|
food_recyclerview.adapter = RecyclerViewAdapter(foodPlugin.service.foodData)
|
||||||
|
|
||||||
|
food_clearfilter.setOnClickListener {
|
||||||
|
food_filter.setText("")
|
||||||
|
food_category.setSelection(0)
|
||||||
|
food_subcategory.setSelection(0)
|
||||||
|
filterData()
|
||||||
|
}
|
||||||
|
food_category.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
|
||||||
|
override fun onItemSelected(parent: AdapterView<*>?, view: View, position: Int, id: Long) {
|
||||||
|
fillSubcategories()
|
||||||
|
filterData()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onNothingSelected(parent: AdapterView<*>?) {
|
||||||
|
fillSubcategories()
|
||||||
|
filterData()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
food_subcategory.setOnItemSelectedListener(object : AdapterView.OnItemSelectedListener {
|
||||||
|
override fun onItemSelected(parent: AdapterView<*>?, view: View, position: Int, id: Long) {
|
||||||
|
filterData()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onNothingSelected(parent: AdapterView<*>?) {
|
||||||
|
filterData()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
food_filter.addTextChangedListener(object : TextWatcher {
|
||||||
|
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
|
||||||
|
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
|
||||||
|
filterData()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun afterTextChanged(s: Editable) {}
|
||||||
|
})
|
||||||
|
loadData()
|
||||||
|
fillCategories()
|
||||||
|
fillSubcategories()
|
||||||
|
filterData()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Synchronized override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
disposable.add(rxBus
|
||||||
|
.toObservable(EventFoodDatabaseChanged::class.java)
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe({ updateGui() }) { FabricPrivacy.logException(it) }
|
||||||
|
)
|
||||||
|
updateGui()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Synchronized override fun onPause() {
|
||||||
|
super.onPause()
|
||||||
|
disposable.clear()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun loadData() {
|
||||||
|
unfiltered = foodPlugin.service.foodData
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun fillCategories() {
|
||||||
|
val catSet: MutableSet<CharSequence> = HashSet()
|
||||||
|
for (f in unfiltered) {
|
||||||
|
if (f.category != null && f.category != "") catSet.add(f.category)
|
||||||
|
}
|
||||||
|
// make it unique
|
||||||
|
val categories = ArrayList(catSet)
|
||||||
|
categories.add(0, resourceHelper.gs(R.string.none))
|
||||||
|
context?.let { context ->
|
||||||
|
val adapterCategories = ArrayAdapter(context, R.layout.spinner_centered, categories)
|
||||||
|
food_category.adapter = adapterCategories
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun fillSubcategories() {
|
||||||
|
val categoryFilter = food_category.selectedItem.toString()
|
||||||
|
val subCatSet: MutableSet<CharSequence> = HashSet()
|
||||||
|
if (categoryFilter != resourceHelper.gs(R.string.none)) {
|
||||||
|
for (f in unfiltered) {
|
||||||
|
if (f.category != null && f.category == categoryFilter) if (f.subcategory != null && f.subcategory != "") subCatSet.add(f.subcategory)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// make it unique
|
||||||
|
val subcategories = ArrayList(subCatSet)
|
||||||
|
subcategories.add(0, resourceHelper.gs(R.string.none))
|
||||||
|
context?.let { context ->
|
||||||
|
val adapterSubcategories = ArrayAdapter(context, R.layout.spinner_centered, subcategories)
|
||||||
|
food_subcategory.adapter = adapterSubcategories
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun filterData() {
|
||||||
|
val textFilter = food_filter.text.toString()
|
||||||
|
val categoryFilter = food_category.selectedItem.toString()
|
||||||
|
val subcategoryFilter = food_subcategory.selectedItem.toString()
|
||||||
|
val newfiltered = ArrayList<Food>()
|
||||||
|
for (f in unfiltered) {
|
||||||
|
if (f.name == null || f.category == null || f.subcategory == null) continue
|
||||||
|
if (subcategoryFilter != resourceHelper.gs(R.string.none) && f.subcategory != subcategoryFilter) continue
|
||||||
|
if (categoryFilter != resourceHelper.gs(R.string.none) && f.category != categoryFilter) continue
|
||||||
|
if (textFilter != "" && !f.name.toLowerCase(Locale.getDefault()).contains(textFilter.toLowerCase(Locale.getDefault()))) continue
|
||||||
|
newfiltered.add(f)
|
||||||
|
}
|
||||||
|
filtered = newfiltered
|
||||||
|
updateGui()
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun updateGui() {
|
||||||
|
food_recyclerview?.swapAdapter(RecyclerViewAdapter(filtered), true)
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class RecyclerViewAdapter internal constructor(var foodList: List<Food>) : RecyclerView.Adapter<FoodsViewHolder>() {
|
||||||
|
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): FoodsViewHolder {
|
||||||
|
val v = LayoutInflater.from(viewGroup.context).inflate(R.layout.food_item, viewGroup, false)
|
||||||
|
return FoodsViewHolder(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: FoodsViewHolder, position: Int) {
|
||||||
|
val food = foodList[position]
|
||||||
|
holder.ns.visibility = if (food._id != null) View.VISIBLE else View.GONE
|
||||||
|
holder.name.text = food.name
|
||||||
|
holder.portion.text = food.portion.toString() + food.units
|
||||||
|
holder.carbs.text = food.carbs.toString() + resourceHelper.gs(R.string.shortgramm)
|
||||||
|
holder.fat.text = resourceHelper.gs(R.string.shortfat) + ": " + food.fat + resourceHelper.gs(R.string.shortgramm)
|
||||||
|
if (food.fat == 0) holder.fat.visibility = View.INVISIBLE
|
||||||
|
holder.protein.text = resourceHelper.gs(R.string.shortprotein) + ": " + food.protein + resourceHelper.gs(R.string.shortgramm)
|
||||||
|
if (food.protein == 0) holder.protein.visibility = View.INVISIBLE
|
||||||
|
holder.energy.text = resourceHelper.gs(R.string.shortenergy) + ": " + food.energy + resourceHelper.gs(R.string.shortkilojoul)
|
||||||
|
if (food.energy == 0) holder.energy.visibility = View.INVISIBLE
|
||||||
|
holder.remove.tag = food
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItemCount(): Int = foodList.size
|
||||||
|
|
||||||
|
inner class FoodsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
||||||
|
var name: TextView = itemView.findViewById(R.id.food_name)
|
||||||
|
var portion: TextView = itemView.findViewById(R.id.food_portion)
|
||||||
|
var carbs: TextView = itemView.findViewById(R.id.food_carbs)
|
||||||
|
var fat: TextView = itemView.findViewById(R.id.food_fat)
|
||||||
|
var protein: TextView = itemView.findViewById(R.id.food_protein)
|
||||||
|
var energy: TextView = itemView.findViewById(R.id.food_energy)
|
||||||
|
var ns: TextView = itemView.findViewById(R.id.ns_sign)
|
||||||
|
var remove: TextView = itemView.findViewById(R.id.food_remove)
|
||||||
|
|
||||||
|
init {
|
||||||
|
remove.setOnClickListener { v: View ->
|
||||||
|
val food = v.tag as Food
|
||||||
|
activity?.let { activity ->
|
||||||
|
showConfirmation(activity, resourceHelper.gs(R.string.confirmation), resourceHelper.gs(R.string.removerecord) + "\n" + food.name, DialogInterface.OnClickListener { _: DialogInterface?, _: Int ->
|
||||||
|
if (food._id != null && food._id != "") {
|
||||||
|
NSUpload.removeFoodFromNS(food._id)
|
||||||
|
}
|
||||||
|
foodPlugin.service.delete(food)
|
||||||
|
}, null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
remove.paintFlags = remove.paintFlags or Paint.UNDERLINE_TEXT_FLAG
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,39 +0,0 @@
|
||||||
package info.nightscout.androidaps.plugins.general.food;
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.R;
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginDescription;
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by mike on 05.08.2016.
|
|
||||||
*/
|
|
||||||
public class FoodPlugin extends PluginBase {
|
|
||||||
|
|
||||||
private static FoodPlugin plugin = null;
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public static FoodPlugin getPlugin() {
|
|
||||||
if (plugin == null)
|
|
||||||
plugin = new FoodPlugin();
|
|
||||||
return plugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
private FoodService service;
|
|
||||||
|
|
||||||
private FoodPlugin() {
|
|
||||||
super(new PluginDescription()
|
|
||||||
.mainType(PluginType.GENERAL)
|
|
||||||
.fragmentClass(FoodFragment.class.getName())
|
|
||||||
.pluginName(R.string.food)
|
|
||||||
.shortName(R.string.food_short)
|
|
||||||
.description(R.string.description_food)
|
|
||||||
);
|
|
||||||
this.service = new FoodService();
|
|
||||||
}
|
|
||||||
|
|
||||||
public FoodService getService() {
|
|
||||||
return this.service;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
package info.nightscout.androidaps.plugins.general.food
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.R
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginBase
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginDescription
|
||||||
|
import info.nightscout.androidaps.interfaces.PluginType
|
||||||
|
import javax.inject.Inject
|
||||||
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
class FoodPlugin @Inject constructor() : PluginBase(PluginDescription()
|
||||||
|
.mainType(PluginType.GENERAL)
|
||||||
|
.fragmentClass(FoodFragment::class.java.name)
|
||||||
|
.pluginName(R.string.food)
|
||||||
|
.shortName(R.string.food_short)
|
||||||
|
.description(R.string.description_food)
|
||||||
|
) {
|
||||||
|
|
||||||
|
val service: FoodService = FoodService()
|
||||||
|
}
|
|
@ -22,6 +22,7 @@ class MaintenanceFragment : DaggerFragment() {
|
||||||
@Inject lateinit var mainApp: MainApp
|
@Inject lateinit var mainApp: MainApp
|
||||||
@Inject lateinit var resourceHelper: ResourceHelper
|
@Inject lateinit var resourceHelper: ResourceHelper
|
||||||
@Inject lateinit var treatmentsPlugin: TreatmentsPlugin
|
@Inject lateinit var treatmentsPlugin: TreatmentsPlugin
|
||||||
|
@Inject lateinit var foodPlugin: FoodPlugin
|
||||||
|
|
||||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||||
return inflater.inflate(R.layout.maintenance_fragment, container, false)
|
return inflater.inflate(R.layout.maintenance_fragment, container, false)
|
||||||
|
@ -37,7 +38,7 @@ class MaintenanceFragment : DaggerFragment() {
|
||||||
MainApp.getDbHelper().resetDatabases()
|
MainApp.getDbHelper().resetDatabases()
|
||||||
// should be handled by Plugin-Interface and
|
// should be handled by Plugin-Interface and
|
||||||
// additional service interface and plugin registry
|
// additional service interface and plugin registry
|
||||||
FoodPlugin.getPlugin().service.resetFood()
|
foodPlugin.service.resetFood()
|
||||||
treatmentsPlugin.service.resetTreatments()
|
treatmentsPlugin.service.resetTreatments()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue