diff --git a/app/src/main/java/de/sebse/fuplanner/MainActivity.java b/app/src/main/java/de/sebse/fuplanner/MainActivity.java index 6f6f55a..b53f245 100644 --- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java +++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java @@ -46,6 +46,7 @@ import de.sebse.fuplanner.fragments.NewsFragment; import de.sebse.fuplanner.fragments.PrefsFragment; import de.sebse.fuplanner.fragments.ScheduleFragment; import de.sebse.fuplanner.fragments.StartupFragment; +import de.sebse.fuplanner.fragments.canteen.CanteensAddFragment; import de.sebse.fuplanner.fragments.canteen.DaySwitcherFragment; import de.sebse.fuplanner.fragments.moddetails.ModDetailFragment; import de.sebse.fuplanner.services.canteen.CanteenBrowser; @@ -83,6 +84,7 @@ public class MainActivity extends AppCompatActivity public static final int FRAGMENT_SCHEDULE = 4; public static final int FRAGMENT_CANTEENS = 5; public static final int FRAGMENT_CANTEENS_DETAILS = 6; + public static final int FRAGMENT_CANTEENS_ADD = 9; public static final int FRAGMENT_PREFERENCES = 7; public static final int FRAGMENT_NEWS = 8; @@ -307,6 +309,8 @@ public class MainActivity extends AppCompatActivity } else { changeFragment(FRAGMENT_CANTEENS); } + } else if (mFragmentPage == FRAGMENT_CANTEENS_ADD) { + changeFragment(FRAGMENT_CANTEENS); } else if (kvv.account().isLoggedIn() && mFragmentPage != getDefaultFragmentAfterLogin()) { changeFragment(getDefaultFragmentAfterLogin()); } else { @@ -367,6 +371,10 @@ public class MainActivity extends AppCompatActivity } return true; } + if (id == R.id.add) { + changeFragment(FRAGMENT_CANTEENS_ADD); + return true; + } } return super.onOptionsItemSelected(item); @@ -547,6 +555,9 @@ public class MainActivity extends AppCompatActivity case FRAGMENT_CANTEENS_DETAILS: fragment = DaySwitcherFragment.newInstance(newData); break; + case FRAGMENT_CANTEENS_ADD: + fragment = CanteensAddFragment.newInstance(); + break; case FRAGMENT_CANTEENS: fragment = CanteensFragment.newInstance(); break; @@ -636,6 +647,7 @@ public class MainActivity extends AppCompatActivity }, log::e); return; case FRAGMENT_CANTEENS: + case FRAGMENT_CANTEENS_ADD: item = mNavigationView.getMenu().findItem(R.id.nav_canteens); break; case FRAGMENT_NEWS: @@ -698,7 +710,7 @@ public class MainActivity extends AppCompatActivity for (Canteen canteen: success) { MenuItem menuItem = mNavigationView.getMenu().add(Menu.NONE, Menu.NONE, 201 + i, canteen.getName()); menuItem.setOnMenuItemClickListener(item -> { - onCanteensFragmentInteraction(canteen.getId()); + this.onCanteensFragmentInteraction(canteen.getId()); return false; }); i++; @@ -787,6 +799,8 @@ public class MainActivity extends AppCompatActivity @Override public void onCanteenRefreshCompleted(boolean isFailed) { + if (!isFailed) + updateNavigation(); setRefreshFailedBanner(isFailed); } @@ -850,6 +864,8 @@ public class MainActivity extends AppCompatActivity @Override public void onKVVNetworkResponse(NetworkResponse error) { + if (error != null) + updateNavigation(); setRefreshFailedBanner(error != null); } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/CanteensAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/CanteensAdapter.java index b284aee..c6ac263 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/CanteensAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/CanteensAdapter.java @@ -69,13 +69,13 @@ class CanteensAdapter extends RecyclerView.Adapter { ((CanteensViewHolder) holder).mTitle.setText(canteen.getName()); ((CanteensViewHolder) holder).mSubLeft.setText(canteen.getAddress()); ((CanteensViewHolder) holder).mSubRight.setText(canteen.getCity()); - ((CanteensViewHolder) holder).mRemoveIcon.setVisibility(mIsShowDeletion ? View.VISIBLE : View.GONE); + ((CanteensViewHolder) holder).mActionIcon.setVisibility(mIsShowDeletion ? View.VISIBLE : View.GONE); if (mDeleteCanteenIds.contains(canteen.getId())) { - ((CanteensViewHolder) holder).mRemoveIcon.setImageDrawable(holder.mView.getResources().getDrawable(R.drawable.ic_remove_circle)); + ((CanteensViewHolder) holder).mActionIcon.setImageDrawable(holder.mView.getResources().getDrawable(R.drawable.ic_remove_circle)); } else { - ((CanteensViewHolder) holder).mRemoveIcon.setImageDrawable(holder.mView.getResources().getDrawable(R.drawable.ic_remove_circle_outline)); + ((CanteensViewHolder) holder).mActionIcon.setImageDrawable(holder.mView.getResources().getDrawable(R.drawable.ic_remove_circle_outline)); } - ((CanteensViewHolder) holder).mRemoveIcon.setOnClickListener(v -> { + ((CanteensViewHolder) holder).mActionIcon.setOnClickListener(v -> { if (mDeleteCanteenIds.contains(canteen.getId())) { // Prevent calling remove with index //noinspection SuspiciousMethodCalls diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/CanteensFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/CanteensFragment.java index 9a93d51..ed43cb9 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/CanteensFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/CanteensFragment.java @@ -114,7 +114,6 @@ public class CanteensFragment extends Fragment { } public void startDelete() { - log.d("start deletion"); adapter.startDeletion(items -> { int[] canteens = Preferences.getArrayInt(requireContext(), R.string.pref_canteen_selection); if (canteens != null) { @@ -138,12 +137,6 @@ public class CanteensFragment extends Fragment { } this.refresh(true); }); - /*int[] canteens = Preferences.getArrayInt(requireContext(), R.string.pref_canteen_selection); - int[] newCants = new int[canteens.length - 1]; - for (int i = 0; i < canteens.length - 1; i++) - newCants[i] = canteens[i]; - Preferences.setArrayInt(requireContext(), R.string.pref_canteen_selection, newCants); - this.refresh(true);*/ } public interface OnCanteensFragmentInteractionListener { diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/NewsFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/NewsFragment.java index d6aecc1..69c91f6 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/NewsFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/NewsFragment.java @@ -27,11 +27,6 @@ public class NewsFragment extends Fragment { private Logger log = new Logger(this); private MainActivityListener mListener; private NewsAdapter mAdapter; - private NewsList dates = new NewsList(); - // TODO: Rename parameter arguments, choose names that match - // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER - - // TODO: Rename and change types of parameters public NewsFragment() { diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/CanteensAddAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/CanteensAddAdapter.java new file mode 100644 index 0000000..f0fa633 --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/CanteensAddAdapter.java @@ -0,0 +1,108 @@ +package de.sebse.fuplanner.fragments.canteen; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.Arrays; + +import de.sebse.fuplanner.R; +import de.sebse.fuplanner.services.canteen.types.Canteen; +import de.sebse.fuplanner.services.canteen.types.Canteens; +import de.sebse.fuplanner.tools.Preferences; +import de.sebse.fuplanner.tools.logging.Logger; +import de.sebse.fuplanner.tools.ui.CanteensViewHolder; + +class CanteensAddAdapter extends RecyclerView.Adapter { + private int[] mElements; + private Canteens mCanteens = null; + @Nullable + private CanteenAddedInterface mCanteenAddedInterface; + private Canteens mValues = null; + private String mFilter = ""; + private final Context mContext; + Logger log = new Logger(this); + + public CanteensAddAdapter(Context context, @Nullable CanteenAddedInterface canteenAddedInterface) { + mCanteenAddedInterface = canteenAddedInterface; + mContext = context; + mElements = Preferences.getArrayInt(mContext, R.string.pref_canteen_selection); + } + + public void setFilterString(String filter) { + mFilter = filter; + this.update(); + } + + public void setCanteens(Canteens canteens) { + mCanteens = canteens; + this.update(); + } + + public void update() { + if (mCanteens == null || mFilter == null) { + mValues = null; + } else { + mValues = new Canteens(); + for (Canteen canteen : mCanteens) { + boolean found = false; + for (int element : mElements) { + if (element == canteen.getId()) { + found = true; + break; + } + } + if (!found && canteen.contains(mFilter)) { + mValues.addCanteen(canteen); + } + } + } + this.notifyDataSetChanged(); + } + + @NonNull + @Override + public CanteensViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.list_canteens_items, parent, false); + return new CanteensViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull CanteensViewHolder holder, int position) { + if (mValues == null) + return; + Canteen canteen = mValues.get(position); + holder.mTitle.setText(canteen.getName()); + holder.mSubLeft.setText(canteen.getAddress()); + holder.mSubRight.setText(canteen.getCity()); + holder.mActionIcon.setVisibility(View.VISIBLE); + holder.mActionIcon.setImageDrawable(holder.mView.getResources().getDrawable(R.drawable.ic_add_circle_outline)); + holder.mActionIcon.setOnClickListener(v -> { + mElements = Arrays.copyOf(mElements, mElements.length + 1); + mElements[mElements.length - 1] = canteen.getId(); + + Preferences.setArrayInt(mContext, R.string.pref_canteen_selection, mElements); + if (mCanteenAddedInterface != null) + mCanteenAddedInterface.onCanteenAdded(canteen.getId()); + update(); + }); + } + + @Override + public int getItemCount() { + if (mValues != null) { + return mValues.size(); + } + return 0; + } + + interface CanteenAddedInterface { + void onCanteenAdded(int canteenId); + } +} diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/CanteensAddFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/CanteensAddFragment.java new file mode 100644 index 0000000..128d03b --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/CanteensAddFragment.java @@ -0,0 +1,129 @@ +package de.sebse.fuplanner.fragments.canteen; + + +import android.content.Context; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import android.text.Editable; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; + +import de.sebse.fuplanner.MainActivity; +import de.sebse.fuplanner.R; +import de.sebse.fuplanner.services.canteen.CanteenBrowser; +import de.sebse.fuplanner.tools.MainActivityListener; +import de.sebse.fuplanner.tools.logging.Logger; + +/** + * A simple {@link Fragment} subclass. + */ +public class CanteensAddFragment extends Fragment implements CanteensAddAdapter.CanteenAddedInterface { + private CanteensAddAdapter adapter; + private SwipeRefreshLayout swipeLayout; + private MainActivityListener mMainActivityListener; + private final Logger log = new Logger(this); + + + public CanteensAddFragment() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @return A new instance of fragment CanteensAddFragment. + */ + // TODO: Rename and change types and number of parameters + public static CanteensAddFragment newInstance() { + CanteensAddFragment fragment = new CanteensAddFragment(); + Bundle args = new Bundle(); + fragment.setArguments(args); + return fragment; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View view = inflater.inflate(R.layout.fragment_canteens_add, container, false); + + // Set the adapter + Context context = view.getContext(); + RecyclerView recyclerView = view.findViewById(R.id.list); + recyclerView.setLayoutManager(new LinearLayoutManager(context)); + adapter = new CanteensAddAdapter(context, this); + recyclerView.setAdapter(adapter); + + // Getting SwipeContainerLayout + swipeLayout = view.findViewById(R.id.swipe_container); + // Adding Listener + swipeLayout.setOnRefreshListener(() -> refresh(true)); + refresh(false); + EditText searchBox = view.findViewById(R.id.search_box); + searchBox.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + adapter.setFilterString(charSequence.toString()); + } + + @Override + public void afterTextChanged(Editable editable) { + + } + }); + + return view; + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + if (context instanceof MainActivityListener) { + mMainActivityListener = (MainActivityListener) context; + mMainActivityListener.onTitleTextChange(R.string.canteens); + } else + throw new RuntimeException(context.toString() + " must implement MainActivityListener"); + } + + @Override + public void onDetach() { + super.onDetach(); + mMainActivityListener = null; + } + + private void refresh(boolean forceRefresh) { + if (getActivity() != null) { + CanteenBrowser browser = ((MainActivity) getActivity()).getCanteenBrowser(); + browser.getAvailableCanteens(success -> { + adapter.setCanteens(success); + swipeLayout.setRefreshing(false); + }, error -> { + log.e(error.toString()); + swipeLayout.setRefreshing(false); + }, forceRefresh); + } + } + + @Override + public void onCanteenAdded(int canteenId) { + if (getActivity() != null) { + CanteenBrowser browser = ((MainActivity) getActivity()).getCanteenBrowser(); + browser.getCanteens(success -> {}, error -> {}, true); + } + } +} diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherAdapter.java index 0f816f1..ffd545b 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherAdapter.java @@ -15,12 +15,12 @@ class DaySwitcherAdapter extends FragmentStatePagerAdapter { super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); } - public void setModule(Canteen canteen) { + public void setCanteen(Canteen canteen) { mCanteen = canteen; - this.setModule(); + this.setCanteen(); } - public void setModule() { + public void setCanteen() { this.notifyDataSetChanged(); } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherFragment.java index feac72f..f39df1a 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherFragment.java @@ -127,10 +127,10 @@ public class DaySwitcherFragment extends Fragment implements DaySwitcherListener browser.getCanteens(canteens -> { Canteen canteen = canteens.getCanteen(mCanteenId); canteen.cleanUpDays(); - adapterViewPager.setModule(canteen); + adapterViewPager.setCanteen(canteen); applyPageRequest(); browser.getCanteen(canteen, success -> { - adapterViewPager.setModule(); + adapterViewPager.setCanteen(); applyPageRequest(); if (callback != null) callback.onResponse(success); diff --git a/app/src/main/java/de/sebse/fuplanner/services/canteen/CanteenBrowser.java b/app/src/main/java/de/sebse/fuplanner/services/canteen/CanteenBrowser.java index 54abecc..7060a5c 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/canteen/CanteenBrowser.java +++ b/app/src/main/java/de/sebse/fuplanner/services/canteen/CanteenBrowser.java @@ -2,11 +2,13 @@ package de.sebse.fuplanner.services.canteen; import android.content.Context; +import org.jetbrains.annotations.NotNull; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; +import java.util.concurrent.atomic.AtomicInteger; import de.sebse.fuplanner.R; import de.sebse.fuplanner.services.canteen.types.Canteen; @@ -22,9 +24,11 @@ import de.sebse.fuplanner.tools.network.NetworkErrorCallback; public class CanteenBrowser extends HTTPService { private Canteens canteens; + private Canteens availableCanteens; private final AsyncQueue queue = new AsyncQueue(); private final Context context; private CanteenListener mListener; + private final double[][] canteenRoots = {{52.5508,13.4014}, {52.4438,13.2771}, {52.3926,13.0611}, {52.4781,13.5286}}; public CanteenBrowser(Context context) { super(context); @@ -87,23 +91,7 @@ public class CanteenBrowser extends HTTPService { } Canteens canteens = new Canteens(); try { - JSONArray json = new JSONArray(body); - - for (int i = 0; i < json.length(); i++) { - JSONObject canteen = json.getJSONObject(i); - int id = canteen.getInt("id"); - String name = canteen.getString("name"); - String city = canteen.getString("city"); - String address = canteen.getString("address"); - JSONArray coords = canteen.getJSONArray("coordinates"); - double lat = 0; - double lng = 0; - if (coords != null) { - lat = coords.getDouble(0); - lng = coords.getDouble(1); - } - canteens.addCanteen(id, name, city, address, lat, lng); - } + parseCanteens(body, canteens); } catch (JSONException e) { e.printStackTrace(); errorCallback.onError(new NetworkError(201102, 403, "Cannot parse canteen list!")); @@ -113,6 +101,88 @@ public class CanteenBrowser extends HTTPService { }, error -> errorCallback.onError(new NetworkError(201103, error.networkResponse.statusCode, "Cannot get canteen list!"))); } + + + + + + public void getAvailableCanteens(final NetworkCallback callback, final NetworkErrorCallback errorCallback) { + getAvailableCanteens(callback, errorCallback, false); + } + + public void getAvailableCanteens(final NetworkCallback callback, final NetworkErrorCallback errorCallback, boolean forceRefresh) { + queue.add("available", () -> { + if (this.availableCanteens != null && !forceRefresh) { + callback.onResponse(this.availableCanteens); + queue.next("available"); + return; + } + this.upgradeAvailableCanteens(success -> { + if (this.availableCanteens == null) + this.availableCanteens = success; + else + this.availableCanteens.update(success); + callback.onResponse(success); + queue.next("available"); + }, queue.check("available", errorCallback)); + }); + } + + private void upgradeAvailableCanteens(final NetworkCallback callback, final NetworkErrorCallback errorCallback) { + + AtomicInteger finishedCount = new AtomicInteger(); + Canteens canteens = new Canteens(); + + + // "https://openmensa.org/api/v2/canteens?near[lat]=52.449743&near[lng]=13.282245&near[dist]=50" + for (double[] root : canteenRoots) { + log.d("invoke", root[0], root[1]); + get(String.format("https://openmensa.org/api/v2/canteens?near[lat]=%s&near[lng]=%s&near[dist]=50", root[0], root[1]), null, response -> { + log.d("invoke response", root[0], root[1]); + String body = response.getParsed(); + if (body == null) { + errorCallback.onError(new NetworkError(201401, 403, "No canteen list retrieved!")); + return; + } + try { + parseCanteens(body, canteens); + } catch (JSONException e) { + e.printStackTrace(); + errorCallback.onError(new NetworkError(201402, 403, "Cannot parse canteen list!")); + return; + } + finishedCount.getAndIncrement(); + log.d("invoke increment", root[0], root[1], finishedCount.get(), this.canteenRoots.length); + if (finishedCount.get() == this.canteenRoots.length) { + + callback.onResponse(canteens); + } + }, error -> errorCallback.onError(new NetworkError(201403, error.networkResponse.statusCode, "Cannot get canteen list!"))); + } + } + + + + private void parseCanteens(@NotNull String body, @NotNull Canteens canteens) throws JSONException { + JSONArray json = new JSONArray(body); + + for (int i = 0; i < json.length(); i++) { + JSONObject canteen = json.getJSONObject(i); + int id = canteen.getInt("id"); + String name = canteen.getString("name"); + String city = canteen.getString("city"); + String address = canteen.getString("address"); + double lat = 0; + double lng = 0; + if (canteen.has("coordinates")) { + JSONArray coords = canteen.getJSONArray("coordinates"); + lat = coords.getDouble(0); + lng = coords.getDouble(1); + } + canteens.addCanteen(id, name, city, address, lat, lng); + } + } + public void getCanteen(Canteen canteen, final NetworkCallback callback, final NetworkErrorCallback errorCallback) { getCanteen(canteen, callback, errorCallback, false); } diff --git a/app/src/main/java/de/sebse/fuplanner/services/canteen/types/Canteen.java b/app/src/main/java/de/sebse/fuplanner/services/canteen/types/Canteen.java index a6d928b..6485304 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/canteen/types/Canteen.java +++ b/app/src/main/java/de/sebse/fuplanner/services/canteen/types/Canteen.java @@ -126,4 +126,12 @@ public class Canteen implements Serializable, Iterable { public String toString() { return id+": "+name+"\n"+list.toString()+"\n"; } + + public boolean contains(String searchString) { + return containsIgnoreCase(getName(), searchString) || containsIgnoreCase(getAddress(), searchString) || containsIgnoreCase(getCity(), searchString); + } + + private static boolean containsIgnoreCase(String str, String subString) { + return str.toLowerCase().contains(subString.toLowerCase()); + } } diff --git a/app/src/main/java/de/sebse/fuplanner/services/canteen/types/Canteens.java b/app/src/main/java/de/sebse/fuplanner/services/canteen/types/Canteens.java index d3ddfee..cded142 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/canteen/types/Canteens.java +++ b/app/src/main/java/de/sebse/fuplanner/services/canteen/types/Canteens.java @@ -25,7 +25,7 @@ public class Canteens implements Serializable, Iterable { addCanteen(canteen); } - private void addCanteen(Canteen canteen) { + public void addCanteen(Canteen canteen) { if (this.list.contains(canteen)) return; this.list.add(canteen); } diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ui/CanteensViewHolder.java b/app/src/main/java/de/sebse/fuplanner/tools/ui/CanteensViewHolder.java index 44086fd..81aca18 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/ui/CanteensViewHolder.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/ui/CanteensViewHolder.java @@ -6,10 +6,10 @@ import android.widget.ImageView; import de.sebse.fuplanner.R; public class CanteensViewHolder extends ItemViewHolder { - public final ImageView mRemoveIcon; + public final ImageView mActionIcon; public CanteensViewHolder(View view) { super(view); - mRemoveIcon = view.findViewById(R.id.remove_icon); + mActionIcon = view.findViewById(R.id.remove_icon); } } diff --git a/app/src/main/res/drawable/ic_add_circle_outline.xml b/app/src/main/res/drawable/ic_add_circle_outline.xml new file mode 100644 index 0000000..b4a5785 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_circle_outline.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/fragment_canteens_add.xml b/app/src/main/res/layout/fragment_canteens_add.xml new file mode 100644 index 0000000..d059894 --- /dev/null +++ b/app/src/main/res/layout/fragment_canteens_add.xml @@ -0,0 +1,35 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/options_canteens.xml b/app/src/main/res/menu/options_canteens.xml index 497ae58..918ac78 100644 --- a/app/src/main/res/menu/options_canteens.xml +++ b/app/src/main/res/menu/options_canteens.xml @@ -9,4 +9,8 @@ android:id="@+id/delete" android:title="@string/delete_items" app:showAsAction="never" /> + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d125604..0e2a92a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -117,4 +117,6 @@ Einträge zurücksetzen Einträge löschen Entrag entfernen + Kantinen hinzufügen + Suchen \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index da5ff6f..6bbfc16 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -125,4 +125,6 @@ Restore Defaults Delete Items Remove entry + Add Canteens + Search