From f358bc1fe19b3d75b7e4bbe66f9c6b156f90e002 Mon Sep 17 00:00:00 2001 From: Sebastian Seedorf Date: Thu, 17 Oct 2019 22:08:05 +0200 Subject: [PATCH] Canteens only for API 21 upwards, show canteen legend, added Rate button, made share button black --- .../java/de/sebse/fuplanner/MainActivity.java | 1 + .../fuplanner/fragments/CanteensAdapter.java | 47 ++++++---- .../fragments/canteen/MealAdapter.java | 23 +++-- .../fuplanner/tools/network/HTTPNetwork.java | 3 - .../fuplanner/tools/network/NukeSSLCerts.java | 45 +++++++++ .../tools/ui/TextViewDrawableSize.java | 92 +++++++++++++++++++ .../ic_share.xml} | 10 +- app/src/main/res/layout/list_all_no_items.xml | 1 + .../main/res/layout/list_canteen_legend.xml | 48 ++++++++++ .../main/res/menu/activity_main_drawer.xml | 2 +- .../res/menu/activity_main_drawer_login.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- .../res/values/attrs_expandable_card_view.xml | 9 ++ .../values/attrs_text_view_drawable_size.xml | 7 ++ .../values/{attrs.xml => attrs_week_view.xml} | 6 -- app/src/main/res/values/drawables.xml | 3 - app/src/main/res/values/strings.xml | 2 +- fuplanner.iml | 19 ++++ 18 files changed, 279 insertions(+), 43 deletions(-) create mode 100644 app/src/main/java/de/sebse/fuplanner/tools/network/NukeSSLCerts.java create mode 100644 app/src/main/java/de/sebse/fuplanner/tools/ui/TextViewDrawableSize.java rename app/src/main/res/{drawable-v21/ic_menu_share.xml => drawable/ic_share.xml} (79%) create mode 100644 app/src/main/res/layout/list_canteen_legend.xml create mode 100644 app/src/main/res/values/attrs_expandable_card_view.xml create mode 100644 app/src/main/res/values/attrs_text_view_drawable_size.xml rename app/src/main/res/values/{attrs.xml => attrs_week_view.xml} (92%) delete mode 100644 app/src/main/res/values/drawables.xml create mode 100644 fuplanner.iml diff --git a/app/src/main/java/de/sebse/fuplanner/MainActivity.java b/app/src/main/java/de/sebse/fuplanner/MainActivity.java index dc45048..9d7d28d 100644 --- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java +++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java @@ -69,6 +69,7 @@ import de.sebse.fuplanner.tools.Preferences; import de.sebse.fuplanner.tools.Regex; import de.sebse.fuplanner.tools.RequestPermissionsResultListener; import de.sebse.fuplanner.tools.logging.Logger; +import de.sebse.fuplanner.tools.network.NukeSSLCerts; import de.sebse.fuplanner.tools.types.News; public class MainActivity extends AppCompatActivity 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 3b99e5d..729481f 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/CanteensAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/CanteensAdapter.java @@ -1,5 +1,6 @@ package de.sebse.fuplanner.fragments; +import android.os.Build; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -10,13 +11,15 @@ import de.sebse.fuplanner.R; import de.sebse.fuplanner.fragments.CanteensFragment.OnCanteensFragmentInteractionListener; import de.sebse.fuplanner.services.canteen.types.Canteen; import de.sebse.fuplanner.services.canteen.types.Canteens; +import de.sebse.fuplanner.tools.ui.CustomViewHolder; import de.sebse.fuplanner.tools.ui.ItemViewHolder; +import de.sebse.fuplanner.tools.ui.StringViewHolder; /** * {@link RecyclerView.Adapter} that can display a {@link Canteen} and makes a call to the * specified {@link OnCanteensFragmentInteractionListener}. */ -class CanteensAdapter extends RecyclerView.Adapter { +class CanteensAdapter extends RecyclerView.Adapter { private Canteens mValues; private final OnCanteensFragmentInteractionListener mListener; @@ -33,32 +36,44 @@ class CanteensAdapter extends RecyclerView.Adapter { @NonNull @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.list_all_no_items, parent, false); + return new StringViewHolder(view); + } View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_all_items, parent, false); return new ItemViewHolder(view); } @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - if (mValues == null) - return; - Canteen canteen = mValues.get(holder.getAdapterPosition()); - holder.mTitle.setText(canteen.getName()); - holder.mSubLeft.setText(canteen.getAddress()); - holder.mSubRight.setText(canteen.getCity()); + public void onBindViewHolder(@NonNull CustomViewHolder holder, int position) { + if (holder instanceof StringViewHolder) { + ((StringViewHolder) holder).mString.setText(R.string.canteen_not_available); + } else if (holder instanceof ItemViewHolder) { + if (mValues == null) + return; + Canteen canteen = mValues.get(holder.getAdapterPosition()); + ((ItemViewHolder) holder).mTitle.setText(canteen.getName()); + ((ItemViewHolder) holder).mSubLeft.setText(canteen.getAddress()); + ((ItemViewHolder) holder).mSubRight.setText(canteen.getCity()); - holder.mView.setOnClickListener(v -> { - if (null != mListener) { - // Notify the active callbacks interface (the activity, if the - // fragment is attached to one) that an item has been selected. - mListener.onCanteensFragmentInteraction(canteen.getId()); - } - }); + holder.mView.setOnClickListener(v -> { + if (null != mListener) { + // Notify the active callbacks interface (the activity, if the + // fragment is attached to one) that an item has been selected. + mListener.onCanteensFragmentInteraction(canteen.getId()); + } + }); + } } @Override public int getItemCount() { + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { + return 1; + } if (mValues != null) { return mValues.size(); } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java index 23a0cfc..72cf331 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java @@ -27,6 +27,10 @@ class MealAdapter extends RecyclerView.Adapter { private final int CATEGORY_OTHER = R.string.others; private final ArrayList matches = new ArrayList<>(); + private static final int TYPE_MEAL = 0; + private static final int TYPE_HEADER = 1; + private static final int TYPE_LEGEND = 2; + private Day mDay = null; private final Context mContext; @@ -37,20 +41,25 @@ class MealAdapter extends RecyclerView.Adapter { @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { - if (viewType == 0) { + if (viewType == TYPE_MEAL) { View view = LayoutInflater.from(viewGroup.getContext()) .inflate(R.layout.list_canteen_items, viewGroup, false); return new MealViewHolder(view); - } else { + } else if (viewType == TYPE_HEADER) { View view = LayoutInflater.from(viewGroup.getContext()) .inflate(R.layout.list_all_caption, viewGroup, false); return new StringViewHolder(view); + } else { + View view = LayoutInflater.from(viewGroup.getContext()) + .inflate(R.layout.list_canteen_legend, viewGroup, false); + return new StringViewHolder(view); } } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { - if (holder.getItemViewType() == 0) { + position = position + 1; + if (holder.getItemViewType() == TYPE_MEAL) { MealViewHolder viewHolder = ((MealViewHolder) holder); viewHolder.reset(); Meal meal = getMeal(position); @@ -107,7 +116,7 @@ class MealAdapter extends RecyclerView.Adapter { viewHolder.mIconVegetarian.setVisibility(meal.getVegan() == Meal.VEGAN_VEGETARIAN ? View.VISIBLE : View.GONE); viewHolder.mIconBio.setVisibility((meal.getCertificates() & Meal.CERT_BIO) != 0 ? View.VISIBLE : View.GONE); viewHolder.mIconMsc.setVisibility((meal.getCertificates() & Meal.CERT_MSC) != 0 ? View.VISIBLE : View.GONE); - } else { + } else if (holder.getItemViewType() == TYPE_HEADER) { StringViewHolder viewHolder = ((StringViewHolder) holder); viewHolder.mString.setText(getHeading(position)); } @@ -115,12 +124,14 @@ class MealAdapter extends RecyclerView.Adapter { @Override public int getItemCount() { - return matches.size(); + return matches.size() + 1; } @Override public int getItemViewType(int position) { - return matches.get(position) instanceof String ? 1 : 0; + if (position == 0) + return TYPE_LEGEND; + return matches.get(position + 1) instanceof String ? TYPE_HEADER : TYPE_MEAL; } private Meal getMeal(int position) { diff --git a/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPNetwork.java b/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPNetwork.java index 90c7f48..bcdf58a 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPNetwork.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPNetwork.java @@ -1,7 +1,6 @@ package de.sebse.fuplanner.tools.network; import android.app.Service; -import android.content.Context; import android.content.Intent; import android.os.Binder; import android.os.IBinder; @@ -19,8 +18,6 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import androidx.annotation.Nullable; import de.sebse.fuplanner.tools.EventListener; diff --git a/app/src/main/java/de/sebse/fuplanner/tools/network/NukeSSLCerts.java b/app/src/main/java/de/sebse/fuplanner/tools/network/NukeSSLCerts.java new file mode 100644 index 0000000..a5f9aaf --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/tools/network/NukeSSLCerts.java @@ -0,0 +1,45 @@ +package de.sebse.fuplanner.tools.network; + +import java.security.SecureRandom; +import java.security.cert.X509Certificate; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +public class NukeSSLCerts { + protected static final String TAG = "NukeSSLCerts"; + + public static void nuke() { + try { + TrustManager[] trustAllCerts = new TrustManager[] { + new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { + X509Certificate[] myTrustedAnchors = new X509Certificate[0]; + return myTrustedAnchors; + } + + @Override + public void checkClientTrusted(X509Certificate[] certs, String authType) {} + + @Override + public void checkServerTrusted(X509Certificate[] certs, String authType) {} + } + }; + + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, trustAllCerts, new SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify(String arg0, SSLSession arg1) { + return true; + } + }); + } catch (Exception e) { + } + } +} \ No newline at end of file diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ui/TextViewDrawableSize.java b/app/src/main/java/de/sebse/fuplanner/tools/ui/TextViewDrawableSize.java new file mode 100644 index 0000000..2e67d91 --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/tools/ui/TextViewDrawableSize.java @@ -0,0 +1,92 @@ +package de.sebse.fuplanner.tools.ui; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; + +import androidx.appcompat.widget.AppCompatTextView; + +import de.sebse.fuplanner.R; + +public class TextViewDrawableSize extends AppCompatTextView { + + private int mDrawableWidth; + private int mDrawableHeight; + + public TextViewDrawableSize(Context context) { + super(context); + init(context, null, 0, 0); + } + + public TextViewDrawableSize(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs, 0, 0); + } + + public TextViewDrawableSize(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context, attrs, defStyleAttr, 0); + } + + /*@TargetApi(Build.VERSION_CODES.LOLLIPOP) + public TextViewDrawableSize(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr); + init(context, attrs, defStyleAttr); + //super(context, attrs, defStyleAttr, defStyleRes); + //init(context, attrs, defStyleAttr, defStyleRes); + }*/ + + private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.TextViewDrawableSize, defStyleAttr, defStyleRes); + + try { + mDrawableWidth = array.getDimensionPixelSize(R.styleable.TextViewDrawableSize_compoundDrawableWidth, -1); + mDrawableHeight = array.getDimensionPixelSize(R.styleable.TextViewDrawableSize_compoundDrawableHeight, -1); + } finally { + array.recycle(); + } + + if (mDrawableWidth > 0 || mDrawableHeight > 0) { + initCompoundDrawableSize(); + } + } + + private void initCompoundDrawableSize() { + Drawable[] drawables = getCompoundDrawables(); + for (Drawable drawable : drawables) { + if (drawable == null) { + continue; + } + + Rect realBounds = drawable.getBounds(); + float scaleFactor = realBounds.height() / (float) realBounds.width(); + + float drawableWidth = realBounds.width(); + float drawableHeight = realBounds.height(); + + if (mDrawableWidth > 0) { + // save scale factor of image + if (drawableWidth > mDrawableWidth) { + drawableWidth = mDrawableWidth; + drawableHeight = drawableWidth * scaleFactor; + } + } + if (mDrawableHeight > 0) { + // save scale factor of image + + if (drawableHeight > mDrawableHeight) { + drawableHeight = mDrawableHeight; + drawableWidth = drawableHeight / scaleFactor; + } + } + + realBounds.right = realBounds.left + Math.round(drawableWidth); + realBounds.bottom = realBounds.top + Math.round(drawableHeight); + + drawable.setBounds(realBounds); + } + setCompoundDrawables(drawables[0], drawables[1], drawables[2], drawables[3]); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/ic_menu_share.xml b/app/src/main/res/drawable/ic_share.xml similarity index 79% rename from app/src/main/res/drawable-v21/ic_menu_share.xml rename to app/src/main/res/drawable/ic_share.xml index a28fb9e..e3fe874 100644 --- a/app/src/main/res/drawable-v21/ic_menu_share.xml +++ b/app/src/main/res/drawable/ic_share.xml @@ -1,9 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z"/> diff --git a/app/src/main/res/layout/list_all_no_items.xml b/app/src/main/res/layout/list_all_no_items.xml index 919ec2f..d4a5140 100644 --- a/app/src/main/res/layout/list_all_no_items.xml +++ b/app/src/main/res/layout/list_all_no_items.xml @@ -5,6 +5,7 @@ android:orientation="horizontal"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index c1defa4..0337118 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -19,7 +19,7 @@ Tipps/Tricks Klicke ZURÜCK erneut zum Beenden! Sign in - Benutzername Passwort (optional) Log in @@ -115,4 +114,5 @@ Ein Netzwerkfehler ist aufgetreten! Ein Netzwerkfehler ist aufgetreten: %s! App bewerten! + Die Kantinenliste ist für Android 4 und darunter nicht verfügbar! \ No newline at end of file diff --git a/app/src/main/res/values/attrs_expandable_card_view.xml b/app/src/main/res/values/attrs_expandable_card_view.xml new file mode 100644 index 0000000..14e3caa --- /dev/null +++ b/app/src/main/res/values/attrs_expandable_card_view.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/main/res/values/attrs_text_view_drawable_size.xml b/app/src/main/res/values/attrs_text_view_drawable_size.xml new file mode 100644 index 0000000..95b1aec --- /dev/null +++ b/app/src/main/res/values/attrs_text_view_drawable_size.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs_week_view.xml similarity index 92% rename from app/src/main/res/values/attrs.xml rename to app/src/main/res/values/attrs_week_view.xml index c139a9b..3848982 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs_week_view.xml @@ -62,10 +62,4 @@ - - - - - - diff --git a/app/src/main/res/values/drawables.xml b/app/src/main/res/values/drawables.xml deleted file mode 100644 index 248b7a4..0000000 --- a/app/src/main/res/values/drawables.xml +++ /dev/null @@ -1,3 +0,0 @@ - - @android:drawable/ic_menu_share - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 29fdcff..cbeeba0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -94,7 +94,6 @@ Tips/Tricks Please click BACK again to exit! Sign in - Username Password (optional) Sign in or register @@ -123,4 +122,5 @@ A network error occurred! A network error occurred: %s! Rate the App! + The canteen list is not available for Android 4 and below! diff --git a/fuplanner.iml b/fuplanner.iml new file mode 100644 index 0000000..ad9da7c --- /dev/null +++ b/fuplanner.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file