From da01730c73cee713c6196cd3b5271535fc0884a7 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Tue, 2 Aug 2022 22:14:20 +0200 Subject: [PATCH] View activity refactor with previous/next (#937) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Implement new bottom bar in card view with previous/next - Refactor info sheet into info button in new bottom bar - Make fav icon mutable before tinting, add prev/next transitions - Update metadata Co-authored-by: Allan Nordhøy Co-authored-by: Katharine Chui --- CHANGELOG.md | 4 + .../card_locker/LoyaltyCardViewActivity.java | 513 +++++++++--------- .../protect/card_locker/MainActivity.java | 25 +- app/src/main/res/anim/slide_in_left.xml | 10 + app/src/main/res/anim/slide_in_right.xml | 10 + app/src/main/res/anim/slide_out_left.xml | 10 + app/src/main/res/anim/slide_out_right.xml | 10 + .../drawable/ic_baseline_chevron_left_24.xml | 5 + .../drawable/ic_baseline_chevron_right_24.xml | 5 + .../main/res/drawable/ic_baseline_info_24.xml | 5 + .../res/layout/loyalty_card_view_layout.xml | 433 +++++++-------- app/src/main/res/values-he-rIL/strings.xml | 1 - app/src/main/res/values/strings.xml | 4 +- .../LoyaltyCardViewActivityTest.java | 19 +- .../images/phoneScreenshots/screenshot-04.png | Bin 60133 -> 60671 bytes .../images/phoneScreenshots/screenshot-08.png | Bin 59877 -> 59619 bytes 16 files changed, 547 insertions(+), 507 deletions(-) create mode 100644 app/src/main/res/anim/slide_in_left.xml create mode 100644 app/src/main/res/anim/slide_in_right.xml create mode 100644 app/src/main/res/anim/slide_out_left.xml create mode 100644 app/src/main/res/anim/slide_out_right.xml create mode 100644 app/src/main/res/drawable/ic_baseline_chevron_left_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_chevron_right_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_info_24.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a86338cb..2f61f4dc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased - 113 + +- Add previous and next buttons to the loyalty card view + ## v2.18.2 - 112 - Make the possibility to set a custom header more visible diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index f7fabce78..e18f815fc 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -8,10 +8,15 @@ import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.Outline; +import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; +import android.text.SpannableStringBuilder; +import android.text.Spanned; import android.text.TextUtils; +import android.text.style.ForegroundColorSpan; +import android.text.util.Linkify; import android.util.Log; import android.util.TypedValue; import android.view.GestureDetector; @@ -19,7 +24,6 @@ import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; import android.view.ViewOutlineProvider; import android.view.ViewTreeObserver; import android.view.Window; @@ -31,8 +35,23 @@ import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.content.res.AppCompatResources; +import androidx.appcompat.widget.AppCompatTextView; +import androidx.appcompat.widget.Toolbar; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.constraintlayout.widget.Guideline; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.BlendModeColorFilterCompat; +import androidx.core.graphics.BlendModeCompat; +import androidx.core.graphics.ColorUtils; +import androidx.core.graphics.drawable.DrawableCompat; +import androidx.core.widget.TextViewCompat; + import com.google.android.material.appbar.AppBarLayout; -import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.google.android.material.bottomappbar.BottomAppBar; import com.google.android.material.color.MaterialColors; import com.google.android.material.floatingactionbutton.FloatingActionButton; @@ -43,20 +62,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import androidx.annotation.NonNull; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.content.res.AppCompatResources; -import androidx.appcompat.widget.AppCompatTextView; -import androidx.appcompat.widget.Toolbar; -import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.constraintlayout.widget.Guideline; -import androidx.coordinatorlayout.widget.CoordinatorLayout; -import androidx.core.content.ContextCompat; -import androidx.core.graphics.ColorUtils; -import androidx.core.graphics.drawable.DrawableCompat; -import androidx.core.widget.NestedScrollView; -import androidx.core.widget.TextViewCompat; import protect.card_locker.async.TaskHandler; import protect.card_locker.preferences.Settings; @@ -68,14 +73,10 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements CoordinatorLayout coordinatorLayout; ConstraintLayout mainLayout; TextView cardIdFieldView; - BottomSheetBehavior behavior; - LinearLayout bottomSheet; - NestedScrollView bottomSheetContentWrapper; - ImageView bottomSheetButton; - TextView noteView; - TextView groupsView; - TextView balanceView; - TextView expiryView; + BottomAppBar bottomAppBar; + ImageButton bottomAppBarInfoButton; + ImageButton bottomAppBarPreviousButton; + ImageButton bottomAppBarNextButton; AppCompatTextView storeName; ImageButton maximizeButton; ImageView mainImage; @@ -84,10 +85,14 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements View collapsingToolbarLayout; AppBarLayout appBarLayout; ImageView iconImage; + Toolbar portraitToolbar; Toolbar landscapeToolbar; int loyaltyCardId; + ArrayList cardList; + LoyaltyCard loyaltyCard; + List loyaltyCardGroups; boolean rotationEnabled; SQLiteDatabase database; ImportURIHelper importURIHelper; @@ -113,11 +118,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements private ImageView[] dots; boolean isBarcodeSupported = true; - int bottomSheetState; - static final String STATE_IMAGEINDEX = "imageIndex"; static final String STATE_FULLSCREEN = "isFullscreen"; - static final String STATE_BOTTOMSHEET = "bottomSheetState"; private final int HEADER_FILTER_ALPHA = 127; @@ -207,6 +209,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements private void extractIntentFields(Intent intent) { final Bundle b = intent.getExtras(); loyaltyCardId = b != null ? b.getInt("id") : 0; + cardList = b != null ? b.getIntegerArrayList("cardList") : null; Log.d(TAG, "View activity: id=" + loyaltyCardId); } @@ -227,6 +230,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements Drawable unwrappedIcon = AppCompatResources.getDrawable(this, icon); assert unwrappedIcon != null; Drawable wrappedIcon = DrawableCompat.wrap(unwrappedIcon); + wrappedIcon.mutate(); if (dark) { DrawableCompat.setTint(wrappedIcon, Color.BLACK); } else { @@ -249,6 +253,18 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements @Override protected void onCreate(Bundle savedInstanceState) { + if (savedInstanceState == null) { + Intent incomingIntent = getIntent(); + int transitionRight = incomingIntent.getExtras().getInt("transition_right", -1); + if (transitionRight == 1) { + // right side transition + overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left); + } else if (transitionRight == 0) { + // left side transition + overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right); + } + } + super.onCreate(savedInstanceState); settings = new Settings(this); @@ -267,10 +283,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements if (savedInstanceState != null) { mainImageIndex = savedInstanceState.getInt(STATE_IMAGEINDEX); isFullscreen = savedInstanceState.getBoolean(STATE_FULLSCREEN); - bottomSheetState = savedInstanceState.getInt(STATE_BOTTOMSHEET); } - extractIntentFields(getIntent()); setContentView(R.layout.loyalty_card_view_layout); @@ -281,13 +295,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements coordinatorLayout = findViewById(R.id.coordinator_layout); mainLayout = findViewById(R.id.mainLayout); cardIdFieldView = findViewById(R.id.cardIdView); - bottomSheet = findViewById(R.id.bottom_sheet); - bottomSheetContentWrapper = findViewById(R.id.bottomSheetContentWrapper); - bottomSheetButton = findViewById(R.id.bottomSheetButton); - noteView = findViewById(R.id.noteView); - groupsView = findViewById(R.id.groupsView); - balanceView = findViewById(R.id.balanceView); - expiryView = findViewById(R.id.expiryView); storeName = findViewById(R.id.storeName); maximizeButton = findViewById(R.id.maximizeButton); mainImage = findViewById(R.id.mainImage); @@ -296,9 +303,15 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements minimizeButton = findViewById(R.id.minimizeButton); collapsingToolbarLayout = findViewById(R.id.collapsingToolbarLayout); appBarLayout = findViewById(R.id.app_bar_layout); + bottomAppBar = findViewById(R.id.bottom_app_bar); iconImage = findViewById(R.id.icon_image); + portraitToolbar = findViewById(R.id.toolbar); landscapeToolbar = findViewById(R.id.toolbar_landscape); + bottomAppBarInfoButton = findViewById(R.id.button_show_info); + bottomAppBarPreviousButton = findViewById(R.id.button_previous); + bottomAppBarNextButton = findViewById(R.id.button_next); + barcodeImageGenerationFinishedCallback = () -> { if (!(boolean) mainImage.getTag()) { mainImage.setVisibility(View.GONE); @@ -363,33 +376,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements }); editButton.bringToFront(); - behavior = BottomSheetBehavior.from(bottomSheet); - behavior.addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { - @Override - public void onStateChanged(@NonNull View bottomSheet, int newState) { - changeUiToBottomSheetState(newState); - } - - @Override - public void onSlide(@NonNull View bottomSheet, float slideOffset) { - } - }); - - bottomSheetButton.setOnClickListener(v -> { - if (behavior.getState() == BottomSheetBehavior.STATE_EXPANDED) { - behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); - } else { - behavior.setState(BottomSheetBehavior.STATE_EXPANDED); - } - }); - - appBarLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { - @Override - public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { - adjustLayoutHeights(); - } - }); - appBarLayout.setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { @@ -398,61 +384,144 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements } }); + bottomAppBarInfoButton.setOnClickListener(view -> showInfoDialog()); + bottomAppBarPreviousButton.setOnClickListener(view -> prevNextCard(false)); + bottomAppBarNextButton.setOnClickListener(view -> prevNextCard(true)); + mGestureDetector = new GestureDetector(this, this); View.OnTouchListener gestureTouchListener = (v, event) -> mGestureDetector.onTouchEvent(event); mainImage.setOnTouchListener(gestureTouchListener); - } - private void changeUiToBottomSheetState(int newState) { - if (newState == BottomSheetBehavior.STATE_DRAGGING) { - editButton.hide(); - } else if (newState == BottomSheetBehavior.STATE_EXPANDED) { - bottomSheetButton.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24); - bottomSheetButton.setContentDescription(getString(R.string.hideMoreInfo)); - mainLayout.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS); - editButton.hide(); - } else if (newState == BottomSheetBehavior.STATE_COLLAPSED) { - bottomSheetButton.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24); - bottomSheetButton.setContentDescription(getString(R.string.showMoreInfo)); - mainLayout.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO); - if (!isFullscreen) { - editButton.show(); - } - - // Scroll bottomsheet content back to top - bottomSheetContentWrapper.setScrollY(0); - } - bottomSheetState = newState; - } - - private void adjustLayoutHeights() { - // use getLayoutParams instead of getHeight when heights are pre-determined in xml! getHeight could return 0 if a View is not inflated - if (appBarLayout.getHeight() != 0 && iconImage.getLayoutParams().height != appBarLayout.getHeight()) { - Log.d("adjustLayoutHeights", "setting imageIcon height from: " + iconImage.getLayoutParams().height + " to: " + appBarLayout.getHeight()); - iconImage.setLayoutParams(new CoordinatorLayout.LayoutParams( - CoordinatorLayout.LayoutParams.MATCH_PARENT, appBarLayout.getHeight()) - ); - } - int bottomSheetHeight = getResources().getDisplayMetrics().heightPixels - appBarLayout.getHeight() - bottomSheetButton.getLayoutParams().height; - ViewGroup.LayoutParams params = bottomSheetContentWrapper.getLayoutParams(); - if (params.height != bottomSheetHeight || params.width != LinearLayout.LayoutParams.MATCH_PARENT) { - // XXX android 5 - 9 has so much quirks with setting bottomSheetContent height - // just invalidate the wrapper works on 10 onward - // bottomSheetContentWrapper.invalidate(); - // The below worked on android 5 but not 6, reloading the card then it breaks again on 6, entirely random :( - // for (int i = 0; i < bottomSheetContentWrapper.getChildCount(); i++) { - // bottomSheetContentWrapper.getChildAt(i).invalidate(); - // } - // since it's basically allergic to getting enlarged then shrunk again, and setting it at all when fullscreen makes no sense - if (!isFullscreen) { - Log.d("adjustLayoutHeights", "setting bottomSheet height from: " + params.height + " to: " + bottomSheetHeight); - bottomSheetContentWrapper.setLayoutParams( - new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, bottomSheetHeight) + appBarLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { + iconImage.setLayoutParams(new CoordinatorLayout.LayoutParams( + CoordinatorLayout.LayoutParams.MATCH_PARENT, appBarLayout.getHeight()) ); + iconImage.setClipBounds(new Rect(left, top, right, bottom)); } + }); + } + + private SpannableStringBuilder padSpannableString(SpannableStringBuilder spannableStringBuilder) { + if (spannableStringBuilder.length() > 0) { + spannableStringBuilder.append("\n\n"); + } + + return spannableStringBuilder; + } + + private boolean hasBalance(LoyaltyCard loyaltyCard) { + return !loyaltyCard.balance.equals(new BigDecimal(0)); + } + + private void showInfoDialog() { + AlertDialog.Builder infoDialog = new AlertDialog.Builder(this); + + TextView infoTitleView = new TextView(this); + infoTitleView.setPadding(20, 20, 20, 20); + infoTitleView.setTextSize(settings.getFontSizeMax(settings.getMediumFont())); + infoTitleView.setText(loyaltyCard.store); + infoDialog.setCustomTitle(infoTitleView); + infoDialog.setTitle(loyaltyCard.store); + + TextView infoTextview = new TextView(this); + infoTextview.setPadding(20, 0, 20, 0); + infoTextview.setAutoLinkMask(Linkify.ALL); + infoTextview.setTextIsSelectable(true); + + SpannableStringBuilder infoText = new SpannableStringBuilder(); + if (!loyaltyCard.note.isEmpty()) { + infoText.append(loyaltyCard.note); + } + + if (loyaltyCardGroups.size() > 0) { + List groupNames = new ArrayList<>(); + for (Group group : loyaltyCardGroups) { + groupNames.add(group._id); + } + + padSpannableString(infoText); + infoText.append(getString(R.string.groupsList, TextUtils.join(", ", groupNames))); + } + + if (hasBalance(loyaltyCard)) { + padSpannableString(infoText); + infoText.append(getString(R.string.balanceSentence, Utils.formatBalance(this, loyaltyCard.balance, loyaltyCard.balanceType))); + } + + if (loyaltyCard.expiry != null) { + String formattedExpiry = DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry); + + padSpannableString(infoText); + if (Utils.hasExpired(loyaltyCard.expiry)) { + int start = infoText.length(); + + infoText.append(getString(R.string.expiryStateSentenceExpired, formattedExpiry)); + infoText.setSpan(new ForegroundColorSpan(Color.RED), start, infoText.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); + } else { + infoText.append(getString(R.string.expiryStateSentence, formattedExpiry)); + } + } + + infoTextview.setText(infoText); + + infoDialog.setView(infoTextview); + infoDialog.setPositiveButton(R.string.ok, (dialogInterface, i) -> dialogInterface.dismiss()); + infoDialog.create().show(); + } + + private void setBottomAppBarButtonState() { + if (!loyaltyCard.note.isEmpty() || !loyaltyCardGroups.isEmpty() || hasBalance(loyaltyCard) || loyaltyCard.expiry != null) { + bottomAppBarInfoButton.setVisibility(View.VISIBLE); + } else { + bottomAppBarInfoButton.setVisibility(View.GONE); + } + + if (cardList == null || cardList.size() == 1) { + bottomAppBarPreviousButton.setVisibility(View.GONE); + bottomAppBarNextButton.setVisibility(View.GONE); + } else { + bottomAppBarPreviousButton.setVisibility(View.VISIBLE); + bottomAppBarNextButton.setVisibility(View.VISIBLE); } } + private void prevNextCard(boolean next) { + // If we're in RTL layout, we want the "left" button to be "next" instead of "previous" + // So we swap next around + boolean transitionRight = next; + if (getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) { + next = !next; + } + + int cardListPosition = cardList.indexOf(loyaltyCardId); + + if (next) { + if (cardListPosition == cardList.size() - 1) { + cardListPosition = 0; + } else { + cardListPosition = cardListPosition + 1; + } + } else { + if (cardListPosition == 0) { + cardListPosition = cardList.size() - 1; + } else { + cardListPosition = cardListPosition - 1; + } + } + + loyaltyCardId = cardList.get(cardListPosition); + + // Restart activity with new card id and index + Intent intent = getIntent(); + Bundle b = intent.getExtras(); + b.putInt("id", loyaltyCardId); + b.putInt("transition_right", transitionRight ? 1 : 0); + intent.putExtras(b); + intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + } @Override public void onNewIntent(Intent intent) { @@ -466,7 +535,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements public void onSaveInstanceState(Bundle savedInstanceState) { savedInstanceState.putInt(STATE_IMAGEINDEX, mainImageIndex); savedInstanceState.putBoolean(STATE_FULLSCREEN, isFullscreen); - savedInstanceState.putInt(STATE_BOTTOMSHEET, bottomSheetState); super.onSaveInstanceState(savedInstanceState); } @@ -508,6 +576,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements return; } + loyaltyCardGroups = DBHelper.getLoyaltyCardGroups(database, loyaltyCardId); + setupOrientation(); format = loyaltyCard.barcodeType; @@ -519,56 +589,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements settings.getFontSizeMin(settings.getLargeFont()), settings.getFontSizeMax(settings.getLargeFont()), 1, TypedValue.COMPLEX_UNIT_SP); - if (loyaltyCard.note.length() > 0) { - noteView.setVisibility(View.VISIBLE); - noteView.setText(loyaltyCard.note); - noteView.setTextSize(settings.getFontSizeMax(settings.getMediumFont())); - } else { - noteView.setVisibility(View.GONE); - } - - List loyaltyCardGroups = DBHelper.getLoyaltyCardGroups(database, loyaltyCardId); - - if (loyaltyCardGroups.size() > 0) { - List groupNames = new ArrayList<>(); - for (Group group : loyaltyCardGroups) { - groupNames.add(group._id); - } - - groupsView.setVisibility(View.VISIBLE); - groupsView.setText(getString(R.string.groupsList, TextUtils.join(", ", groupNames))); - groupsView.setTextSize(settings.getFontSizeMax(settings.getMediumFont())); - } else { - groupsView.setVisibility(View.GONE); - } - - if (!loyaltyCard.balance.equals(new BigDecimal(0))) { - balanceView.setVisibility(View.VISIBLE); - balanceView.setText(getString(R.string.balanceSentence, Utils.formatBalance(this, loyaltyCard.balance, loyaltyCard.balanceType))); - balanceView.setTextSize(settings.getFontSizeMax(settings.getMediumFont())); - } else { - balanceView.setVisibility(View.GONE); - } - - if (loyaltyCard.expiry != null) { - expiryView.setVisibility(View.VISIBLE); - - int expiryString = R.string.expiryStateSentence; - if (Utils.hasExpired(loyaltyCard.expiry)) { - expiryString = R.string.expiryStateSentenceExpired; - expiryView.setTextColor(Color.RED); - } - expiryView.setText(getString(expiryString, DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry))); - expiryView.setTextSize(settings.getFontSizeMax(settings.getMediumFont())); - } else { - expiryView.setVisibility(View.GONE); - } - expiryView.setTag(loyaltyCard.expiry); - - if (!isFullscreen) { - makeBottomSheetVisibleIfUseful(); - } - storeName.setText(loyaltyCard.store); storeName.setTextSize(settings.getFontSizeMax(settings.getLargeFont())); TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration( @@ -600,10 +620,9 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements barcodeScaler.setThumbTintList(ColorStateList.valueOf(darkenedColor)); maximizeButton.setBackgroundColor(darkenedColor); minimizeButton.setBackgroundColor(darkenedColor); - bottomSheetButton.setBackgroundColor(darkenedColor); + bottomAppBar.setBackgroundColor(darkenedColor); maximizeButton.setColorFilter(textColor); minimizeButton.setColorFilter(textColor); - bottomSheetButton.setColorFilter(textColor); int complementaryColor = Utils.getComplementaryColor(darkenedColor); editButton.setBackgroundTintList(ColorStateList.valueOf(complementaryColor)); Drawable editButtonIcon = editButton.getDrawable(); @@ -639,6 +658,11 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements actionBar.setHomeAsUpIndicator(getIcon(R.drawable.home_arrow_back_white, backgroundNeedsDarkIcons)); } + fixImageButtonColor(bottomAppBarInfoButton); + fixImageButtonColor(bottomAppBarPreviousButton); + fixImageButtonColor(bottomAppBarNextButton); + setBottomAppBarButtonState(); + // Make notification area light if dark icons are needed if (Build.VERSION.SDK_INT >= 23) { window.getDecorView().setSystemUiVisibility(backgroundNeedsDarkIcons ? View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR : 0); @@ -679,12 +703,13 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements setFullscreen(isFullscreen); - // restore bottomSheet UI states from changing orientation - changeUiToBottomSheetState(bottomSheetState); - DBHelper.updateLoyaltyCardLastUsed(database, loyaltyCard.id); } + private void fixImageButtonColor(ImageButton imageButton) { + imageButton.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(backgroundNeedsDarkIcons ? Color.BLACK : Color.WHITE, BlendModeCompat.SRC_ATOP)); + } + @Override public void onBackPressed() { if (isFullscreen) { @@ -698,14 +723,12 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.card_view_menu, menu); - loyaltyCard = DBHelper.getLoyaltyCard(database, loyaltyCardId); starred = loyaltyCard.starStatus != 0; - if(loyaltyCard.archiveStatus != 0){ + if (loyaltyCard.archiveStatus != 0) { menu.findItem(R.id.action_unarchive).setVisible(true); menu.findItem(R.id.action_archive).setVisible(false); - } - else{ + } else { menu.findItem(R.id.action_unarchive).setVisible(false); menu.findItem(R.id.action_archive).setVisible(true); } @@ -734,75 +757,75 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); - switch (id) { - case android.R.id.home: + if (id == android.R.id.home) { + finish(); + } else if (id == R.id.action_share) { + try { + importURIHelper.startShareIntent(Arrays.asList(loyaltyCard)); + } catch (UnsupportedEncodingException e) { + Toast.makeText(LoyaltyCardViewActivity.this, R.string.failedGeneratingShareURL, Toast.LENGTH_LONG).show(); + e.printStackTrace(); + } + + return true; + } else if (id == R.id.action_duplicate) { + Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); + Bundle bundle = new Bundle(); + bundle.putInt("id", loyaltyCardId); + bundle.putBoolean("duplicateId", true); + intent.putExtras(bundle); + startActivity(intent); + + return true; + } else if (id == R.id.action_star_unstar) { + starred = !starred; + DBHelper.updateLoyaltyCardStarStatus(database, loyaltyCardId, starred ? 1 : 0); + + // Re-init loyaltyCard with new data from DB + onResume(); + + return true; + } else if (id == R.id.action_archive) { + DBHelper.updateLoyaltyCardArchiveStatus(database, loyaltyCardId, 1); + Toast.makeText(LoyaltyCardViewActivity.this, R.string.archived, Toast.LENGTH_LONG).show(); + + // Re-init loyaltyCard with new data from DB + onResume(); + + return true; + } else if (id == R.id.action_unarchive) { + DBHelper.updateLoyaltyCardArchiveStatus(database, loyaltyCardId, 0); + Toast.makeText(LoyaltyCardViewActivity.this, R.string.unarchived, Toast.LENGTH_LONG).show(); + + // Re-init loyaltyCard with new data from DB + onResume(); + + return true; + } else if (id == R.id.action_delete) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.deleteTitle); + builder.setMessage(R.string.deleteConfirmation); + builder.setPositiveButton(R.string.confirm, (dialog, which) -> { + Log.e(TAG, "Deleting card: " + loyaltyCardId); + + DBHelper.deleteLoyaltyCard(database, LoyaltyCardViewActivity.this, loyaltyCardId); + + ShortcutHelper.removeShortcut(LoyaltyCardViewActivity.this, loyaltyCardId); + finish(); - break; + dialog.dismiss(); + }); + builder.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss()); + AlertDialog dialog = builder.create(); + dialog.show(); - case R.id.action_share: - try { - importURIHelper.startShareIntent(Arrays.asList(loyaltyCard)); - } catch (UnsupportedEncodingException e) { - Toast.makeText(LoyaltyCardViewActivity.this, R.string.failedGeneratingShareURL, Toast.LENGTH_LONG).show(); - e.printStackTrace(); - } - return true; - - case R.id.action_duplicate: - loyaltyCard = DBHelper.getLoyaltyCard(database, loyaltyCardId); - Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); - Bundle bundle = new Bundle(); - bundle.putInt("id", loyaltyCardId); - bundle.putBoolean("duplicateId", true); - intent.putExtras(bundle); - startActivity(intent); - return true; - - case R.id.action_star_unstar: - starred = !starred; - DBHelper.updateLoyaltyCardStarStatus(database, loyaltyCardId, starred ? 1 : 0); - invalidateOptionsMenu(); - return true; - - case R.id.action_archive: - DBHelper.updateLoyaltyCardArchiveStatus(database, loyaltyCardId, 1); - Toast.makeText(LoyaltyCardViewActivity.this, R.string.archived, Toast.LENGTH_LONG).show(); - invalidateOptionsMenu(); - return true; - - case R.id.action_unarchive: - DBHelper.updateLoyaltyCardArchiveStatus(database, loyaltyCardId, 0); - Toast.makeText(LoyaltyCardViewActivity.this, R.string.unarchived, Toast.LENGTH_LONG).show(); - invalidateOptionsMenu(); - return true; - - case R.id.action_delete: - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.deleteTitle); - builder.setMessage(R.string.deleteConfirmation); - builder.setPositiveButton(R.string.confirm, (dialog, which) -> { - Log.e(TAG, "Deleting card: " + loyaltyCardId); - - DBHelper.deleteLoyaltyCard(database, LoyaltyCardViewActivity.this, loyaltyCardId); - - ShortcutHelper.removeShortcut(LoyaltyCardViewActivity.this, loyaltyCardId); - - finish(); - dialog.dismiss(); - }); - builder.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss()); - AlertDialog dialog = builder.create(); - dialog.show(); - - return true; + return true; } return super.onOptionsItemSelected(item); } private void setupOrientation() { - Toolbar portraitToolbar = findViewById(R.id.toolbar); - int orientation = getResources().getConfiguration().orientation; if (orientation == Configuration.ORIENTATION_LANDSCAPE) { Log.d(TAG, "Detected landscape mode"); @@ -831,14 +854,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements } } - private void makeBottomSheetVisibleIfUseful() { - if (noteView.getVisibility() == View.VISIBLE || groupsView.getVisibility() == View.VISIBLE || balanceView.getVisibility() == View.VISIBLE || expiryView.getVisibility() == View.VISIBLE) { - bottomSheet.setVisibility(View.VISIBLE); - } else { - bottomSheet.setVisibility(View.GONE); - } - } - private void drawBarcode(boolean addPadding) { mTasks.flushTaskList(TaskHandler.TYPE.BARCODE, true, false, false); if (format != null) { @@ -979,10 +994,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements } // Hide toolbars - // - // Appbar needs to be invisible and have padding removed - // Or the barcode will be centered instead of on top of the screen - // Don't ask me why... appBarLayout.setVisibility(View.INVISIBLE); iconImage.setVisibility(View.INVISIBLE); collapsingToolbarLayout.setVisibility(View.GONE); @@ -990,12 +1001,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements // Hide other UI elements cardIdFieldView.setVisibility(View.GONE); - bottomSheet.setVisibility(View.GONE); - behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); - editButton.hide(); - - // android 5-9, avoid padding growing on top of bottomSheet - coordinatorLayout.removeView(bottomSheet); + bottomAppBar.setVisibility(View.GONE); + editButton.setVisibility(View.GONE); // Set Android to fullscreen mode getWindow().getDecorView().setSystemUiVisibility( @@ -1023,15 +1030,14 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements } // Show appropriate toolbar - // And restore 24dp paddingTop for appBarLayout appBarLayout.setVisibility(View.VISIBLE); setupOrientation(); iconImage.setVisibility(View.VISIBLE); // Show other UI elements cardIdFieldView.setVisibility(View.VISIBLE); - makeBottomSheetVisibleIfUseful(); - editButton.show(); + editButton.setVisibility(View.VISIBLE); + bottomAppBar.setVisibility(View.VISIBLE); // Unset fullscreen mode getWindow().getDecorView().setSystemUiVisibility( @@ -1039,11 +1045,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements & ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY & ~View.SYSTEM_UI_FLAG_FULLSCREEN ); - - // android 5-9, avoid padding growing on top of bottomSheet - if (bottomSheet.getParent() != coordinatorLayout) { - coordinatorLayout.addView(bottomSheet); - } } Log.d("setFullScreen", "Is full screen enabled? " + enabled + " Zoom Level = " + barcodeScaler.getProgress()); diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index 73cc6db69..f5ad96f0f 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -36,6 +36,16 @@ import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.Toolbar; import androidx.core.splashscreen.SplashScreen; import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.tabs.TabLayout; + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + import protect.card_locker.preferences.SettingsActivity; public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener, GestureDetector.OnGestureListener { @@ -850,15 +860,22 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard return; } - Intent i = new Intent(this, LoyaltyCardViewActivity.class); - i.setAction(""); + Intent intent = new Intent(this, LoyaltyCardViewActivity.class); + intent.setAction(""); final Bundle b = new Bundle(); b.putInt("id", loyaltyCard.id); - i.putExtras(b); + + ArrayList cardList = new ArrayList<>(); + for (int i = 0; i < mAdapter.getItemCount(); i++) { + cardList.add(mAdapter.getCard(i).id); + } + + b.putIntegerArrayList("cardList", cardList); + intent.putExtras(b); ShortcutHelper.updateShortcuts(MainActivity.this, loyaltyCard); - startActivity(i); + startActivity(intent); } } } diff --git a/app/src/main/res/anim/slide_in_left.xml b/app/src/main/res/anim/slide_in_left.xml new file mode 100644 index 000000000..98d1b9156 --- /dev/null +++ b/app/src/main/res/anim/slide_in_left.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_right.xml b/app/src/main/res/anim/slide_in_right.xml new file mode 100644 index 000000000..015a35199 --- /dev/null +++ b/app/src/main/res/anim/slide_in_right.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_out_left.xml b/app/src/main/res/anim/slide_out_left.xml new file mode 100644 index 000000000..65d074bee --- /dev/null +++ b/app/src/main/res/anim/slide_out_left.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_out_right.xml b/app/src/main/res/anim/slide_out_right.xml new file mode 100644 index 000000000..d86be8399 --- /dev/null +++ b/app/src/main/res/anim/slide_out_right.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_chevron_left_24.xml b/app/src/main/res/drawable/ic_baseline_chevron_left_24.xml new file mode 100644 index 000000000..f0d71e1f4 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_chevron_left_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_chevron_right_24.xml b/app/src/main/res/drawable/ic_baseline_chevron_right_24.xml new file mode 100644 index 000000000..a749bde77 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_chevron_right_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_info_24.xml b/app/src/main/res/drawable/ic_baseline_info_24.xml new file mode 100644 index 000000000..654cfb396 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_info_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/loyalty_card_view_layout.xml b/app/src/main/res/layout/loyalty_card_view_layout.xml index 63c8d8f96..823681605 100644 --- a/app/src/main/res/layout/loyalty_card_view_layout.xml +++ b/app/src/main/res/layout/loyalty_card_view_layout.xml @@ -8,239 +8,6 @@ android:layout_height="fill_parent" android:fitsSystemWindows="true"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:weightSum="1.0"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-he-rIL/strings.xml b/app/src/main/res/values-he-rIL/strings.xml index 53038f51a..a8b709f5f 100644 --- a/app/src/main/res/values-he-rIL/strings.xml +++ b/app/src/main/res/values-he-rIL/strings.xml @@ -39,7 +39,6 @@ קיצור דרך תחילה הוסף כרטיס מזהי כרטיס הועתקו - לא הוכנס שם חנות כרטיס לא נמצא ייבוא/ייצוא diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 08628ceaf..0fc7e23f9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -290,4 +290,6 @@ %1$d card (%2$d archived) %1$d cards (%2$d archived) - \ No newline at end of file + Previous + Next + diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java index eb0247f75..3ca73b682 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java @@ -27,6 +27,7 @@ import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.TextView; +import com.google.android.material.bottomappbar.BottomAppBar; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.tabs.TabLayout; import com.google.android.material.textfield.MaterialAutoCompleteTextView; @@ -1194,9 +1195,8 @@ public class LoyaltyCardViewActivityTest { assertEquals(false, activity.isFinishing()); - ImageView mainImage = activity.findViewById(R.id.mainImage); View collapsingToolbarLayout = activity.findViewById(R.id.collapsingToolbarLayout); - View bottomSheet = activity.findViewById(R.id.bottom_sheet); + BottomAppBar bottomAppBar = activity.findViewById(R.id.bottom_app_bar); ImageButton maximizeButton = activity.findViewById(R.id.maximizeButton); ImageButton minimizeButton = activity.findViewById(R.id.minimizeButton); LinearLayout dotIndicator = activity.findViewById(R.id.dotIndicator); @@ -1210,7 +1210,7 @@ public class LoyaltyCardViewActivityTest { // Elements should be visible (except minimize button and scaler) assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility()); - assertEquals(View.VISIBLE, bottomSheet.getVisibility()); + assertEquals(View.VISIBLE, bottomAppBar.getVisibility()); assertEquals(View.VISIBLE, maximizeButton.getVisibility()); assertEquals(View.GONE, minimizeButton.getVisibility()); assertEquals(View.VISIBLE, editButton.getVisibility()); @@ -1228,7 +1228,7 @@ public class LoyaltyCardViewActivityTest { // Elements should not be visible (except minimize button and scaler) assertEquals(View.GONE, collapsingToolbarLayout.getVisibility()); - assertEquals(View.GONE, bottomSheet.getVisibility()); + assertEquals(View.GONE, bottomAppBar.getVisibility()); assertEquals(View.GONE, maximizeButton.getVisibility()); assertEquals(View.VISIBLE, minimizeButton.getVisibility()); assertEquals(View.GONE, editButton.getVisibility()); @@ -1242,7 +1242,7 @@ public class LoyaltyCardViewActivityTest { assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY, uiOptions); assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_FULLSCREEN, uiOptions); assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility()); - assertEquals(View.VISIBLE, bottomSheet.getVisibility()); + assertEquals(View.VISIBLE, bottomAppBar.getVisibility()); assertEquals(View.VISIBLE, maximizeButton.getVisibility()); assertEquals(View.GONE, minimizeButton.getVisibility()); assertEquals(View.VISIBLE, editButton.getVisibility()); @@ -1256,7 +1256,7 @@ public class LoyaltyCardViewActivityTest { assertEquals(uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY, uiOptions); assertEquals(uiOptions | View.SYSTEM_UI_FLAG_FULLSCREEN, uiOptions); assertEquals(View.GONE, collapsingToolbarLayout.getVisibility()); - assertEquals(View.GONE, bottomSheet.getVisibility()); + assertEquals(View.GONE, bottomAppBar.getVisibility()); assertEquals(View.GONE, maximizeButton.getVisibility()); assertEquals(View.VISIBLE, minimizeButton.getVisibility()); assertEquals(View.GONE, editButton.getVisibility()); @@ -1270,7 +1270,7 @@ public class LoyaltyCardViewActivityTest { assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY, uiOptions); assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_FULLSCREEN, uiOptions); assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility()); - assertEquals(View.VISIBLE, bottomSheet.getVisibility()); + assertEquals(View.VISIBLE, bottomAppBar.getVisibility()); assertEquals(View.VISIBLE, maximizeButton.getVisibility()); assertEquals(View.GONE, minimizeButton.getVisibility()); assertEquals(View.VISIBLE, editButton.getVisibility()); @@ -1299,9 +1299,8 @@ public class LoyaltyCardViewActivityTest { assertEquals(false, activity.isFinishing()); - ImageView barcodeImage = activity.findViewById(R.id.barcode); View collapsingToolbarLayout = activity.findViewById(R.id.collapsingToolbarLayout); - View bottomSheet = activity.findViewById(R.id.bottom_sheet); + BottomAppBar bottomAppBar = activity.findViewById(R.id.bottom_app_bar); ImageButton maximizeButton = activity.findViewById(R.id.maximizeButton); ImageButton minimizeButton = activity.findViewById(R.id.minimizeButton); FloatingActionButton editButton = activity.findViewById(R.id.fabEdit); @@ -1314,7 +1313,7 @@ public class LoyaltyCardViewActivityTest { // Elements should be visible (except minimize/maximize buttons and barcode and scaler) assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility()); - assertEquals(View.VISIBLE, bottomSheet.getVisibility()); + assertEquals(View.VISIBLE, bottomAppBar.getVisibility()); assertEquals(View.GONE, maximizeButton.getVisibility()); assertEquals(View.GONE, minimizeButton.getVisibility()); assertEquals(View.VISIBLE, editButton.getVisibility()); diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-04.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-04.png index 3214781eb35644b7b1948d2503330c54783dad73..6d4b39c79d7ef4f279155c35a6b246fdce6764ba 100644 GIT binary patch delta 16680 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 delta 16143 zcmcJ$c|4SR|39wdR_8>yOR^QGA{j|(5yI(6GRiUr$(ABzUt%!E)u|AQ8iwpy#?D09 z%}iO6v1KP)c4Hgs3^Qitcg^T@pZoW?KcDmYZvS|=uIv4NEzj5beqGnF`*|n3d0)=& zxbSL0dd~$_rE|Y3DXE@SRy}tnN^(b#up|5^gNKJ_hZjuecb>x5Lu4Kvve>)w9aTAi zc7u`BhNNaSz1weHel@-!uKN1pkG`*79J&4O>%Cp?u9ey~g-a_ID>SXRj-y6?c`9vp z?8wO@FJB)1`Q^)h{QUI%?b8W6yxQUz6jud>oT^+I@3Pz~&6HJj+F;y{CdbC?z{1?Z zBQ`HP32DdZ4n9W1O(#->UGj96J!E(xGf8=l;XY3eypG;?>RDYNA{Q+Pk4JhHFhTo9!a z#+FP*O(_-$PA937i&Hhe96Sww6g^Y6#a>NG7MoQRMUAlYom?U0tkn+);Gd{3ORGRg zpi#02H4jG!3ygj2{*O(%6E1c^SqODeI3iMyF0rw-+NMK09(Obh|6E~YdWD6gG!P~N|!Agqtm#kh{$&0n|_nz-egUq}*`oVC=erfvSM7`O<6HD)};}FAs z%Jc>wMpy(o@M@dJs^y^87h3dm$sS;rZaM=d;6BiT(B8UNvuvuX>A!I`48^kQ7QlEP zmhfbSj{-Ix@-mHDGIaG{!Zr@JsoTJw3daVb`ppg5@IXgOtg*U`Yb!dpc? z*~D*}ELK~2L)M`aWQPODN%}0cb)~wr$PGmud}og;)SExntw(nbIqT30)b05^gjvZt zPVK-cNR&-)iA-A}-=)H?7^rV1%#8SvPu*fH)t)UIe&{f-hgjJ_Y(?+T;uFoBaf%9F zp4iZ2ll$A5jm&l(DbQZ=3Aac~H7q6;sMA<0XttT_lZ}gBTd=%4;xoVW@h-?_3PEJn zF1e~J!NcYZfUVVRV33#E?~ro-!np>5E7E6yc5J7B@a@;uew*DhdU+!Ng_+8VH(<^7 zwrf^Pm9rT#%nZWDSoqAyhlR31tKi;JuN%$U8j+gxD{;iZNOgMC%t%MACXn$^in&Rw z7G<^r8{Z5dlY*^nQgrRLY0t4fd@xjOYqDZG1mWl;O#rr5nm~7|BixthaXGarBnxVn z3pJb0d?xi?{;R3rc<*ymp-qmI#0ohpC4z3~H~vC7eZ=uWPq%X5a(%2l%d^4yK$%NZ zLF((RE^Rv!9;E>qDG`JivDYVti14oZVZMpk%Gd@F6nNO0XAPx zOGD{Og|3uC!wEM``VIXiMjP(5qM6?sWB}&xb;IeNGauT=0_&DiaDA~(w&Unj!meL# zXY(+f=f8?Czq@eANc++;r5dj`4b6F->j$*whqm-Y6y(Wn-`2>Tv0YaCm@{RdFFhxT zpgMzH&N!vo8ML~VJ6&F5H0>cXT)M+b_7QIlbYNsqVh&bb#%oO*t!k8>8pBY0E3mrJ zZY;z6{gNo{(#9C;#fL~>qqDDfwsk;ULv{64iXtdREp09#FZ5w&;As>ajmzlQif{wnfA2DA!So<9wjcr4BQJurvbdS zP~o||>gyA3cce6d@x*~)MjJAa@F?{s0h$>#_NmTV+7DG3^bYNs{PyDjFvu0xJC5DYE-Yp>L-aIR+~k%*+6-ba`qwhfIHWS zx91BC74h&~#AybLSMVw@Gg(_%k@qkygruN6d}iKebD?Y`G*Hg9l0`)aIu^O%*CUDS zcPFG~Ku16AvNG8&H5V_BYb%@K(c(L?W>`{@gUxVj7T$|W1DK;jOxTPL@yJwq$lXCu zCaF5B@ZwC=&wL3Jg^t+xtSG5S-}QnS!@uisz510?L*xF7g!D6Xtq{r|;$jdR z)Vj%j_?*y zeEz8sw1k4yMT#=6#eoD}McrOK1hGFF*pgTH+9a&ZDh$;%Za5Yt(TnOil4jBPDRha+Gffep83Y#7;Q~d5n{4D*%am<2@N^Q< zwQ94l4+D#Cn$z6)Rtx${xC)TdQItB9GOnk{RHwT3rV*_k;BW*w$N$qb=|Yj3aZlZX zLjvjUYm~Fq&jG*1&9s305e+7zk5UP+#wTsJNQ#7|-aeu8^(aKi$QHe z7&=cb-jCPPnjiS%`Bqm?e_QJ*XUqKzBT3|1?6wDwfSD3$=RfqkFQxqKsjAGIZsza& z?H%SrkYlm+mmJyi@7i{o-@#TzYzY$Cch^Fay%t(*0^^=Jd_b`_r@194>7yH7rQ@Bo zZE>)TES*>3fvW@+r%CIf&)5VodaUaG+lRp%p6AdU%5v{KZWBmfBgczFf&zpy^(*J= zMc9C8UE55pU|Tcc!jxyenp=u8TF_&0u;O>tv6%OaSD-6H8oAgUU4fkp(cEGg6iF=> zKR6q{{%!U&&u*36`;Ir^m9hTIHKn`hRa7a~w}v9cUIpdBGw4xzy@<`pTVFtx!LFdf z7I>DTzUDrUV}rHdFj{QzoSVmd1Mn5^1^mQ5W;mM)``oErV~rXgsjtY>XrAxmU-}*N ziMneVq=<#8@wNk)jfyld?z_qJ4h|{)E6PP7t=fL>P>mwWp?JT%#8-#1sFGJcX~sVW6_TRDoJRSdwYnr zeUU3)45TC*bv7rW48Fz`K4+fbMA*=!HoyGE)cu6rL6<&zf>npGQDdXCQKSJnP>+oK z9nGGW-nPTTtBz;&4^=5swdSiGa8l>Mq!~n?&BL+QalJKX`YR*$#NJ3y$&fXW>O+*z z5L5bex@gu1Jt>V0AOv-zOOw64a@YeAd_~i$>O@bWxfHXVMp2J`@Af*Dy$M}A;!JtH zwQg)6NHz;xZ7G}TRTf#nN^MHm)oau!b!M(x)DDY&!bt^&@C81>%$UbDNH5auPa0D=+N+6rl)*Gf9CG=H z>=&gL{N&=2RN)b(Eik$%qGswXyb*$ucI#SRa|;w<7=hM1S+8XTb`p@AeX_L!N7{FN zp(R%mugFibu~MCqjHzU1GV07-pS}yDz|A8g>H4k7>I_;eYni!A^5oX1gzJ$SE52mH zIk3A7Wz8fxU65W)m>sO}3bO3#Vhk1g+fRduVUxw+rHBZ!6F5OXP__thPkSo9c*`(9 z9lz9m*UgKvu%d?>E<(}9BQ;)8j*L;5(|8;8jiH7^pfJ1ho2Ff3F ztb;6_mC8KVpMgGLa|5?xrAS+DkYbY~0gb>l_>tZd_iWbA&zJclmxG80SG2*>IalKr z_&y#?34!8|!LZPT*PNMj)7yNy@w{xrpAjGD6}&u96+k!fa;vBUYms+jm`sby>Rf_@ z4bu1z0DG$yXw_nwfiOtl!wIjGDEiN@oTep zhHfP-*Q_cYB*+)De;&NZC|xo?X;ppc`bZV!{&N(MU+W@~g4AUh==cRgmq<;xy%atH zn`d(lLomR>c;okT=TGh?Vo&c3UJg+Yu)$Mty&+5nag_@AX|tQ&q=^vXxmuWLz-vC5 z_a~Wh?*p#GozCjyjv9V+j0nLvJ*!i6%4eT z0@N;#1gsWVxR$4HX?794W~*eF)f&vT&c52>tibiT2>^j#rYO55dRh4GeFvpIzO*_$ z9qi%nAYI@}xz4)LJ$VT7aSn&KPNrZ3-Q;{)ZX5%ypi_Se-hDb=%igLX_>OvqN45ri zX1w*h1c^Gnl`HlRU{`6z(4*)dX}|%1K_y^T7JnO+7;mi^9(I&IR`HPX&!pwqJT`a; zxm{H0FtDgd*ihQE=~oiOd~1$7>tu$&EC?d!(85xQtlJYr7cD-pV?Pi~>e7uZpbT18 zh7^k|z6z15nhi6@vdjsYC@V2)A6VnX7#q)a$k?^||OxNogeOmnkc3$tRcz&0eaYFXh8xcD!;6xxuq`sXTn0(Ij6v;Ff)Y1ryZvgrXW&})~4Ux&>pQ=tfRIX>LMIKf+FGV!w5mM31AZnUm zGYl39&1&UKufbzB7}S~pOR}|r*TXn&X9$^YP2vwhjrN_{N@Rf@MDF}M#!8c-jW4TS zDuAt%pzP`f9t{Y31By9SV^hG~^eLwYnw~QoLc{>2#;oVLjR|gq^)Cj21Tdd3VH^GS zJFh$?dllmS$Z7Ufh(!Qw`bTce{*GiUASC@Zittr}PyICKW+l9a8gNl zlAjO*w#+cz7&GjaEdb^$);FZ40MIu_aV8-;zuI>e3N+bzBd38JAsUl~0Jb*9Bk>Qx z@-AH?ViT~>)cj&`0COD(c~XD612Si4B+Re2IfP)Zf-O9Yv94Tm{FkPRqr+Q}>3v>Q z+RZ-v=>3bMg4#Jyhqh$!aMsD`Eh!>nQ3e{z#XP~gd3eBz%)=uJ;o$*U{Pha>amiW5 zeaKnG-Sh8P|AE4fE!<~6u6_{svE{!KA$T|Nzs&UCmH6Lc`WF;{|Cy$L$Mk<2D&SAB ze_-_}bxZ~{fPgUgM~jb#=QRBL6_|3qUvX~#hpYc?3+LH?+5-H^hWqfpqwqgw`nOX5 z-~#dl?f>KQKWO@2iT$V4KeqfWQ|`(iI{e@X{GjkJbpDR%|4pcXzp?NSLI0NN-%0&L z(SL&q_>W%kC%pfUnEr()@WUkkg@JyE{r|>3p#O34_%Ag5H?005_7AE5PwfNz2lxM5 zrvDeA0ys(KhZ6q*>>rx`J=5j=AejG6LjM1i9!}*s4b-J7p_))=Xm9VwT>Ya;k!>w3tdX>&8)Tpm@OZRSAjNqjx>ix zFEm-~trJsvN=+4rX*`3j;TN_3q}O}6FdFsqF^%EzG(K)OwIIH`^>5y~J)}TfQ@~kQ<6LqNu&vf1FgXkU%>(hodN=}wXS=isQcim>KWhoaoEwHz8Ft5TT z=;P_iAjQigIhb|X;xdwqN*VO=bQs4KGhP)&R~C*R);rkui*EK^4`X7%e!_2<3KOm$ zzPOLItXy0w4MN=fxlt}a<1up<^+U+*|=2EDj9xxxn+v8F6ys%u2-?=>Xn zSm`iIp&MvzH_X%TFnC}U#l)*&g|mG~cNTcKR8qUhrsws{>$_p@_FG_)?wKR|jx>HJ z`o)ygmFy*F3SB9Kw)tW53p!S>e17WoT`Oz3*h01WFdV6TXa4dO*-4Pc11)DZYFNT1M-OAhlAg>B2Q` z=2*mjg>+sx)K)FnCljX>Nx433x^42$P_iT>dG=qgH(31CA`!l- zO)I4Rz9Wr7?Mjcspv56%%>KQ0RS^o#>-sj`>w9l2G|j0BW*OvWl#zm?hAgnOB9&kI zAl$@4PtuR;L8!`jxA)26*Z)Q`V7YmMaX?(XEI+Tyu2a|GMZ?DN|mdB2eqt~Dn?^l=bd(2exafHPJqNo2< z2C4EGISNAN|FF{;W2BzLjR12wUj3{@s1<*-Bt*|*;83TTQ#cS?`Y;72^HMK(>UTKh(AxZH)%DiWz6WN+F`G{~!P1UVuB0`H?;Q7$8x1A6L>DRJfJH>OB z6XE&Mfmy~KT9dvPJ@HPPw{%v!hmu_KvhvlVE9vqAn8LepQIO42Xq-VVHwg!m5S3=o z6M&bhJ!-TFQp$MVeo>^cbf}er<{70F$_pZu2`I# zX^y~0j60>un^F>sFF0f7qadC#GZSLaPnb@?7LEE#diSD2dH9441bZI^tCdZ-HE}!P*w#wP%jLh ze&9_pRDty(VKV38`Vl?4+=$C54S}|iqZd<)7iZp=gdD2sz2%)p#R3MohZg+|nKLPH zZqPdVV%PRyglx0Bys?Fh_)bFiAIO69$o@~K;l~k&uJ6ILCUbDHf2hB0#zF>35~3p> zQ{ef{+NrxN|MMC6)%EZAddbT$Dsf;|3A{VjY-mn+_==ZyE6-)QrZJCZuy}1K2aF#e zE<`h8_PdCgIL7Q@h_{t(_MxN>KRc8cp0mMe)GEpp8%&yrxU7X;+J*}q<~?L~FZ;UH z$XR%gdLlk0$YxTqQWE{&KW>a%b-|R$4Tel6zgJ1>8`d~tmMFx|K znhjMh0;M2zVD4LWztBK>2($vn;&wFxm?*q*_R}X_LaT)ypi)Wq%T)z1x=vIBYoTD$ zN4X>&|6tOxrK}0bV?CDZaCyBbP`t)3U3=8Eu&eH(5L$2BLvZJijpp4ujA32Se#ODi z>=8p1^VU2fr#xibQcvn|%RV%B7=Q>~bjRUqL{MWSb=&Ogx4dpcbqZ5EykJ;oGl1Iw zoL7fuy3B|{<|6I|how`$o>YfZsREd;PWV;YtRkl(=a}LcUmrRy8O9BId_ID7@$tBq zZI_&hMr0pw-s2P^LrE{zzC;afni)chXGZl(LT+bAQ~xE25rEN7;7e(L+HCk>BtaZU-7AkSqZi6@5Q96Ww~uSaq+y z_1)|P?_sUg%d>2IzXh^Ro^$r~#=%UqLw59!O(D=(_fA8xVdy4Jo~``Z$w1R|8PKw? zF9dzNVAyQQP;PYFQ_!h*vY$W1!athEy>)gNF*J{oggCA4!9;O|h59@RONDh|U}OuK zHba%|=3+~0@@Xop4g+ha<$*EpQJAW9%Wcb^)0~Jwf}sHh6e}9QmseNNp$s=&xUmP* zECH-bK+XW)7v;dU>^o+8FX$3jzFWzVVTe%7!ZUFQU$s^d$H%0#us@ZOYyf%^`1ULo zOrRP6@R=ox{BFG~XC)Zwh&?3OkRA+eWxymCoW-f8DzyGAVRbmHEN4OrawZbS3GH9Z z<>FFErD5=oTJ{UJTJ}rEhim&p0dO&b`i>+4k*7UPReI3!$E&@VecYA-{vLBD?^-a_ zL<7kh>`%0?M|xY+IU419V*4QIRG7UymUgr-)fLkl$hfIJeBF)n%=^!0_M#TpF;h;a z%?|CQEdUEiQI|pzp+SWQK-0ptf zz2tZo%{Kd22KI1LBK#xB3jmqrs>H(hD9aqx@();OE5UP@ETNbJt~_&Gd4#870-P<; zbzDipyySv8fV*2P?{{0dgQPpzgwyE6&`-(uLf`iF#+?AZ6Hov#^4rVvyE(%UXzw@3J|e4PHOjf}Zg{a<;CL%5Ds%(b&_kD=dO#fTq>#Zlewx4syvtbWSV zbWC=63aY)$K^P3oFhJT|Zd>qwX{^M-d)ty>|N1Z8hikMK)q3w(BR{ci!Ezu-bLbPq)>Pju98j3<>#s4fVfa-a;>EZ?M z`s`HC_lWF6iOK_D&Gmk3YuaPj?*O7DE$5+SuhXfpchITe@Twa(mqyQ|c9bl+a)?)E zs&S;0mhk|Kb|zRS&+m#+aPh^$mp*n_=A$imr+u*)U^^`sf zuSs?695dauT=HcrDE#<)F$loXhia&+4#ke&z6fVh!xr|AIi-^IdO>Ebq4J!Fk(P1H z&ev>LhxZ&_01Lt1>&_!(6=a`=mKwsa&pYJOcaMy)fxhE+<}T5_}1{y6RHGcSM83uIx1dg z%4+&P*l%~ZF9hk8frT~#)VpN|SMOiMA*ph41MnI{b3D+Iiw{4j;PabJfr7JRWw!mC zw#z`LmVIv>26>#@JwOKyb#0g!F^I8hWe9XAEQ!|B_VBt5DoAmzP9{MK(3%`;wg|+A zKxs*9heNKa!mn-(IdPn>n`%e~I4z{AAcAAlnvZiG+AVwM@^JMxRuwHPC)0XdL`sID z#3AwsaKZUq{-CwQ-fV_Ir>Z`4ZKwhom}aP}Nj)Qgp{hs4QZBW-V~#N#XMLF_B8tPW z#UOEN06AO9=NTVT{K%ZNRE(rlO0A`tvW{a+t@9RFI&Y#CUxO`Jiq}2I_dQ_nK zY$Xn?*d?^VH)yZy3~uD3GukB}-XQ$zeGQ>`)Sy()5*?61l6zIr>7s+Cv<4p z4?Jy7T9fxNXqE(9icYP`r8lWSM-?}3OJjVp1u9brb2sUmYay~(!;HBPb!!O+3@nT0 zg0W7A#>{lyiJX)m+I0pgSirK3zrrH@=eh0$9nsaiojp;x*u+)ZBLv!G8Y&9$P6DMt zB|v9qalbSn3T|F(GYZ6(I=8bxpMiIn0o~p< zOz+#EVTA^0meqI6E@lrYyG7h(l3Z+<`QYyBN&1b0S5q{SlsxJSyFlyGx|QL(QEqp* z-cc_JsgS~=k=gV3i{4qJR&zboLyKmvy(e#K1TJST>nUfsrMH1Ls|tZqlh)D!#(N#k zzD5@aFD1)h561mzCDomJY*x1LdJ??CcQfMCly=01{7Mo*JmHg~ev-Zz@u6N1FS)Z9 zRg#5cg!wjcTTtC}4Y>)*jCJW^lE5ygJlmTQvsreL zj*Gs~JF-?VwMXRS*O%aDGlUnc1Ri^%Sg9%35 z8wUAZ8R=CsuSt!eF416_)x|jAFwAn=jQGW6AWPAlNVF}Lc{xE8u+G;qr+Bm4 zV{5EMgqp11Xi3AYK7=Z{a*H$Cl8Iqoz<85W(SdJB6WxqX3wwj9IIzVV@&b$os7*2X z10$!KB(KdwDJ|_vxgXqGQ!G7?GVKhy_>oJvYa`nrK!PK3Fe1=;MuxUemS_DRrIGgi{5W zl{lrLH{7PR;)eYfz_2keYOJ~2=J1fL2@H%M)B38jZNPOGOiV#kjPu~7HvIZ8j>gOz zLI?8~tmVQl_~4>rT)@G~ft5g;_Ffb>$3Qk+AmB*>TME6Hc*6y=wkl=Z2JiPXvgm^h z)S8MB?erL1RVSZHzc033R2F%-UKriQ*cX!8QM^zC^tcEqX<;dgoaw>QVTwF5J9@g3 z>r#!~HbEeA8aZfxL)0uPO!l5S`%H<+tup&k(pDy)Pt8ovX<%46p(hBlQqWZ(C()p& zpQ8VuUpyGf#uOuOmbHtx4{;qU0|wHWZj2;b%z}dHj+msVfJ9k$+xTt+1p_b<5rrYo z8>?Zc;oZ*XzFL4UlRx#iDa@3?KGE`{m-ynptj)A40g9Wz21hFrL{HnmK6Zbqs<31NFxBp?vgL zNKS%@Kc&FHiWlgqGP!__$VgCrnm%hGF5==`-Z&xZC^6?&={H=%c9{pkVMIg+S&gn& zzoGSPCNp3iS~Am6v4`zuRQ0uA)RMTN)V*ceScxTk0ViUJZkj7t?&1nMm>RcpLVB`F zN#I-(O|Z9L{`A(Q<_|C=A9gF;w9+JcI5GDC2d_OGmC1E`t&AjZmFn+IPF)`=M*B~X zt!YCgIvjW_2^DYV#xl<kH z^|f`e-xj*7>JRL|Qo+=ET>bvNABp|%T?338nm1j%rWJ20Q3^};l!2dnuzq8fG|b^D zDT`tw1%-0^f4njokN~FgUCLzwNM&tK@hZgi$Dhu#2g*y4i5av;<+BXC%Vr}QV zg|V|a4lmc5(aGUeN(%EtgPQE7WH|#|9c^RrCT`5_gJ8MgXhXw$K zC>H;Rm7$v{ck?nvN-u(@oE?Ig)A}8f%h7(v#@8563fQKZLCiVzXW)0i_jG$Ml8FX8 zuSY)WqOa44j%Jv;{V8 z5b8S+5!kB05K4D%@F9CZV>us%K5tY?O*r8JPLok`e1q}(L5Bm!>)d9)6grCNo-Q|+ z!JF&_-%A8$nHEn&o8DBQ%}=7T%sbj{=M;UK?vu3`lO=t?6eFI=W8WZWntW8b)+sjG zeK802tp%d>6%xmoH;yc#B+KK&vAAYifA$b;Xgv@h4NV(>FSiZ}$;^7SN}wa#gji^0+hWZ5p@$$SPdLw7(rNg|mTt&vaMRlM9{~bJhTe9LXv;xSe=AJUaH=3j> z6VDb*bvV}Ty_#9iMbaGg>qAl%8%C%4nIltjZ-*bv|?u-!rh3_^mh;o(5isjCO zfK1=F3iSC~JN0983n|8nY?xij?~Q6kM^Dip&RFTu9?lt8TDO*HF4Jb(=-otmV=Vuq ztx&-Fq{>x5Z=st3Tf<)rx*k0ki`;_(kN4o(+_(H6b`L>}vP^fjU@nJa*{(SiJ0qgz zQLxWf$cPHFdhT>WTDN`>vgv9bnjo)oP%ok#rngS`nU|_tccl?g(fbW?RG-B?C8ObK z1?cH6XmW*;d(qm979aey5cagqTDBUia5LY;F)z+kRJ4L`H4gU4}g02FkjV|bfWn;xn z`imIxK?U;^B!wT1H@I^gni`9g@!y71ywS7~*#reO;yW3W+>S1>a4ah6w|^1E0vLAJ zgs_jlA0ljBFsVtm8a;euoC?=Y#tf!o*$;C<_X=L}+Fxamb{xtQlKaJaTXS%#5`5as zQ!ysL9ad#e6hFhrU|$gHhn!ul|ipa>@z!lmkjer*yZja1#u?qv^xZQ#+gRH+Q~>DPM;LO>V5c zvq@nwG9HD(9>{VIKH&Km@`FYoGqqN6wXFo)$yJPyL~Ar!r_ZTlQc zFYMcTH1NLbzKTs+9}3pKy|d$fGk_TkpB%oVGeOeS4^}mTIBXjXvT53=X0~$bV3mw# z+(f^u$yuZAV(wiifG9fQm{>O-wL9^|whuZKUQsyMDdQS*pwa;1lg14o@yQC<%>DM4 zRPf#WcK9{kI(fBeDOR^+UWglxq1GqQpTBFA8Cjjn`2NDuFI>C3(tyiIOyLvvrJ%H! zLd^C*|D%r`NNVt?S5x6pZ>9u*H#S`5KevB#AbFEJBlHxvL=7N=(nKHoIYF756(EK)}00{|+TDII4 zueA(B@AYo`Wm{q&N z>wq$Z>?5ZSJSS2sD=QOw{ly?~@E3NP0P8f1pt2=DYIDx)TKV#LgRE_KIcnb{^hNg8 zsu|AOYC}*OCn{{aRCQSZU=+tJ>G`SaX66`Y9kdAAUVPknbe51G7+5r9F({nLNw-9h@%3~;YN9wFww&7vWY-X*sU=MA} zSuM~BBIZ`LP&%f6Kr5)u(b@Urw5|DuyR{dWQ)*-Nx;xobj=DSQoV`ZUSO!;*4=+&w zbIwMpQ^q9JRZYJ}X2JoQB^GxYp^K1FS z@-zW3JdXU)s>$AJSG~wD^>r?iBj3vbfK3D32Fr^QHD6XwNkgrylAfI93h@uQdJ91b z2s}}VIAT@`{@BEyc?JNdm^^g3=@RSU-MXg1S?xNPu*2JwzBqtdrG)Ee+OuPWT6R7qgU9?lFFK5_n;b-;gHF5Y&rOA9LkL76yzA6L`P3wI+m0=US?6<7+R$G}-BPb(eI@R7*nB zUqF2GD@O=01Z-yIKUTL&w`_y#!(8u0PJ$zI@XN~J3uZNK&pVih-cOU!S=PT?4(qVt;lsg(<9&NMqD+>>!%y{_DC8d)=m>pdfg+39ebzBvJn(=gEo3 zZlDSY7hII!*{=4;-Hsc-S-Ws8FeVCWQM7lw`n5DQp?YRoP#t)|we_1rpCS&ct>|sy zpG)_Ez(DDy^`jz!z_aRBE?o8CPlKmX9A9a)5Jm3EX(`wrXkM0io8x-Xrc<`mTD9cW zS)(Tw_0Vk*QgEmRC-4Vq=i%9;0$3fxq(;#myS;qCQ0g8xjoX=K!XS;qCRA+ zfIo=)6e(r%ty{_Z6l6vMIauyd8^{~Fq!67jcN|*ib6)qMxA#2_KWbwX{6!- zVcGc?OL(hq2L#zSH$trDw6#Ume4O_OhaqZt-%Kb8zKdi@+{f(~rsI<~smZF|jvITW z+;{11NP!=JORx+^r9N+&M_HeNX!lEc$G3sM8bAs2oJa`}d?(o8Wqs(;l^07!gOE`z z2`W#t#gxKxt7if)w+dEDK-Fsa6%%h=9jy%#bj0$UcI1GEq|P^29FPaU)Vvn9>hCM} iJ;Ux6{dEURv*#cI9sdvr1rsZeuD1S_!ryN{{{H~>J!mKZ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-08.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-08.png index 4eabc80cb4f3798bb6ddc669e069ae362f547463..566ce734945c8177bce0695841ee5d475b1eece2 100644 GIT binary patch delta 16100 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 C_yLIk delta 16360 zcmc(FcU)6hyDp=nC@3h3sEF7i5J8{0b-`w-fIlp^;-@S*w7JKcr-uHdp=PhgPjJNNc?A-Zc zZl|1*!pp_8`{k8ouAGvQQI=IumXV1$`BSiKj%B?2 zDF-;GTuA>$V_47T96Nc4&-KnD&6wS{-#56Ss(!LgJm0t5@%V2qrJCv{bSog{i^4;+ z3P zq0CBit{1iJ^d1&rY$u@9SokENpzVoUmCQ9g{MIb;Gg=@(tynKhdTo3(`|5Ec zSmU~AQLOrtVwClf<*FbQVNQq?##9MbiSRRiSRMkKm%XFTn2A`~*0nNUH=9?LJq_px zwfJ}NOCNyhn}58&Xyl&aV?$oa!srOUmj5{qi4Au#U{3Gvb5LwB*IXkz!90OU=^r(+RkUOZoGAd)Kr5|zd%NPN6^%dGK3Y~ z=Pj_?Y5w%4;QGLbs-;F*I*GBt52OZDM$d$+g)j%>SqPFCsP;; zoyGjq3}&Ke2>qJ*H5`|CJ8F})-ANFhl|G7I*q9atj5_qPJsDF$S9$0az*gmqxA>l0 zFFMcbTpUE5r@PFy5m;rJgr}(^>*MWpT3NrRyi!H^q&92vZ(m(UmmQh`=%2l#H-i;R zD0iup+Ad#xb*HJyRMuHK?Ev!?;+yb|C;C4LoTLAmM8VU0hYvZ6c1UmZX+~XV_2E6H z?6uT0rjJ~Wc@cAT^weVyWcX8nvHeTeZ*}#{CR*xrOZ9{UTiZ3TO`}8pgs=VMLT=26 zQ2^bpi5NE^YVKtwE2~6W%M+J7z;qZfxoUUlGUv2tAZGwPp_U zm;OW`9RaqczS#IUwWa)C^=0~bJW_f!-hWa;A_LIQLrRYht3;&SJ-}%1RdB||swv!11uu?U|lF@A*BtqN?UoV!AstcI6Ti9!#GJ{1zhGP`@Gf zAaxEg+ZZzBzO|5X5*j0#e3X&$HWk?Z8f1==T8#%())y>D%0AYI`4{7*P32>e1+M6E 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