From 4a6d4f82a541d13917d3671daedd20c4fa109226 Mon Sep 17 00:00:00 2001 From: George Dregalo <37560650+gdregalo@users.noreply.github.com> Date: Tue, 24 Mar 2020 11:45:47 -0400 Subject: [PATCH] Android: Implement User wallets (Uphold). Issue# 8511. --- android/brave_java_sources.gni | 7 + android/java/AndroidManifest.xml | 8 + .../chrome/browser/BraveActivity.java | 36 +++ .../chrome/browser/BraveRewardsBalance.java | 68 +++++ .../browser/BraveRewardsExternalWallet.java | 122 +++++++++ .../browser/BraveRewardsNativeWorker.java | 75 +++++- .../chrome/browser/BraveRewardsObserver.java | 44 ++-- .../browser/BraveRewardsPanelPopup.java | 212 +++++++++++++-- .../chrome/browser/BraveRewardsPublisher.java | 21 ++ .../BraveRewardsSiteBannerActivity.java | 175 ++++++------- .../BraveRewardsUserWalletActivity.java | 131 ++++++++++ .../BraveRewardsVerifyWalletActivity.java | 72 ++++++ .../chromium/chrome/browser/BraveUphold.java | 147 +++++++++++ .../BraveExternalNavigationHandler.java | 51 ++++ .../toolbar/top/BraveToolbarLayout.java | 11 + android/java/res/drawable-hdpi/check.png | Bin 0 -> 1167 bytes android/java/res/drawable-hdpi/disclosure.png | Bin 0 -> 608 bytes android/java/res/drawable-hdpi/group.png | Bin 0 -> 6231 bytes .../java/res/drawable-hdpi/uphold_green.png | Bin 0 -> 1790 bytes .../java/res/drawable-hdpi/uphold_white.png | Bin 0 -> 872 bytes .../res/drawable-hdpi/verified_disclosure.png | Bin 0 -> 261 bytes android/java/res/drawable-hdpi/wallet_add.png | Bin 0 -> 893 bytes .../res/drawable-hdpi/wallet_withdraw.png | Bin 0 -> 977 bytes android/java/res/drawable-mdpi/check.png | Bin 0 -> 825 bytes android/java/res/drawable-mdpi/disclosure.png | Bin 0 -> 449 bytes android/java/res/drawable-mdpi/group.png | Bin 0 -> 3993 bytes .../java/res/drawable-mdpi/uphold_green.png | Bin 0 -> 1005 bytes .../java/res/drawable-mdpi/uphold_white.png | Bin 0 -> 518 bytes .../res/drawable-mdpi/verified_disclosure.png | Bin 0 -> 235 bytes android/java/res/drawable-mdpi/wallet_add.png | Bin 0 -> 584 bytes .../res/drawable-mdpi/wallet_withdraw.png | Bin 0 -> 629 bytes android/java/res/drawable-xhdpi/check.png | Bin 0 -> 1528 bytes .../java/res/drawable-xhdpi/disclosure.png | Bin 0 -> 718 bytes android/java/res/drawable-xhdpi/group.png | Bin 0 -> 8296 bytes .../java/res/drawable-xhdpi/uphold_green.png | Bin 0 -> 2614 bytes .../java/res/drawable-xhdpi/uphold_white.png | Bin 0 -> 1116 bytes .../drawable-xhdpi/verified_disclosure.png | Bin 0 -> 310 bytes .../java/res/drawable-xhdpi/wallet_add.png | Bin 0 -> 834 bytes .../res/drawable-xhdpi/wallet_withdraw.png | Bin 0 -> 934 bytes android/java/res/drawable-xxhdpi/check.png | Bin 0 -> 2423 bytes .../java/res/drawable-xxhdpi/disclosure.png | Bin 0 -> 1044 bytes android/java/res/drawable-xxhdpi/group.png | Bin 0 -> 12719 bytes .../java/res/drawable-xxhdpi/uphold_green.png | Bin 0 -> 4404 bytes .../java/res/drawable-xxhdpi/uphold_white.png | Bin 0 -> 1837 bytes .../drawable-xxhdpi/verified_disclosure.png | Bin 0 -> 386 bytes .../java/res/drawable-xxhdpi/wallet_add.png | Bin 0 -> 1222 bytes .../res/drawable-xxhdpi/wallet_withdraw.png | Bin 0 -> 1373 bytes android/java/res/drawable-xxxhdpi/check.png | Bin 0 -> 3306 bytes .../java/res/drawable-xxxhdpi/disclosure.png | Bin 0 -> 1407 bytes android/java/res/drawable-xxxhdpi/group.png | Bin 0 -> 17517 bytes .../res/drawable-xxxhdpi/uphold_green.png | Bin 0 -> 6115 bytes .../res/drawable-xxxhdpi/uphold_white.png | Bin 0 -> 2473 bytes .../drawable-xxxhdpi/verified_disclosure.png | Bin 0 -> 427 bytes .../java/res/drawable-xxxhdpi/wallet_add.png | Bin 0 -> 1259 bytes .../res/drawable-xxxhdpi/wallet_withdraw.png | Bin 0 -> 1388 bytes .../res/drawable/rect_round_corners_12.xml | 9 + .../res/drawable/rect_up_round_corners_12.xml | 10 + .../drawable/wallet_disconnected_button.xml | 25 ++ .../res/drawable/wallet_verify_button.xml | 25 ++ .../layout-land/verify_wallet_activity.xml | 177 +++++++++++++ .../java/res/layout/brave_rewards_panel.xml | 223 +--------------- .../res/layout/brave_rewards_panel_header.xml | 242 ++++++++++++++++++ .../java/res/layout/user_wallet_activity.xml | 146 +++++++++++ .../res/layout/verify_wallet_activity.xml | 138 ++++++++++ android/java/res/values-h380dp/dimens.xml | 18 ++ android/java/res/values-h500dp/dimens.xml | 10 + android/java/res/values-h568dp/dimens.xml | 19 ++ android/java/res/values-h730dp/dimens.xml | 18 ++ android/java/res/values-h748dp/dimens.xml | 19 ++ android/java/res/values-h820dp/dimens.xml | 19 ++ android/java/res/values/brave_colors.xml | 6 + android/java/res/values/brave_dimens.xml | 20 ++ android/java/res/values/brave_styles.xml | 8 + .../android/brave_rewards_native_worker.cc | 98 ++++++- .../android/brave_rewards_native_worker.h | 33 ++- .../android/strings/android_brave_strings.grd | 94 ++++++- .../org/brave/bytecode/BraveClassAdapter.java | 1 + ...ExternalNavigationHandlerClassAdapter.java | 29 +++ build/android/bytecode/java_sources.gni | 1 + components/brave_rewards/browser/balance.cc | 27 ++ components/brave_rewards/browser/balance.h | 7 + .../brave_rewards/browser/external_wallet.cc | 19 ++ .../brave_rewards/browser/external_wallet.h | 1 + ...er-TabbedModeTabDelegateFactory.java.patch | 13 + 84 files changed, 2256 insertions(+), 379 deletions(-) create mode 100644 android/java/org/chromium/chrome/browser/BraveRewardsBalance.java create mode 100644 android/java/org/chromium/chrome/browser/BraveRewardsExternalWallet.java create mode 100644 android/java/org/chromium/chrome/browser/BraveRewardsPublisher.java create mode 100644 android/java/org/chromium/chrome/browser/BraveRewardsUserWalletActivity.java create mode 100644 android/java/org/chromium/chrome/browser/BraveRewardsVerifyWalletActivity.java create mode 100644 android/java/org/chromium/chrome/browser/BraveUphold.java create mode 100644 android/java/org/chromium/chrome/browser/externalnav/BraveExternalNavigationHandler.java create mode 100644 android/java/res/drawable-hdpi/check.png create mode 100644 android/java/res/drawable-hdpi/disclosure.png create mode 100644 android/java/res/drawable-hdpi/group.png create mode 100644 android/java/res/drawable-hdpi/uphold_green.png create mode 100644 android/java/res/drawable-hdpi/uphold_white.png create mode 100644 android/java/res/drawable-hdpi/verified_disclosure.png create mode 100644 android/java/res/drawable-hdpi/wallet_add.png create mode 100644 android/java/res/drawable-hdpi/wallet_withdraw.png create mode 100644 android/java/res/drawable-mdpi/check.png create mode 100644 android/java/res/drawable-mdpi/disclosure.png create mode 100644 android/java/res/drawable-mdpi/group.png create mode 100644 android/java/res/drawable-mdpi/uphold_green.png create mode 100644 android/java/res/drawable-mdpi/uphold_white.png create mode 100644 android/java/res/drawable-mdpi/verified_disclosure.png create mode 100644 android/java/res/drawable-mdpi/wallet_add.png create mode 100644 android/java/res/drawable-mdpi/wallet_withdraw.png create mode 100644 android/java/res/drawable-xhdpi/check.png create mode 100644 android/java/res/drawable-xhdpi/disclosure.png create mode 100644 android/java/res/drawable-xhdpi/group.png create mode 100644 android/java/res/drawable-xhdpi/uphold_green.png create mode 100644 android/java/res/drawable-xhdpi/uphold_white.png create mode 100644 android/java/res/drawable-xhdpi/verified_disclosure.png create mode 100644 android/java/res/drawable-xhdpi/wallet_add.png create mode 100644 android/java/res/drawable-xhdpi/wallet_withdraw.png create mode 100644 android/java/res/drawable-xxhdpi/check.png create mode 100644 android/java/res/drawable-xxhdpi/disclosure.png create mode 100644 android/java/res/drawable-xxhdpi/group.png create mode 100644 android/java/res/drawable-xxhdpi/uphold_green.png create mode 100644 android/java/res/drawable-xxhdpi/uphold_white.png create mode 100644 android/java/res/drawable-xxhdpi/verified_disclosure.png create mode 100644 android/java/res/drawable-xxhdpi/wallet_add.png create mode 100644 android/java/res/drawable-xxhdpi/wallet_withdraw.png create mode 100644 android/java/res/drawable-xxxhdpi/check.png create mode 100644 android/java/res/drawable-xxxhdpi/disclosure.png create mode 100644 android/java/res/drawable-xxxhdpi/group.png create mode 100644 android/java/res/drawable-xxxhdpi/uphold_green.png create mode 100644 android/java/res/drawable-xxxhdpi/uphold_white.png create mode 100644 android/java/res/drawable-xxxhdpi/verified_disclosure.png create mode 100644 android/java/res/drawable-xxxhdpi/wallet_add.png create mode 100644 android/java/res/drawable-xxxhdpi/wallet_withdraw.png create mode 100644 android/java/res/drawable/rect_round_corners_12.xml create mode 100644 android/java/res/drawable/rect_up_round_corners_12.xml create mode 100644 android/java/res/drawable/wallet_disconnected_button.xml create mode 100644 android/java/res/drawable/wallet_verify_button.xml create mode 100644 android/java/res/layout-land/verify_wallet_activity.xml create mode 100644 android/java/res/layout/brave_rewards_panel_header.xml create mode 100644 android/java/res/layout/user_wallet_activity.xml create mode 100644 android/java/res/layout/verify_wallet_activity.xml create mode 100644 android/java/res/values-h380dp/dimens.xml create mode 100644 android/java/res/values-h730dp/dimens.xml create mode 100644 build/android/bytecode/java/org/brave/bytecode/BraveExternalNavigationHandlerClassAdapter.java create mode 100644 patches/chrome-android-java-src-org-chromium-chrome-browser-TabbedModeTabDelegateFactory.java.patch diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index b8d853d128d2..b91594fe8929 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -17,13 +17,18 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/BraveIntentHandler.java", "../../brave/android/java/org/chromium/chrome/browser/BraveLaunchIntentDispatcher.java", "../../brave/android/java/org/chromium/chrome/browser/BraveRelaunchUtils.java", + "../../brave/android/java/org/chromium/chrome/browser/BraveRewardsBalance.java", "../../brave/android/java/org/chromium/chrome/browser/BraveSyncWorker.java", "../../brave/android/java/org/chromium/chrome/browser/BraveRewardsNativeWorker.java", "../../brave/android/java/org/chromium/chrome/browser/BraveRewardsObserver.java", "../../brave/android/java/org/chromium/chrome/browser/BraveRewardsDonationSentActivity.java", + "../../brave/android/java/org/chromium/chrome/browser/BraveRewardsExternalWallet.java", "../../brave/android/java/org/chromium/chrome/browser/BraveRewardsHelper.java", "../../brave/android/java/org/chromium/chrome/browser/BraveRewardsPanelPopup.java", + "../../brave/android/java/org/chromium/chrome/browser/BraveRewardsPublisher.java", "../../brave/android/java/org/chromium/chrome/browser/BraveRewardsSiteBannerActivity.java", + "../../brave/android/java/org/chromium/chrome/browser/BraveRewardsUserWalletActivity.java", + "../../brave/android/java/org/chromium/chrome/browser/BraveRewardsVerifyWalletActivity.java", "../../brave/android/java/org/chromium/chrome/browser/appmenu/BraveShieldsMenuAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/appmenu/BraveShieldsMenuHandler.java", "../../brave/android/java/org/chromium/chrome/browser/appmenu/BraveShieldsMenuObserver.java", @@ -32,6 +37,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/bookmarks/BraveBookmarkUtils.java", "../../brave/android/java/org/chromium/chrome/browser/bookmarks/BraveBookmarkWorker.java", "../../brave/android/java/org/chromium/chrome/browser/document/BraveLauncherActivity.java", + "../../brave/android/java/org/chromium/chrome/browser/externalnav/BraveExternalNavigationHandler.java", "../../brave/android/java/org/chromium/chrome/browser/flags/BraveFeatureUtilities.java", "../../brave/android/java/org/chromium/chrome/browser/help/BraveHelpAndFeedback.java", "../../brave/android/java/org/chromium/chrome/browser/notifications/BraveNotificationManagerProxyImpl.java", @@ -39,6 +45,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/notifications/BraveNotificationSettingsBridge.java", "../../brave/android/java/org/chromium/chrome/browser/notifications/BraveOnboardingNotification.java", "../../brave/android/java/org/chromium/chrome/browser/notifications/BraveSetDefaultBrowserNotificationService.java", + "../../brave/android/java/org/chromium/chrome/browser/BraveUphold.java", "../../brave/android/java/org/chromium/chrome/browser/notifications/channels/BraveChannelDefinitions.java", "../../brave/android/java/org/chromium/chrome/browser/ntp/BraveDuckDuckGoOfferView.java", "../../brave/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPageLayout.java", diff --git a/android/java/AndroidManifest.xml b/android/java/AndroidManifest.xml index 2cb121245c0b..57e80fcf28ba 100644 --- a/android/java/AndroidManifest.xml +++ b/android/java/AndroidManifest.xml @@ -12,6 +12,14 @@ + + + + diff --git a/android/java/org/chromium/chrome/browser/BraveActivity.java b/android/java/org/chromium/chrome/browser/BraveActivity.java index bf3170d5d127..c779ee20c228 100644 --- a/android/java/org/chromium/chrome/browser/BraveActivity.java +++ b/android/java/org/chromium/chrome/browser/BraveActivity.java @@ -17,6 +17,7 @@ import android.os.Build; import android.os.Bundle; import android.provider.Settings; +import android.text.TextUtils; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; @@ -59,11 +60,14 @@ @JNINamespace("chrome::android") public abstract class BraveActivity extends ChromeActivity { public static final int SITE_BANNER_REQUEST_CODE = 33; + public static final int VERIFY_WALLET_ACTIVITY_REQUEST_CODE = 34; + public static final int USER_WALLET_ACTIVITY_REQUEST_CODE = 35; public static final String ADD_FUNDS_URL = "chrome://rewards/#add-funds"; public static final String REWARDS_SETTINGS_URL = "chrome://rewards/"; public static final String REWARDS_AC_SETTINGS_URL = "chrome://rewards/contribute"; public static final String REWARDS_LEARN_MORE_URL = "https://brave.com/faq-rewards/#unclaimed-funds"; private static final String PREF_CLOSE_TABS_ON_EXIT = "close_tabs_on_exit"; + public static final String OPEN_URL = "open_url"; /** * Settings for sending local notification reminders. @@ -317,6 +321,22 @@ public void OnRewardsPanelDismiss() { } } + public void dismissRewardsPanel() { + BraveToolbarLayout layout = (BraveToolbarLayout)findViewById(R.id.toolbar); + assert layout != null; + if (layout != null) { + layout.dismissRewardsPanel(); + } + } + + public void openRewardsPanel() { + BraveToolbarLayout layout = (BraveToolbarLayout)findViewById(R.id.toolbar); + assert layout != null; + if (layout != null) { + layout.openRewardsPanel(); + } + } + public Tab selectExistingTab(String url) { Tab tab = getActivityTab(); if (tab != null && tab.getUrl().equals(url)) { @@ -373,4 +393,20 @@ static public BraveActivity getBraveActivity() { return null; } + + @Override + public void onActivityResult (int requestCode, int resultCode, + Intent data) { + if (resultCode == RESULT_OK && + (requestCode == VERIFY_WALLET_ACTIVITY_REQUEST_CODE || + requestCode == USER_WALLET_ACTIVITY_REQUEST_CODE || + requestCode == SITE_BANNER_REQUEST_CODE) ) { + dismissRewardsPanel(); + String open_url = data.getStringExtra(BraveActivity.OPEN_URL); + if (! TextUtils.isEmpty(open_url)) { + openNewOrSelectExistingTab(open_url); + } + } + super.onActivityResult(requestCode, resultCode, data); + } } diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsBalance.java b/android/java/org/chromium/chrome/browser/BraveRewardsBalance.java new file mode 100644 index 000000000000..5c560804abf5 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/BraveRewardsBalance.java @@ -0,0 +1,68 @@ +/** Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.chromium.chrome.browser; + +import androidx.annotation.VisibleForTesting; +import java.util.Iterator; +import java.util.Map; +import java.util.HashMap; + +import org.json.JSONException; +import org.json.JSONObject; + +class BraveRewardsBalance { + public static final String WALLET_ANONYMOUS = "anonymous"; + public static final String WALLET_UPHOLD = "uphold"; + public static final String WALLET_BLINDED = "blinded"; + + /** + * matching consts in + * src/brave/components/brave_rewards/browser/balance.h + */ + public static final String JSON_TOTAL = "total"; + public static final String JSON_RATES = "rates"; + public static final String JSON_WALLETS = "wallets"; + + double mTotal; + Map mRates; + Map mWallets; + + BraveRewardsBalance (String json_balance) throws JSONException { + fromJson (json_balance); + } + + private void fromJson(String json_balance) throws JSONException { + JSONObject jsonroot = new JSONObject(json_balance); + mTotal = jsonroot.getDouble(JSON_TOTAL); + + mRates = new HashMap <>(); + JSONObject json_rates = jsonroot.getJSONObject(JSON_RATES); + Iterator keys = json_rates.keys(); + while(keys.hasNext()) { + String key = keys.next(); + Double val = json_rates.getDouble(key); + mRates.put (key, val); + } + + mWallets = new HashMap <>(); + JSONObject json_wallets = jsonroot.getJSONObject(JSON_WALLETS); + keys = json_wallets.keys(); + while(keys.hasNext()) { + String key = keys.next(); + Double val = json_wallets.getDouble(key); + mWallets.put (key, val); + } + } + + @VisibleForTesting + @Override + public String toString() { + return "BraveRewardsBalance{" + + "mTotal=" + mTotal + + ", mRates=" + mRates + + ", mWallets=" + mWallets +'}'; + } +} \ No newline at end of file diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsExternalWallet.java b/android/java/org/chromium/chrome/browser/BraveRewardsExternalWallet.java new file mode 100644 index 000000000000..efe34b212120 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/BraveRewardsExternalWallet.java @@ -0,0 +1,122 @@ +/** Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.chromium.chrome.browser; + +import android.content.Context; +import androidx.annotation.IntDef; +import androidx.annotation.VisibleForTesting; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import org.chromium.base.ContextUtils; +import org.chromium.chrome.R; +import org.json.JSONException; +import org.json.JSONObject; + +class BraveRewardsExternalWallet { + //fields + public static final String ACCOUNT_URL = "account_url"; + public static final String ADD_URL = "add_url"; + public static final String ADDRESS = "address"; + public static final String STATUS = "status"; + public static final String TOKEN = "token"; + public static final String TYPE = "type"; + public static final String USER_NAME = "user_name"; + public static final String VERIFY_URL = "verify_url"; + public static final String WITHDRAW_URL = "withdraw_url"; + + //WalletStatus @ + //vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom + @Retention(RetentionPolicy.SOURCE) + @IntDef({NOT_CONNECTED, CONNECTED, VERIFIED, DISCONNECTED_NOT_VERIFIED, + DISCONNECTED_VERIFIED, PENDING}) + public @interface WalletStatus {} + public static final int NOT_CONNECTED = 0; + public static final int CONNECTED = 1; + public static final int VERIFIED = 2; + public static final int DISCONNECTED_NOT_VERIFIED = 3; + public static final int DISCONNECTED_VERIFIED = 4; + public static final int PENDING = 5; + + public String mAccount_url; + public String mAdd_url; + public String mAddress; + @WalletStatus public int mStatus; + public String mToken; + public String mType; + public String mUser_name; + public String mVerify_url; + public String mWithdraw_url; + + + BraveRewardsExternalWallet (String json_external_wallet) throws JSONException { + fromJson (json_external_wallet); + } + + private void fromJson(String json_external_wallet) throws JSONException { + JSONObject jsonObj = new JSONObject(json_external_wallet); + mAccount_url = jsonObj.getString(ACCOUNT_URL); + mAdd_url = jsonObj.getString(ADD_URL); + mAddress = jsonObj.getString(ADDRESS); + mStatus = jsonObj.getInt(STATUS); + mToken = jsonObj.getString(TOKEN); + mType = jsonObj.getString(TYPE); + mUser_name = jsonObj.getString(USER_NAME); + mVerify_url = jsonObj.getString(VERIFY_URL); + mWithdraw_url = jsonObj.getString(WITHDRAW_URL); + } + + @VisibleForTesting + @Override + public String toString() { + return "BraveRewardsExternalWallet{" + + "mAccount_url='" + mAccount_url + '\'' + + ", mAdd_url='" + mAdd_url + '\'' + + ", mAddress='" + mAddress + '\'' + + ", mStatus=" + mStatus + + ", mToken='" + mToken + '\'' + + ", mType='" + mType + '\'' + + ", mUser_name='" + mUser_name + '\'' + + ", mVerify_url='" + mVerify_url + '\'' + + ", mWithdraw_url='" + mWithdraw_url + '\'' + + '}'; + } + + public static String WalletStatusToString (@WalletStatus int status){ + String value = ""; + Context context = ContextUtils.getApplicationContext(); + switch (status){ + case NOT_CONNECTED: + value = context.getResources().getString( + R.string.user_wallet_status_not_connected); + break; + case CONNECTED: + value = context.getResources().getString( + R.string.user_wallet_status_connected); + break; + case VERIFIED: + value = context.getResources().getString( + R.string.user_wallet_status_verified); + break; + case DISCONNECTED_NOT_VERIFIED: + value = context.getResources().getString( + R.string.user_wallet_status_disconnected_not_verified); + break; + case DISCONNECTED_VERIFIED: + value = context.getResources().getString( + R.string.user_wallet_status_disconnected_verified); + break; + case PENDING: + value = context.getResources().getString( + R.string.user_wallet_status_pending); + break; + default: + break; + } + return value; + } +} \ No newline at end of file diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsNativeWorker.java b/android/java/org/chromium/chrome/browser/BraveRewardsNativeWorker.java index 4391e81831ea..8ce624183e05 100644 --- a/android/java/org/chromium/chrome/browser/BraveRewardsNativeWorker.java +++ b/android/java/org/chromium/chrome/browser/BraveRewardsNativeWorker.java @@ -7,14 +7,18 @@ package org.chromium.chrome.browser; import android.os.Handler; +import androidx.annotation.Nullable; import org.chromium.base.Log; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; +import org.chromium.chrome.browser.BraveRewardsBalance; import org.chromium.chrome.browser.BraveRewardsHelper; import org.chromium.chrome.browser.BraveRewardsObserver; +import org.chromium.chrome.browser.BraveRewardsPublisher.PublisherStatus; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.util.UrlConstants; +import org.json.JSONException; import java.util.ArrayList; import java.util.List; @@ -43,6 +47,7 @@ public interface PublisherObserver { void onFrontTabPublisherChanged(boolean ver public static final int LEDGER_OK = 0; public static final int LEDGER_ERROR = 1; public static final int WALLET_CREATED = 12; + public static final int BAT_NOT_ALLOWED = 25; public static final int SAFETYNET_ATTESTATION_FAILED = 27; private static final int REWARDS_UNKNOWN = 0; @@ -190,9 +195,18 @@ public void GetWalletProperties() { } } - public double GetWalletBalance() { + @Nullable + public BraveRewardsBalance GetWalletBalance() { synchronized(lock) { - return nativeGetWalletBalance(mNativeBraveRewardsNativeWorker); + String json = nativeGetWalletBalance(mNativeBraveRewardsNativeWorker); + BraveRewardsBalance balance = null; + try{ + balance = new BraveRewardsBalance (json); + } + catch (JSONException e) { + balance = null; + } + return balance; } } @@ -244,9 +258,9 @@ public boolean GetPublisherExcluded(int tabId) { } } - public boolean GetPublisherVerified(int tabId) { + public @PublisherStatus int GetPublisherStatus(int tabId) { synchronized(lock) { - return nativeGetPublisherVerified(mNativeBraveRewardsNativeWorker, tabId); + return nativeGetPublisherStatus(mNativeBraveRewardsNativeWorker, tabId); } } @@ -398,6 +412,25 @@ public boolean IsAnonWallet() { } } + public void GetExternalWallet(String wallet_type) { + synchronized (lock) { + nativeGetExternalWallet(mNativeBraveRewardsNativeWorker, wallet_type); + } + } + + public void DisconnectWallet(String wallet_type) { + synchronized (lock) { + nativeDisconnectWallet(mNativeBraveRewardsNativeWorker, wallet_type); + } + } + + public void ProcessRewardsPageUrl(String path, String query) { + synchronized (lock) { + nativeProcessRewardsPageUrl(mNativeBraveRewardsNativeWorker, + path, query); + } + } + @CalledByNative public void OnGetRewardsMainEnabled(boolean enabled) { int oldRewardsStatus = rewardsStatus; @@ -452,7 +485,9 @@ public void run() { @CalledByNative public void OnPublisherInfo(int tabId) { - boolean verified = GetPublisherVerified(tabId); + @PublisherStatus int pubStatus = GetPublisherStatus(tabId); + boolean verified = (pubStatus == BraveRewardsPublisher.CONNECTED || + pubStatus == BraveRewardsPublisher.VERIFIED) ? true : false; NotifyPublisherObservers(verified); // Notify BraveRewardsObserver (panel). @@ -561,12 +596,35 @@ public void OnFetchPromotions() { } } + @CalledByNative + public void OnGetExternalWallet(int error_code, String external_wallet) { + for (BraveRewardsObserver observer : mObservers) { + observer.OnGetExternalWallet(error_code, external_wallet); + } + } + + @CalledByNative + public void OnDisconnectWallet(int error_code, String external_wallet) { + for (BraveRewardsObserver observer : mObservers) { + observer.OnDisconnectWallet(error_code, external_wallet); + } + } + + @CalledByNative + public void OnProcessRewardsPageUrl(int error_code, String wallet_type, + String action, String json_args) { + for (BraveRewardsObserver observer : mObservers) { + observer.OnProcessRewardsPageUrl(error_code, wallet_type, + action, json_args); + } + } + private native void nativeInit(); private native void nativeDestroy(long nativeBraveRewardsNativeWorker); private native void nativeCreateWallet(long nativeBraveRewardsNativeWorker); private native void nativeWalletExist(long nativeBraveRewardsNativeWorker); private native void nativeGetWalletProperties(long nativeBraveRewardsNativeWorker); - private native double nativeGetWalletBalance(long nativeBraveRewardsNativeWorker); + private native String nativeGetWalletBalance(long nativeBraveRewardsNativeWorker); private native double nativeGetWalletRate(long nativeBraveRewardsNativeWorker, String rate); private native void nativeGetPublisherInfo(long nativeBraveRewardsNativeWorker, int tabId, String host); private native String nativeGetPublisherURL(long nativeBraveRewardsNativeWorker, int tabId); @@ -575,7 +633,7 @@ public void OnFetchPromotions() { private native String nativeGetPublisherId(long nativeBraveRewardsNativeWorker, int tabId); private native int nativeGetPublisherPercent(long nativeBraveRewardsNativeWorker, int tabId); private native boolean nativeGetPublisherExcluded(long nativeBraveRewardsNativeWorker, int tabId); - private native boolean nativeGetPublisherVerified(long nativeBraveRewardsNativeWorker, int tabId); + private native int nativeGetPublisherStatus(long nativeBraveRewardsNativeWorker, int tabId); private native void nativeIncludeInAutoContribution(long nativeBraveRewardsNativeWorker, int tabId, boolean exclude); private native void nativeRemovePublisherFromMap(long nativeBraveRewardsNativeWorker, int tabId); @@ -604,4 +662,7 @@ private native boolean nativeIsCurrentPublisherInRecurrentDonations(long nativeB private native int nativeGetAdsPerHour(long nativeBraveRewardsNativeWorker); private native void nativeSetAdsPerHour(long nativeBraveRewardsNativeWorker, int value); private native boolean nativeIsAnonWallet(long nativeBraveRewardsNativeWorker); + private native void nativeGetExternalWallet(long nativeBraveRewardsNativeWorker, String wallet_type); + private native void nativeDisconnectWallet(long nativeBraveRewardsNativeWorker, String wallet_type); + private native void nativeProcessRewardsPageUrl(long nativeBraveRewardsNativeWorker, String path, String query); } diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsObserver.java b/android/java/org/chromium/chrome/browser/BraveRewardsObserver.java index 707ff681118d..bd57a648fdea 100644 --- a/android/java/org/chromium/chrome/browser/BraveRewardsObserver.java +++ b/android/java/org/chromium/chrome/browser/BraveRewardsObserver.java @@ -5,24 +5,30 @@ package org.chromium.chrome.browser; public interface BraveRewardsObserver { - public void OnWalletInitialized(int error_code); - public void OnWalletProperties(int error_code); - public void OnPublisherInfo(int tabId); - public void OnGetCurrentBalanceReport(double[] report); - public void OnNotificationAdded(String id, int type, long timestamp, - String[] args); - public void OnNotificationsCount(int count); - public void OnGetLatestNotification(String id, int type, long timestamp, - String[] args); - public void OnNotificationDeleted(String id); - public void OnIsWalletCreated(boolean created); - public void OnGetPendingContributionsTotal(double amount); - public void OnGetRewardsMainEnabled(boolean enabled); - public void OnGetAutoContributeProps(); - public void OnGetReconcileStamp(long timestamp); - public void OnRecurringDonationUpdated(); - public void OnResetTheWholeState(boolean success); - public void OnRewardsMainEnabled(boolean enabled); - public void OnFetchPromotions(); + default public void OnWalletInitialized(int error_code) {}; + default public void OnWalletProperties(int error_code) {}; + default public void OnPublisherInfo(int tabId) {}; + default public void OnGetCurrentBalanceReport(double[] report) {}; + default public void OnNotificationAdded(String id, int type, long timestamp, + String[] args) {}; + default public void OnNotificationsCount(int count) {}; + default public void OnGetLatestNotification(String id, int type, long timestamp, + String[] args) {}; + default public void OnNotificationDeleted(String id) {}; + default public void OnIsWalletCreated(boolean created) {}; + default public void OnGetPendingContributionsTotal(double amount) {}; + default public void OnGetRewardsMainEnabled(boolean enabled) {}; + default public void OnGetAutoContributeProps() {}; + default public void OnGetReconcileStamp(long timestamp) {}; + default public void OnRecurringDonationUpdated() {}; + default public void OnResetTheWholeState(boolean success) {}; + default public void OnRewardsMainEnabled(boolean enabled) {}; + default public void OnFetchPromotions() {}; default public void OnGrantFinish(int result) {}; + default public void OnGetExternalWallet(int error_code, + String external_wallet) {}; + default public void OnDisconnectWallet(int error_code, + String external_wallet) {}; + default public void OnProcessRewardsPageUrl(int error_code, + String wallet_type, String action, String json_args ) {}; } diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsPanelPopup.java b/android/java/org/chromium/chrome/browser/BraveRewardsPanelPopup.java index e356004bbd7b..14ab09892365 100644 --- a/android/java/org/chromium/chrome/browser/BraveRewardsPanelPopup.java +++ b/android/java/org/chromium/chrome/browser/BraveRewardsPanelPopup.java @@ -20,6 +20,7 @@ import android.os.Build; import android.text.Html; import android.text.Spanned; +import android.text.TextUtils; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -54,8 +55,12 @@ import org.chromium.base.SysUtils; import org.chromium.base.task.AsyncTask; import org.chromium.chrome.browser.BraveAdsNativeHelper; +import org.chromium.chrome.browser.BraveRewardsExternalWallet; +import org.chromium.chrome.browser.BraveRewardsExternalWallet.WalletStatus; import org.chromium.chrome.browser.BraveRewardsHelper; import org.chromium.chrome.browser.BraveRewardsObserver; +import org.chromium.chrome.browser.BraveRewardsBalance; +import org.chromium.chrome.browser.BraveRewardsPublisher.PublisherStatus; import org.chromium.chrome.browser.BraveActivity; import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.dialogs.BraveAdsSignupDialog; @@ -67,10 +72,10 @@ import org.chromium.chrome.browser.util.PackageUtils; import org.chromium.chrome.R; import org.chromium.content_public.browser.LoadUrlParams; -import org.chromium.base.ContextUtils; import java.io.IOException; import java.lang.ref.WeakReference; +import org.json.JSONException; import java.math.RoundingMode; import java.net.URL; import java.text.DecimalFormat; @@ -168,6 +173,8 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward private String batPointsText; private boolean isAnonWallet; + private BraveRewardsExternalWallet mExternal_wallet; + public static boolean isBraveRewardsEnabled() { SharedPreferences sharedPreferences = ContextUtils.getAppSharedPreferences(); return sharedPreferences.getBoolean(BraveRewardsPanelPopup.PREF_IS_BRAVE_REWARDS_ENABLED, false); @@ -334,18 +341,6 @@ public void onClick(View v) { ((TextView)root.findViewById(R.id.br_bat)).setText(batPointsText); - btAddFunds = (Button)root.findViewById(R.id.br_add_funds); - if (btAddFunds != null) { - if(btAddFunds.getVisibility() == View.VISIBLE) - btAddFunds.setVisibility(isAnonWallet ? View.GONE : View.VISIBLE); - btAddFunds.setOnClickListener((new View.OnClickListener() { - @Override - public void onClick(View v) { - mBraveActivity.openNewOrSelectExistingTab(BraveActivity.ADD_FUNDS_URL); - dismiss(); - } - })); - } btRewardsSettings = (Button)root.findViewById(R.id.br_rewards_settings); if (btRewardsSettings != null) { btRewardsSettings.setOnClickListener((new View.OnClickListener() { @@ -530,6 +525,9 @@ public void onNothingSelected(AdapterView parent) { //Do nothing } }); + + mBraveRewardsNativeWorker.GetExternalWallet( + BraveRewardsBalance.WALLET_UPHOLD); } private void startJoinRewardsAnimation(){ @@ -1113,7 +1111,11 @@ public void OnWalletProperties(int error_code) { if (BraveRewardsNativeWorker.LEDGER_OK == error_code) { DismissNotification(REWARDS_NOTIFICATION_NO_INTERNET_ID); if (mBraveRewardsNativeWorker != null) { - double balance = mBraveRewardsNativeWorker.GetWalletBalance(); + double balance = .0; + BraveRewardsBalance balance_obj = mBraveRewardsNativeWorker.GetWalletBalance(); + if (balance_obj != null) { + balance = balance_obj.mTotal; + } DecimalFormat df = new DecimalFormat("#.#"); df.setRoundingMode(RoundingMode.FLOOR); @@ -1261,25 +1263,50 @@ public void OnPublisherInfo(int tabId) { btAutoContribute.setChecked(!thisObject.mBraveRewardsNativeWorker.GetPublisherExcluded(currentTabId)); btAutoContribute.setOnCheckedChangeListener(autoContributeSwitchListener); } + + // set publisher verified/unverified status String verified_text = ""; TextView tvVerified = (TextView)root.findViewById(R.id.publisher_verified); - if (thisObject.mBraveRewardsNativeWorker.GetPublisherVerified(currentTabId)) { + @PublisherStatus int pubStatus = + thisObject.mBraveRewardsNativeWorker.GetPublisherStatus(currentTabId); + if (pubStatus == BraveRewardsPublisher.CONNECTED || + pubStatus == BraveRewardsPublisher.VERIFIED) { verified_text = root.getResources().getString(R.string.brave_ui_verified_publisher); } else { verified_text = root.getResources().getString(R.string.brave_ui_not_verified_publisher); - tv = (TextView)root.findViewById(R.id.publisher_not_verified); - String verified_description = - root.getResources().getString(R.string.brave_ui_not_verified_publisher_description); - verified_description += "
" + - root.getResources().getString(R.string.learn_more) + "."; - Spanned toInsert = BraveRewardsHelper.spannedFromHtmlString(verified_description); - tv.setText(toInsert); - tv.setVisibility(View.VISIBLE); tvVerified.setCompoundDrawablesWithIntrinsicBounds(R.drawable.bat_unverified, 0, 0, 0); } tvVerified.setText(verified_text); tvVerified.setVisibility(View.VISIBLE); + // show |brave_ui_panel_connected_text| text if + // publisher is CONNECTED and user doesn't have any Brave funds (anonymous or + // blinded wallets) + String verified_description = ""; + if (pubStatus == BraveRewardsPublisher.CONNECTED) { + BraveRewardsBalance balance_obj = mBraveRewardsNativeWorker.GetWalletBalance(); + if (balance_obj != null) { + double braveFunds = balance_obj.mWallets.get(BraveRewardsBalance.WALLET_ANONYMOUS) + + balance_obj.mWallets.get(BraveRewardsBalance.WALLET_BLINDED); + if (braveFunds <= 0) { + verified_description = root.getResources().getString(R.string.brave_ui_panel_connected_text); + } + } + } + else if (pubStatus == BraveRewardsPublisher.NOT_VERIFIED) { + verified_description = root.getResources().getString( + R.string.brave_ui_not_verified_publisher_description); + } + + if (!TextUtils.isEmpty(verified_description)) { + verified_description += "
" + + root.getResources().getString(R.string.learn_more) + "."; + Spanned toInsert = BraveRewardsHelper.spannedFromHtmlString(verified_description); + TextView tv_note = (TextView)root.findViewById(R.id.publisher_not_verified); + tv_note.setText(toInsert); + tv_note.setVisibility(View.VISIBLE); + } + tv = (TextView)root.findViewById(R.id.br_no_activities_yet); gl = (GridLayout)thisObject.root.findViewById(R.id.br_activities); if (tv != null && gl != null) { @@ -1522,4 +1549,143 @@ void UpdateRecurentDonationSpinner(double amount){ public void OnGrantFinish(int result){ mBraveRewardsNativeWorker.GetAllNotifications(); } + + private void SetVerifyWalletControl(@WalletStatus final int status){ + Button btnVerifyWallet = (Button)root.findViewById(R.id.btn_verify_wallet); + boolean annonwallet = BraveRewardsHelper.isAnonWallet(); + if (!annonwallet) { + int rightDrawable = 0; + int leftDrawable = 0; + int text = 0; + + switch(status) { + case BraveRewardsExternalWallet.NOT_CONNECTED: + rightDrawable = R.drawable.disclosure; + text = R.string.brave_ui_wallet_button_unverified; + btnVerifyWallet.setCompoundDrawablesWithIntrinsicBounds(0, 0, rightDrawable, 0); + break; + case BraveRewardsExternalWallet.CONNECTED: + case BraveRewardsExternalWallet.PENDING: + rightDrawable = R.drawable.verified_disclosure; + text = R.string.brave_ui_wallet_button_unverified; + btnVerifyWallet.setCompoundDrawablesWithIntrinsicBounds(0, 0, rightDrawable, 0); + break; + case BraveRewardsExternalWallet.VERIFIED: + leftDrawable = R.drawable.uphold_white; + rightDrawable = R.drawable.verified_disclosure; + text = R.string.brave_ui_wallet_button_verified; + btnVerifyWallet.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, 0, rightDrawable, 0); + btnVerifyWallet.setBackgroundColor(Color.TRANSPARENT); + + //show Add funds button + Button btnAddFunds = (Button)root.findViewById(R.id.br_add_funds); + btnAddFunds.setVisibility (View.VISIBLE); + break; + case BraveRewardsExternalWallet.DISCONNECTED_NOT_VERIFIED: + case BraveRewardsExternalWallet.DISCONNECTED_VERIFIED: + leftDrawable = R.drawable.uphold_white; + text = R.string.brave_ui_wallet_button_disconnected; + btnVerifyWallet.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, 0, 0, 0); + btnVerifyWallet.setBackgroundDrawable(root.getResources().getDrawable( + R.drawable.wallet_disconnected_button)); + break; + default: + Log.e (TAG, "Unexpected external wallet status"); + return; + } + + tvYourWalletTitle.setVisibility(View.GONE); + btnVerifyWallet.setVisibility(View.VISIBLE); + btnVerifyWallet.setText(root.getResources().getString(text)); + SetVerifyWalletBtnClickHandler(status); + SetAddFundsBtnClickHandler(status); + } + } + + private void SetAddFundsBtnClickHandler(@WalletStatus final int status) { + Button btnAddFunds = (Button)root.findViewById(R.id.br_add_funds); + if (status != BraveRewardsExternalWallet.VERIFIED) { + btnAddFunds.setEnabled(false); + return; + } + + btnAddFunds.setOnClickListener((new View.OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + mBraveActivity.openNewOrSelectExistingTab (mExternal_wallet.mAdd_url); + }})); + } + + private void SetVerifyWalletBtnClickHandler(@WalletStatus final int status) { + Button btnVerifyWallet = (Button)root.findViewById(R.id.btn_verify_wallet); + btnVerifyWallet.setOnClickListener((new View.OnClickListener() { + @Override + public void onClick(View v) { + switch(status) { + case BraveRewardsExternalWallet.NOT_CONNECTED: + case BraveRewardsExternalWallet.CONNECTED: + case BraveRewardsExternalWallet.PENDING: + case BraveRewardsExternalWallet.VERIFIED: + int requestCode = + (status == BraveRewardsExternalWallet.NOT_CONNECTED) ? + BraveActivity.VERIFY_WALLET_ACTIVITY_REQUEST_CODE : + BraveActivity.USER_WALLET_ACTIVITY_REQUEST_CODE; + Intent intent = BuildVerifyWalletActivityIntent(status); + mActivity.startActivityForResult(intent, requestCode); + break; + case BraveRewardsExternalWallet.DISCONNECTED_NOT_VERIFIED: + case BraveRewardsExternalWallet.DISCONNECTED_VERIFIED: + if (! TextUtils.isEmpty(mExternal_wallet.mVerify_url)) { + dismiss(); + mBraveActivity.openNewOrSelectExistingTab (mExternal_wallet.mVerify_url); + } + break; + default: + Log.e (TAG, "Unexpected external wallet status"); + return; + } + }})); + } + + private Intent BuildVerifyWalletActivityIntent(@WalletStatus final int status) { + Class clazz = null; + switch(status) { + case BraveRewardsExternalWallet.NOT_CONNECTED: + clazz = BraveRewardsVerifyWalletActivity.class; + break; + case BraveRewardsExternalWallet.CONNECTED: + case BraveRewardsExternalWallet.PENDING: + case BraveRewardsExternalWallet.VERIFIED: + clazz = BraveRewardsUserWalletActivity.class; + break; + default: + Log.e (TAG, "Unexpected external wallet status"); + return null; + } + + Intent intent = new Intent(ContextUtils.getApplicationContext(), clazz); + intent.putExtra(BraveRewardsExternalWallet.ACCOUNT_URL, mExternal_wallet.mAccount_url); + intent.putExtra(BraveRewardsExternalWallet.ADD_URL, mExternal_wallet.mAdd_url); + intent.putExtra(BraveRewardsExternalWallet.ADDRESS, mExternal_wallet.mAddress); + intent.putExtra(BraveRewardsExternalWallet.STATUS, mExternal_wallet.mStatus); + intent.putExtra(BraveRewardsExternalWallet.TOKEN, mExternal_wallet.mToken); + intent.putExtra(BraveRewardsExternalWallet.TYPE, mExternal_wallet.mType); + intent.putExtra(BraveRewardsExternalWallet.USER_NAME, mExternal_wallet.mUser_name); + intent.putExtra(BraveRewardsExternalWallet.VERIFY_URL, mExternal_wallet.mVerify_url); + intent.putExtra(BraveRewardsExternalWallet.WITHDRAW_URL, mExternal_wallet.mWithdraw_url); + return intent; + } + + @Override + public void OnGetExternalWallet(int error_code, String external_wallet) { + try { + mExternal_wallet = new BraveRewardsExternalWallet(external_wallet); + SetVerifyWalletControl(mExternal_wallet.mStatus); + } + catch (JSONException e) { + Log.e (TAG, "Error parsing external wallet status"); + mExternal_wallet = null; + } + } } diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsPublisher.java b/android/java/org/chromium/chrome/browser/BraveRewardsPublisher.java new file mode 100644 index 000000000000..52c3ac7e419e --- /dev/null +++ b/android/java/org/chromium/chrome/browser/BraveRewardsPublisher.java @@ -0,0 +1,21 @@ +/** Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.chromium.chrome.browser; + +import androidx.annotation.IntDef; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +class BraveRewardsPublisher { + //PublisherStatus @ + //vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom + @Retention(RetentionPolicy.SOURCE) + @IntDef({NOT_VERIFIED, CONNECTED, VERIFIED}) + public @interface PublisherStatus {} + public static final int NOT_VERIFIED = 0; + public static final int CONNECTED = 1; + public static final int VERIFIED = 2; +} \ No newline at end of file diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsSiteBannerActivity.java b/android/java/org/chromium/chrome/browser/BraveRewardsSiteBannerActivity.java index df2a2fba3e29..d60dd4646eff 100644 --- a/android/java/org/chromium/chrome/browser/BraveRewardsSiteBannerActivity.java +++ b/android/java/org/chromium/chrome/browser/BraveRewardsSiteBannerActivity.java @@ -13,6 +13,7 @@ import android.graphics.Bitmap; import android.os.Bundle; import android.util.DisplayMetrics; +import android.text.TextUtils; import android.view.View; import android.view.ViewTreeObserver; import android.view.WindowManager; @@ -28,10 +29,12 @@ import android.content.Context; import android.view.MotionEvent; import org.chromium.chrome.browser.util.IntentUtils; +import org.chromium.chrome.browser.BraveRewardsBalance; import org.chromium.chrome.browser.BraveRewardsHelper; import org.chromium.chrome.browser.BraveRewardsNativeWorker; import org.chromium.chrome.browser.BraveRewardsObserver; import org.chromium.chrome.browser.ChromeTabbedActivity; +import org.chromium.chrome.browser.BraveRewardsPublisher.PublisherStatus; import android.graphics.Bitmap; import android.widget.ImageView; import org.chromium.chrome.browser.tab.Tab; @@ -48,8 +51,8 @@ import java.text.DecimalFormat; import java.util.Locale; -public class BraveRewardsSiteBannerActivity extends Activity implements BraveRewardsHelper.LargeIconReadyCallback, BraveRewardsObserver { - +public class BraveRewardsSiteBannerActivity extends Activity implements + BraveRewardsHelper.LargeIconReadyCallback, BraveRewardsObserver { private ToggleButton radio_tip_amount[] = new ToggleButton [3]; private final int TIP_SENT_REQUEST_CODE = 2; private final int FADE_OUT_DURATION = 500; @@ -106,7 +109,6 @@ protected void onCreate(Bundle savedInstanceState) { radio_tip_amount[2].setTextOn(String.format(getResources().getString(R.string.ten_tip_option),isAnonWallet ? getResources().getString(R.string.brave_ui_bap_text) : getResources().getString(R.string.brave_ui_bat_text))); radio_tip_amount[2].setChecked(false); - //radio buttons behaviour View.OnClickListener radio_clicker = new View.OnClickListener() { @Override @@ -146,7 +148,11 @@ public void onClick(View view) { mIconFetcher = new BraveRewardsHelper(); mIconFetcher.retrieveLargeIcon(favicon_url, this); - double balance = mBraveRewardsNativeWorker.GetWalletBalance(); + double balance = .0; + BraveRewardsBalance rewards_balance = mBraveRewardsNativeWorker.GetWalletBalance(); + if (rewards_balance != null){ + balance = rewards_balance.mTotal; + } DecimalFormat df = new DecimalFormat("#.#"); df.setRoundingMode(RoundingMode.FLOOR); @@ -170,7 +176,11 @@ public void onClick(View view) { @Override public void onClick(View view) { - double balance = mBraveRewardsNativeWorker.GetWalletBalance(); + double balance = .0; + BraveRewardsBalance rewards_balance = mBraveRewardsNativeWorker.GetWalletBalance(); + if (rewards_balance != null){ + balance = rewards_balance.mTotal; + } int amount = 0; for (ToggleButton tb : radio_tip_amount){ if (tb.isChecked()) { @@ -256,7 +266,6 @@ public void onClick(View view) { part1 = part1.substring(0,1).toUpperCase(Locale.getDefault()) + part1.substring(1); part2 = part2.substring(0,1).toUpperCase(Locale.getDefault()) + part2.substring(1); - Spanned toInsert; //Temporary disabled /* StringBuilder sb = new StringBuilder(); @@ -266,7 +275,7 @@ public void onClick(View view) { sb.append(" "); sb.append(part3); sb.append("."); - toInsert = BraveRewardsHelper.spannedFromHtmlString(sb.toString()); + Spanned toInsert = BraveRewardsHelper.spannedFromHtmlString(sb.toString()); TextView tv = (TextView)findViewById(R.id.not_enough_funds_text); tv.setText(toInsert); */ @@ -276,41 +285,12 @@ public void onClick(View view) { tv.setText(part1); /////////////////////////////////////////////////////////////////////////////////////// - boolean verified = mBraveRewardsNativeWorker.GetPublisherVerified(currentTabId_); - if (!verified) { - findViewById(R.id.not_verified_warning_layout ).setVisibility(View.VISIBLE); - - part1 = getResources().getString(R.string.brave_ui_site_banner_notice_text); - part2 = getResources().getString(R.string.learn_more); - - final StringBuilder sb1 = new StringBuilder(); - sb1.append(part1); - sb1.append("
"); - sb1.append(part2); - sb1.append("
"); - toInsert = BraveRewardsHelper.spannedFromHtmlString(sb1.toString()); - TextView not_verified_warning_text = (TextView )findViewById(R.id.not_verified_warning_text ); - not_verified_warning_text.setText(toInsert); + @PublisherStatus int pubStatus = + mBraveRewardsNativeWorker.GetPublisherStatus(currentTabId_); + setPublisherNoteText(pubStatus); - not_verified_warning_text.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View view, MotionEvent motionEvent) { - if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { - int offset = not_verified_warning_text.getOffsetForPosition( - motionEvent.getX(), motionEvent.getY()); - - String learn_more = getResources().getString(R.string.learn_more); - if (BraveRewardsHelper.subtextAtOffset(not_verified_warning_text.getText().toString(), learn_more, offset) ){ - Intent returnIntent = new Intent(); - // TODO - // setResult(ChromeTabbedActivity.SITE_BANNER_NOT_VERIFIED_LEARN_MORE_RESULT_CODE, returnIntent); - finish(); - } - } - return false; - } - }); - } else { + if (pubStatus == BraveRewardsPublisher.CONNECTED || + pubStatus == BraveRewardsPublisher.VERIFIED) { findViewById(R.id.publisher_favicon_verified).setVisibility(View.VISIBLE); } @@ -349,6 +329,59 @@ public void onGlobalLayout() { }); } + private void setPublisherNoteText(@PublisherStatus int pubStatus) { + String note_part1 = ""; + if (pubStatus == BraveRewardsPublisher.CONNECTED) { + // show |brave_ui_site_banner_connected_text| text if + // publisher is CONNECTED and user doesn't have any Brave funds (anonymous or + // blinded wallets) + BraveRewardsBalance balance_obj = mBraveRewardsNativeWorker.GetWalletBalance(); + if (balance_obj != null) { + double braveFunds = balance_obj.mWallets.get(BraveRewardsBalance.WALLET_ANONYMOUS) + + balance_obj.mWallets.get(BraveRewardsBalance.WALLET_BLINDED); + if (braveFunds <= 0) { + note_part1 = getResources().getString(R.string.brave_ui_site_banner_connected_text); + } + } + } + else if (pubStatus == BraveRewardsPublisher.NOT_VERIFIED) { + note_part1 = getResources().getString(R.string.brave_ui_site_banner_notice_text); + } + + if (!TextUtils.isEmpty(note_part1)) { + findViewById(R.id.not_verified_warning_layout ).setVisibility(View.VISIBLE); + String note_part2 = getResources().getString(R.string.learn_more); + final StringBuilder sb1 = new StringBuilder(); + sb1.append(note_part1); + sb1.append("
"); + sb1.append(note_part2); + sb1.append("
"); + Spanned toInsert = BraveRewardsHelper.spannedFromHtmlString(sb1.toString()); + TextView not_verified_warning_text = (TextView )findViewById(R.id.not_verified_warning_text ); + not_verified_warning_text.setText(toInsert); + String full_note_str = toInsert.toString(); + + not_verified_warning_text.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + boolean event_consumed = false; + if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { + int offset = not_verified_warning_text.getOffsetForPosition( + motionEvent.getX(), motionEvent.getY()); + + if (BraveRewardsHelper.subtextAtOffset(full_note_str, note_part2, offset) ){ + event_consumed = true; + Intent intent = new Intent(); + intent.putExtra(BraveActivity.OPEN_URL, BraveActivity.REWARDS_LEARN_MORE_URL); + setResult(RESULT_OK, intent); + finish(); + } + } + return event_consumed; + } + }); + } + } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) @@ -361,7 +394,6 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) finish(); overridePendingTransition(R.anim.activity_fade_in, R.anim.activity_fade_out); mTippingInProgress = false; - } } @@ -410,8 +442,6 @@ public void onLargeIconReady(Bitmap icon){ SetFavIcon(icon); } - - //`make_monthly_checkbox` checkbox click handler public void onMonthlyCheckboxClicked(View view) { boolean checked = ((CheckBox) view).isChecked(); @@ -443,17 +473,15 @@ public void onRestoreInstanceState(Bundle savedInstanceState) { onMonthlyCheckboxClicked(cb); } - - - // BraveRewardsObserver///////////////////////////////////// - @Override - public void OnWalletInitialized(int error_code){} - @Override public void OnWalletProperties(int error_code){ if (error_code == 0) { if (mBraveRewardsNativeWorker != null) { - double balance = mBraveRewardsNativeWorker.GetWalletBalance(); + double balance = .0; + BraveRewardsBalance rewards_balance = mBraveRewardsNativeWorker.GetWalletBalance(); + if (rewards_balance != null){ + balance = rewards_balance.mTotal; + } DecimalFormat df = new DecimalFormat("#.#"); df.setRoundingMode(RoundingMode.FLOOR); df.setMinimumFractionDigits(1); @@ -462,49 +490,4 @@ public void OnWalletProperties(int error_code){ } } } - - @Override - public void OnPublisherInfo(int tabId){} - - @Override - public void OnGetCurrentBalanceReport(double[] report){} - - @Override - public void OnNotificationAdded(String id, int type, long timestamp, String[] args) {} - - @Override - public void OnNotificationsCount(int count) {} - - @Override - public void OnGetLatestNotification(String id, int type, long timestamp, String[] args) {} - - @Override - public void OnNotificationDeleted(String id) {} - - @Override - public void OnIsWalletCreated(boolean created) {} - - @Override - public void OnGetPendingContributionsTotal(double amount) {} - - @Override - public void OnGetRewardsMainEnabled(boolean enabled) {} - - @Override - public void OnGetAutoContributeProps() {} - - @Override - public void OnGetReconcileStamp(long timestamp) {} - - @Override - public void OnRecurringDonationUpdated() {} - - @Override - public void OnResetTheWholeState(boolean success) {} - - @Override - public void OnRewardsMainEnabled(boolean enabled) {} - - @Override - public void OnFetchPromotions() {} } diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsUserWalletActivity.java b/android/java/org/chromium/chrome/browser/BraveRewardsUserWalletActivity.java new file mode 100644 index 000000000000..322904b77724 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/BraveRewardsUserWalletActivity.java @@ -0,0 +1,131 @@ +/** Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +package org.chromium.chrome.browser; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.View; +import android.content.Context; +import android.content.Intent; +import android.support.v7.app.ActionBar; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; +import android.widget.Button; +import android.widget.TextView; + +import org.chromium.chrome.browser.BraveActivity; +import org.chromium.chrome.browser.BraveRewardsExternalWallet; +import org.chromium.chrome.browser.BraveRewardsNativeWorker; +import org.chromium.chrome.browser.BraveRewardsBalance; +import org.chromium.chrome.R; + + +public class BraveRewardsUserWalletActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.user_wallet_activity); + + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + ActionBar ab = getSupportActionBar(); + ab.setDisplayHomeAsUpEnabled(true); + ab.setDisplayShowTitleEnabled(false); + + SetUIControls(); + } + + private void SetUIControls() { + Intent intent = getIntent(); + final int status = intent.getIntExtra( + BraveRewardsExternalWallet.STATUS, -1); + TextView txtUserId = (TextView)findViewById(R.id.user_id); + TextView txtUserStatus = (TextView)findViewById(R.id.user_status); + Button btn1 = (Button)findViewById(R.id.user_wallet_btn1); + Button btn2 = null; + Button btnGotoUphold = (Button)findViewById( + R.id.user_wallet_go_to_uphold); + + if (status < BraveRewardsExternalWallet.NOT_CONNECTED || + status > BraveRewardsExternalWallet.PENDING) { + finish(); + } + else if (status == BraveRewardsExternalWallet.VERIFIED){ + //set 2nd button visible + findViewById(R.id.user_wallet_btn2_separator).setVisibility( + View.VISIBLE); + btn2 = (Button)findViewById(R.id.user_wallet_btn2); + btn2.setVisibility(View.VISIBLE); + + //Buttons: + //Add funds + //Withdraw + //Go to uphold + //Disconnect + btn1.setText(getResources().getString( + R.string.brave_rewards_local_panel_add_funds)); + btn2.setText(getResources().getString( + R.string.user_wallet_withdraw_funds)); + txtUserStatus.setText( + BraveRewardsExternalWallet.WalletStatusToString(status)); + + SetBtnOpenUrlClickHandler(btn1, + intent.getStringExtra(BraveRewardsExternalWallet.ADD_URL)); + SetBtnOpenUrlClickHandler(btn2, + intent.getStringExtra(BraveRewardsExternalWallet.WITHDRAW_URL)); + } + else { + //CONNECTED or PENDING + //Buttons: + //Complete verification + //Go to uphold + //Disconnect + btn1.setText(getResources().getString( + R.string.user_wallet_complete_verification)); + SetBtnOpenUrlClickHandler(btn1, + intent.getStringExtra(BraveRewardsExternalWallet.VERIFY_URL)); + } + + SetBtnOpenUrlClickHandler(btnGotoUphold, + intent.getStringExtra(BraveRewardsExternalWallet.ACCOUNT_URL)); + + String userId = intent.getStringExtra(BraveRewardsExternalWallet.USER_NAME); + txtUserId.setText(userId); + SetDisconnectBtnClickHandler(); + } + + private void SetBtnOpenUrlClickHandler(Button btn, String url) { + btn.setOnClickListener( (View v) -> { + Intent intent = new Intent(); + intent.putExtra(BraveActivity.OPEN_URL, url); + setResult(RESULT_OK, intent); + finish(); + }); + } + + private void SetDisconnectBtnClickHandler() { + Button btnDisconnect = (Button)findViewById( + R.id.user_wallet_disconnect); + btnDisconnect.setOnClickListener( (View v) -> { + BraveRewardsNativeWorker.getInstance().DisconnectWallet + (BraveRewardsBalance.WALLET_UPHOLD); + Intent intent = new Intent(); + setResult(RESULT_OK, intent); + finish(); + }); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if(item.getItemId()==android.R.id.home) { + finish(); + } + return super.onOptionsItemSelected(item); + } +} diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsVerifyWalletActivity.java b/android/java/org/chromium/chrome/browser/BraveRewardsVerifyWalletActivity.java new file mode 100644 index 000000000000..7a0f4e9fe20a --- /dev/null +++ b/android/java/org/chromium/chrome/browser/BraveRewardsVerifyWalletActivity.java @@ -0,0 +1,72 @@ +/** Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +package org.chromium.chrome.browser; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.text.Spanned; +import android.view.MotionEvent; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; +import java.util.Locale; + +import org.chromium.chrome.browser.BraveActivity; +import org.chromium.chrome.browser.BraveRewardsExternalWallet; +import org.chromium.chrome.browser.BraveRewardsHelper; +import org.chromium.chrome.browser.BraveUphold; +import org.chromium.chrome.R; + +public class BraveRewardsVerifyWalletActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.verify_wallet_activity); + SetVerifyWalletBtnClickHandler(); + SetUpholdLinkHandler(); + } + + void SetVerifyWalletBtnClickHandler() { + Button btnVerifyWallet = (Button)findViewById(R.id.verify_wallet_btn); + btnVerifyWallet.setOnClickListener( (View v) -> { + String verify_url = getIntent().getStringExtra(BraveRewardsExternalWallet.VERIFY_URL); + Intent intent = new Intent(); + intent.putExtra(BraveActivity.OPEN_URL, verify_url); + setResult(RESULT_OK, intent); + finish(); + }); + } + + void SetUpholdLinkHandler() { + TextView uphold_link = (TextView)findViewById(R.id.service_provider_txt); + final String part1 = getResources().getString(R.string.verify_wallet_service_note); + final String part2 = getResources().getString(R.string.verify_wallet_uphold); + final String built_service_str = String.format(Locale.US, "%s %s", part1, part2); + Spanned toInsert = BraveRewardsHelper.spannedFromHtmlString(built_service_str); + uphold_link.setText(toInsert); + + uphold_link.setOnTouchListener( + (View view, MotionEvent motionEvent) -> { + boolean event_consumed = false; + if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { + int offset = uphold_link.getOffsetForPosition( + motionEvent.getX(), motionEvent.getY()); + + if (BraveRewardsHelper.subtextAtOffset(built_service_str, part2, offset) ){ + Intent intent = new Intent(); + intent.putExtra(BraveActivity.OPEN_URL, BraveUphold.UPHOLD_ORIGIN_URL); + setResult(RESULT_OK, intent); + finish(); + event_consumed = true; + } + } + return event_consumed; + }); + } +} diff --git a/android/java/org/chromium/chrome/browser/BraveUphold.java b/android/java/org/chromium/chrome/browser/BraveUphold.java new file mode 100644 index 000000000000..b70fdd26585e --- /dev/null +++ b/android/java/org/chromium/chrome/browser/BraveUphold.java @@ -0,0 +1,147 @@ +/** Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.chromium.chrome.browser; + +import android.content.Context; +import android.content.DialogInterface; +import android.net.Uri; +import android.text.TextUtils; +import android.support.v7.app.AlertDialog; +import java.util.Locale; + +import org.chromium.base.ContextUtils; +import org.chromium.chrome.browser.BraveActivity; +import org.chromium.chrome.browser.BraveRewardsBalance; +import org.chromium.chrome.browser.BraveRewardsHelper; +import org.chromium.chrome.browser.BraveRewardsNativeWorker; +import org.chromium.chrome.browser.BraveRewardsObserver; +import org.chromium.chrome.browser.externalnav.BraveExternalNavigationHandler; +import org.chromium.chrome.browser.externalnav.ExternalNavigationParams; +import org.chromium.chrome.R; +import org.json.JSONException; +import org.json.JSONObject; + +//used from org.chromium.chrome.browser.externalnav +public class BraveUphold implements BraveRewardsObserver { + public static final String UPHOLD_REDIRECT_URL = "rewards://uphold"; + public static final String UPHOLD_REDIRECT_URL_KEY = "redirect_url"; + public static final String ACTION_VALUE = "authorization"; + public static final String UPHOLD_SUPPORT_URL = "http://uphold.com/en/brave/support"; + public static final String UPHOLD_ORIGIN_URL = "http://uphold.com"; + + private static int UNKNOWN_ERROR_CODE = -1; + + private ExternalNavigationParams mExternalNavigationParams; + private BraveExternalNavigationHandler mBraveExternalNavigationHandler; + private BraveRewardsNativeWorker rewardsNativeProxy; + + public void CompleteUpholdVerification(ExternalNavigationParams params, + BraveExternalNavigationHandler handler) { + mExternalNavigationParams = params; + mBraveExternalNavigationHandler = handler; + rewardsNativeProxy = BraveRewardsNativeWorker.getInstance(); + + Uri uri = Uri.parse(params.getUrl()); + rewardsNativeProxy.AddObserver(this); + String path = uri.getPath(); + String query = uri.getQuery(); + + if (TextUtils.isEmpty(path) || TextUtils.isEmpty(query)) { + rewardsNativeProxy.RemoveObserver(this); + ReleaseDependencies(); + ShowErrorMessageBox(UNKNOWN_ERROR_CODE); + return; + } + + // Ledger expects: + // path: "/uphold/path" + // query: "?query" + path = String.format(Locale.US,"/%s/%s", + BraveRewardsBalance.WALLET_UPHOLD, path); + query = String.format(Locale.US,"?%s", query); + rewardsNativeProxy.ProcessRewardsPageUrl(path, query); + } + + @Override + public void OnProcessRewardsPageUrl(int error_code, + String wallet_type, String action, + String json_args ) { + + //remove observer + if (rewardsNativeProxy != null) { + rewardsNativeProxy.RemoveObserver(this); + } + + String redirect_url = parseJsonArgs (json_args); + if (BraveRewardsNativeWorker.LEDGER_OK == error_code && + TextUtils.equals(action, ACTION_VALUE)) { + + //wallet is verified: redirect to chrome://rewards for now + if (TextUtils.isEmpty(redirect_url)) { + redirect_url = BraveActivity.REWARDS_SETTINGS_URL; + } + mBraveExternalNavigationHandler. + clobberCurrentTabWithFallbackUrl (redirect_url, + mExternalNavigationParams); + + // temporary: open Rewards Panel to show wallet transition state. + // remove this step once settings activity has this info + BraveActivity.getBraveActivity().openRewardsPanel(); + ReleaseDependencies(); + } + else { + ShowErrorMessageBox(error_code); + } + } + + private String parseJsonArgs(String json_args) { + String redirect_url = ""; + try { + JSONObject jsonObj = new JSONObject(json_args); + if (jsonObj.has(UPHOLD_REDIRECT_URL_KEY)) { + redirect_url = jsonObj.getString(UPHOLD_REDIRECT_URL_KEY); + } + } + catch(JSONException e){ } + return redirect_url; + } + + private void ReleaseDependencies() { + mExternalNavigationParams = null; + mBraveExternalNavigationHandler = null; + } + + private void ShowErrorMessageBox (int error_code) { + String msg = ""; + String msg_title = ""; + Context context = ContextUtils.getApplicationContext(); + AlertDialog.Builder builder = new AlertDialog.Builder( + BraveRewardsHelper.getChromeTabbedActivity(), + R.style.Theme_Chromium_AlertDialog); + + if (BraveRewardsNativeWorker.BAT_NOT_ALLOWED == error_code) { + msg = context.getResources().getString(R.string.bat_not_allowed_in_region); + msg_title = context.getResources().getString(R.string.bat_not_allowed_in_region_title); + } + else { + msg = context.getResources().getString(R.string.wallet_verification_generic_error); + msg_title = context.getResources().getString(R.string.wallet_verification_generic_error_title); + } + builder.setMessage(msg) + .setTitle (msg_title) + .setPositiveButton(R.string.ok, (DialogInterface dialog, int which)-> { + mBraveExternalNavigationHandler. + clobberCurrentTabWithFallbackUrl (UPHOLD_SUPPORT_URL, + mExternalNavigationParams); + }) + .setOnDismissListener((DialogInterface dialog)-> { + ReleaseDependencies(); + }); + + AlertDialog dlg = builder.create(); + dlg.show(); + } +} \ No newline at end of file diff --git a/android/java/org/chromium/chrome/browser/externalnav/BraveExternalNavigationHandler.java b/android/java/org/chromium/chrome/browser/externalnav/BraveExternalNavigationHandler.java new file mode 100644 index 000000000000..18ab767affd0 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/externalnav/BraveExternalNavigationHandler.java @@ -0,0 +1,51 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.chromium.chrome.browser.externalnav; + +import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler; +import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler.OverrideUrlLoadingResult; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.BraveUphold; + +public class BraveExternalNavigationHandler extends ExternalNavigationHandler { + private BraveUphold mBraveUphold; + public BraveExternalNavigationHandler(Tab tab) { + super(tab); + } + + public BraveExternalNavigationHandler(ExternalNavigationDelegate delegate) { + super(delegate); + } + + @Override + public @OverrideUrlLoadingResult int shouldOverrideUrlLoading(ExternalNavigationParams params) { + if (isUpholdOverride(params)) { + CompleteUpholdVerification(params); + return OverrideUrlLoadingResult.OVERRIDE_WITH_CLOBBERING_TAB; + } + return super.shouldOverrideUrlLoading(params); + } + + private boolean isUpholdOverride(ExternalNavigationParams params) { + if (!params.getUrl().startsWith(BraveUphold.UPHOLD_REDIRECT_URL)) return false; + return true; + } + + private void CompleteUpholdVerification(ExternalNavigationParams params) { + mBraveUphold = new BraveUphold(); + mBraveUphold.CompleteUpholdVerification(params, this); + } + + /** + * This function will be removed by ASM byte-code patching tool + * and redirected to ExternalNavigationHandler. + */ + public @OverrideUrlLoadingResult int clobberCurrentTabWithFallbackUrl( + String browserFallbackUrl, ExternalNavigationParams params) { + assert false; + return OverrideUrlLoadingResult.OVERRIDE_WITH_CLOBBERING_TAB; + } +} \ No newline at end of file diff --git a/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayout.java b/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayout.java index e0fbb9f5ecf0..23acd353ed0d 100644 --- a/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayout.java +++ b/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayout.java @@ -443,10 +443,21 @@ private boolean isValidProtocolForShields(String protocol) { return false; } + public void dismissRewardsPanel() { + if (mRewardsPopup != null) { + mRewardsPopup.dismiss(); + mRewardsPopup = null; + } + } + public void onRewardsPanelDismiss() { mRewardsPopup = null; } + public void openRewardsPanel() { + onClick(mBraveRewardsButton); + } + @Override public void OnWalletInitialized(int error_code) { if (error_code == BraveRewardsNativeWorker.SAFETYNET_ATTESTATION_FAILED) { diff --git a/android/java/res/drawable-hdpi/check.png b/android/java/res/drawable-hdpi/check.png new file mode 100644 index 0000000000000000000000000000000000000000..f5d802e32c4a3fae6069abf7d2ed49cf0444c5c5 GIT binary patch literal 1167 zcmV;A1aSL_P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91B%lKT1ONa40RR91CIA2c08q}boB#j=`AI}UR9FekSX)RGQ5gPb)y+$m zVwS6Bln;5S9)iTc(r!$>aeuG9C=y4y_7%&xmT(huLxnRCAX`@cD}=j>5|!U$0mvtd#=rJd9KN|rI2O_vy+Rv_duMld(J;6Q85p* z^u<3z$LGR~+bwE6DNn=+X%Mr+JMl1JXtduO5)apY6rE15Rvq>b!!uL@q)F}!`0#i{ zx^(#)UB7K3tIbVUZ`ib|u!oXZe3WZ3BJCe_c&X(=KfQT3CP~G{3RJcsMNhVz4dv@G z!X5i&byIU|KiR&!0}?gW*|cU=Qs7>tk;jHCDgzO9b-#8{+ra`4en{e-U3RL#Q|{cph+ z;M=O4E-zibWuuy7pXf!mLy_WgP0^XQuQSYKTINwx<1*qebBHl0VC{E;T%?uo;gge^ zn)}G@#uUh6ebGWXSY;srwVGk3e?WPBPEL-ci!Hfi$uP^Zf;OMAp}U~%(xY}gAEk5W z`xV~{=9|qXil1j9`>02e9v5e#v!|9*LEfy7()aj%bSczSZq}_$rkd)k86y)DQ!~sk zss2b-IA%Dtiw$*fD_CsZluA{V8Nq1MYAV&={PZ+BO!$R;3r3F~%RjbzS2~qrm1)K1 zvQ*;zCd}wzFTN#2bSG4iL;EeX5&O!&vAS?R)vCPKe|b9hk_Z2JXaR`5fcE3dl=uhp zbn91o`O3HamuAJ&g>x$?DM@96lI7_%dGpG}4A}!5thRa}xeZYvn0iqdrrIDc8{d>eCe(rUuj?JQzYX&we#TJTzup8)zwRgyC25lpu5a>0)6l)d+HK0a7Vj6H2h{j*D ztif85pWh*p4|D+G2Iofqs0`5@pcZ%nOafZLW6WVL|JyI*P%Qh9vp_^4-aGg_uJ%7h h876kwR literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-hdpi/disclosure.png b/android/java/res/drawable-hdpi/disclosure.png new file mode 100644 index 0000000000000000000000000000000000000000..44983febb14a3949792a9cefcb5f8944fc38df72 GIT binary patch literal 608 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6Q!3HGPJ}O-eq!^2X+?^QKos)S9 z67Whz>uA#U3#w0Q?j7cS`*o7qB7K`Xzd!CdKRa%+b+f9(^E(bNSu9xj8gmnvC7AUO zFkdj@dCZ($*8IWn1J9aGk{sm+($q=?);DmRNVYpsy^`5s$Jxaz3XXS_Z($C|&`J?> z3p~=SaA9hR<*id+TNyn>8qH;Im&U%c;QMalAAaqr-jW?ZAJ0kNnp#w+E7r}!wdVTk zjdlC&A&nS7WM|VYboCBl{k4_zKmt zD=l5YTYEo!uAloAozqEQt71<(f11jr#y5}QwJ>X@+o88*(R-$C%iZj@_#juSQ&6`z z>reM>lOm>sw`OmRn)N|FN^Yfp*ZsrG-$rh_n6c%<5$%?h|Jim6PEtN1c;-QTkki(O z1rqtLY>E7T`&KC?)dYAie^g@iwE18|dtyh?D%JU2MN+r^Kew4L{XyMa@b2WO!}=4- gUr2JWJG`_0BF&|c^us_b#TXR3p00i_>zopr01`{?>;M1& literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-hdpi/group.png b/android/java/res/drawable-hdpi/group.png new file mode 100644 index 0000000000000000000000000000000000000000..b09d6162ed246d537858923e90822d98a2dbc2eb GIT binary patch literal 6231 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 literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-hdpi/uphold_white.png b/android/java/res/drawable-hdpi/uphold_white.png new file mode 100644 index 0000000000000000000000000000000000000000..b9ff5c573455ddeaf12cc1fe6c8bffd264bea72d GIT binary patch literal 872 zcmV-u1DE`XP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR915}*SB1ONa40RR918UO$Q0IJ#flmGw%(n&-?R5%fZ)JsTJK^({NGdHy? zDsK-HN+}|HKu`!tVo^r55RzKdB7#s z7{e&KE%i0lg!TWdL_!q?@f5qU2-B?s+P%=6a;n3{bjcorF;vm5#WZ}wO2qNYnn_!T z0VwAp=N#6#^gW{=4%X5<#7{heCX0}Tv(We{+qTkbz7$iindg>J5rZ4}f)XbDpuZ58 z5QO^qp?N*a&$tPrLb~_wI20tQX?%nppda)za0@Rm1KCL64l+V{SscGdtqNViYosolekrtOc7#qU zw_}?^V|u===+ns^(5v;Yh(W!{1874df@q@i90zTV#`RX`qE3Z6F$eRYn2l|y=e3S% zKtW$ipdMw&fnq*%UP6W1q4lr^ibCY#fexIw&#|sxg&ki_I~DCJ)CJvMg}vlu^oQ^c zZgerARlnR$RM5UfXUtx{E?Ey&|E8bRzaM(o+FwyI z&fpl5*azL#RZIl`a1@_Vhd$&@%>L;ymWy6ohCVMR-5jl_I2xfut@Ls?iLvc=PC0j> z+nXFrXj^DCYcVz;5888DczQ0^p}98b>zO`C*n-FC$2n}YwC4uUf~{@^|9j*PlBn-f zHT16|c0QZ-87}aa^iBFJA`2;lVmeWUwCEICxKAiD>>oKlk%cItJ)}>q*34IX&MaDO zjShyumQmbuZMm!A{T3PA!B;H yniDl%W@d>OGfO$y^Tv}O(Coc@)9oKSKfeKLeL}VI8KzMH0000rjZEev1_6DcvH{aLJIoJ-FlNr-ip*SBz@}%uiE-^dhSJCO z3cB431vF+b9#QZV*x~PSFm8d8pNOjiV~X&J;04Sktk2kdgdM&yik@KjD6A02eq=?S dL!kg8AA>;Y4f&_u8&89r;OXk;vd$@?2>^_NJ){5t literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-hdpi/wallet_add.png b/android/java/res/drawable-hdpi/wallet_add.png new file mode 100644 index 0000000000000000000000000000000000000000..b2bfb989c91adddcb57d73a54f89c14866412331 GIT binary patch literal 893 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 literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-mdpi/uphold_green.png b/android/java/res/drawable-mdpi/uphold_green.png new file mode 100644 index 0000000000000000000000000000000000000000..077b596405695114a4d65bd2d5e10df8fb1ef71a GIT binary patch literal 1005 zcmVPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR915TFA91ONa40RR91761SM0J{~0QUCx0S4l)cR5%fZRDEboVHkg&_ndoo z?^x3cTawQb=8yTDnh>@-BGgur8tHOZ`-7DKxS_;+l+PN8zl2bVi%lC@W_AsKkjN%t zCf~ZdcFuVp&vVYsHmsa_-}gDckLP`#_kGVn7~m;MR*pA77lDEqpaD=}v#qi5#^cDz8H`i@Bs|BYJ-IB($l3>D# zhWEq)$KE9xT=F0`RwK27t;-UHH8%y6r?fdX7XwfWJT=+&qQuM-w>^frmS{0gdqEKv z$Xe%co{mlv>U#wbtA>IBXLzZ5iKrTsai;X)+Mzz*39j~ocol-q2hi=w={1%w0BvpM z&HN4@0z0|wVEjAijIBQJX{img&gVVgg(BC~^OUqi^Ej+vd|P7i;a}3of$f6zaGp{; znu5GN`UTgS%gsFz1JyD__}ulQ>$;}|NT<>Xj=vzOWiBRK@tF8rX@tiNj$Hh-a=4IO zbA$-$8s?u)yJGHo;#x$C2v(Ae=JGI-)lXC~ZA*d_rS$?KdFc}fq1lW3dR`S{IKfqD z6m2RiY(7#~icbCDX)lq6%6avbgSn1DT-Lijs~3@n4H69)7~_N&FHAo6(-c~PI;<5W z!-I7>zorn;yk&<*NvFcutkF1$uhtr2T;bIj$6s;ndw6ShlfrC<$MrXRF^%IJ zn9X13ZUWjPp56o!WQ9K+;Gr>)70lygEB#Xuj!Q(rgcD7V)}`E|b0hASw^j`Kr9-F8 zaA1YgWgR5b=A>aj?QAwe#wI&uUG7rpbqxilzxtj(5(rp&tttbCIaO#-6 zD>wulfg^IUe6x)IB=E_FEz#@%8WZK+BIjA%^qOxz_up}8OEhy{ecU}E5ldY5W>a_| zW3Q+`X@jvpGpBQYX>wybZzlgQK92g?VK=ZQ)?X*_fC*F(s`*oH=K7{ck$m;f0n(kn b&GP;mg&t?Z`{mUZ00000NkvXXu0mjf>p-|) literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-mdpi/uphold_white.png b/android/java/res/drawable-mdpi/uphold_white.png new file mode 100644 index 0000000000000000000000000000000000000000..3abf8f3a2b66eeeef0a2807b442e5b7c750d7fbb GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eS!3HE>+WIa6QjEnx?oJHr&dIz4a$Hg)JkxxA z8MJ_G4hF{dOa>N^5+IfWVg?501&j>LK$;OGwtxvP%d>zP&K3kI?5Ealo zAzFIrthP&_#PN@olTE~&T7qJhnrL@j($MGDH=P;u_`ZPm|HjBuZb`}N+Qz|?Pc{iI zRogsc%JyE?z_5-Z1-13tt0f+;JU{2T&2!7|_l&>Ka){iqF8XYV%wmHZZr3C}A9&$< zLCvIp!g9mL;+O=X%xfi$?-v+!gvTf|vahYHJNlz7@vVVMXpd#eLiY=ElP)MP-Oy~f z!cHW?S;SK$hCSFf&x>#RMPwWj;;TK~bGGd7{fW!Gey%lyzzVMx1rN)B3tS!1549GyF*Arb7pp(dXPE@D$kWx&Wt~$(69DHZ BH-G>D literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-mdpi/wallet_add.png b/android/java/res/drawable-mdpi/wallet_add.png new file mode 100644 index 0000000000000000000000000000000000000000..ea1fac5b78ca20cef8b1a1ac3e90f4bf4eb49be0 GIT binary patch literal 584 zcmeAS@N?(olHy`uVBq!ia0vp^B0wy_!3HG7B;uuk6k~CayA#8@b22Z19GBDx&op0O z1}z|)gMqO{x;Tbd z2+j>L^f?qDus55t+mOdflD&-0-Mz5%(n((L#7h}TOh=ENSjIHjMSP=~&N>T=88coy zdvxf*qb1FH8k~lDNx%30-sb7-t@w}S-T(6UaqsTO+Bfa~RGGZ({Q)f|pQ;->t}zO5 zIo-Bey+uQALBI;Xl3jDv6_1?Rp_FLDT4;T&um9d}neLUVHr3p-*u$gjo+#2iE3Qg_ zX_|=IB}+Zs1bwZ78T^8tOm;8Dr#Bt$_&;wSzPE}Jn?&r_?{k?|o zT0p}G;lF}=@%yC-Ys3C5dY--S{euh7yVn~_yy4v}|DScAdROKTe%5!OSoC!Db6Mw< G&;$T}>)(O^ literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-mdpi/wallet_withdraw.png b/android/java/res/drawable-mdpi/wallet_withdraw.png new file mode 100644 index 0000000000000000000000000000000000000000..d89b6331b6a95026ee7a04ea2d8151ea707fea8e GIT binary patch literal 629 zcmeAS@N?(olHy`uVBq!ia0vp^B0wy_!3HG7B;uuk6k~CayA#8@b22Z19GBDx&op0O z1}z|)gMqOWb&0EIxesbmMH&CLLb&>(k4%CT1s2>FzSG zQDfop^jT86`5|L`mTFkHqLSwUY1^}H38s(g3reb;4Ye-D8%i3^^K)6Ib?lVGrISWS zs$a0QNOKw-ZOF9ZXuUW0*{*rZm&MOamf>QETP`Gc_C}299yR85mo#{;2y6DMQZQ|Ev>FMV9L0crm^kkzpp#}7p<#^sa|e5CuQBm zIge&bU-1~^fIT*T yuchqjxOkxx>}g8X+>bo{grvB1`sO+O{2;#n@;V(;`Mw>XDED;rb6Mw<&;$VU;OCP7 literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-xhdpi/check.png b/android/java/res/drawable-xhdpi/check.png new file mode 100644 index 0000000000000000000000000000000000000000..22cafad12a053e7797c6b21533a5fc49e45ddc9d GIT binary patch literal 1528 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 literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-xhdpi/group.png b/android/java/res/drawable-xhdpi/group.png new file mode 100644 index 0000000000000000000000000000000000000000..31b1fe66a64d5cfdb4263d9d5d0d1bdf2a92e017 GIT binary patch literal 8296 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 literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-xhdpi/wallet_add.png b/android/java/res/drawable-xhdpi/wallet_add.png new file mode 100644 index 0000000000000000000000000000000000000000..5237731447e24f7c2f4286e6b19ee2283f18cc7f GIT binary patch literal 834 zcmV-I1HJr-P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91D4+uX1ONa40RR91AOHXW07{lEZ2$lQtVu*cR9Fe^SUqSIK@^@hw|4{VV4^2inIMSKLdgjdNXi5e&P%u}Y-|h`YGEU2W1}Hp6|sno zrJ~W?-}AlmW}O+cJ9qoX6%H)>X5Qbo^YhKj3NhpbY=c^wjZ*%x)u%7_t-X8m%;>?%(#<2C zW@n9zjP{)(WzdE)FOPb9B5aBi3LJIs^S!(GpI=&<-qvl>l&7W^N51{|{Dh|28OFhQ zj3J~U=V9#@>cY2Kg5#u|kMsUPKnMws0Z=K1>HQyI+|d~N9`q(kw+~>e@j@UT>>&Cd zO!Dl-OE+fy23r8w0Ix7suiX1+tCFls(QaH|a03TrANEbSAPAqYb4bN70IEj)T`b-@)5Oxb4-iW9~Lp*&cr zl((dpKPf?8&r5GSCMMHev4?{VoIO~3IQO0+^OI;{22ev2#s&sJCpi;Doy-$O91u+E z#28=`*c`_YdR#t=hZyr#P-6Fl(U^y~M{Uv#P-ELm^$C3Vs^dazcRU#AKEU@%0MHPZ>NTu0GK zUYBh*10XBw%kx+1kIXgtiL*}Cw(a1o_g0_NPHhlup8?@J@kBNF4Q9Unr}Dd@i~s-t M07*qoM6N<$f+=Kbp#T5? literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-xhdpi/wallet_withdraw.png b/android/java/res/drawable-xhdpi/wallet_withdraw.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce71e52749e0dd1096eae8f6f5e2fa5f39f0be2 GIT binary patch literal 934 zcmV;X16lluP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91D4+uX1ONa40RR91AOHXW07{lEZ2$lR5J^NqR9Fe^SWRdXK@^@h*`%Q8 zL69PN(~}^jAf5yfa%es2#e)TtCb}n6gkmD1G=hXC#}*M{QWCHpyjXfr54{L_@ls30 zixm&`;-#QyZIaE7??pDuOq83e2u*`e&{=S(v`}QS__4xoDpAZ5f*OL=qLtHR% z3grP^$49;n3_b}iiseFX1^~pi;9uAOJYs^~M-YSfa38_!-b405;Froe}8*{ z*KCw<5FRCkm~u*MW8e|K?zCS@DV%|F;tmKH20uNAYPPtDR$)It$v&xrL4Kar%5%B)-3o#ugMAyWbugb# zZ*n7eo&%o@a$~F;l%{$2STvTpL31a5TvJSrN>4H$aH6NHv1M6{SkBH=EPDg*b+}lZ zUiRWp0ob-Uqer=zdkLWH;DtG2vHFr%kX!)Ub-&k%Z4kH#z%~eQ1Egqx9NxYG{K*kZ zj?shHA2lyhn`JlXSxM93Tbm1mwN|bOVWBg(2tkXx=w~tw7?-aj7Lh ze5;$y0Pf^0{S1_q{h;-9>oJr<4MFx6e~Z$$7jP$|KYp!mVOOo&xbq%5?Z|jCgFz;- zB8JFW&91lfsie4+&#vNo|G1^L7XfwJR#i!pZiWRu;egX+GEW}@1t1B_#q3SInYZvy zoK<97Z%y_j(^SBX(1N_A)11K!CaJ2gD?G4|0l~`3T0b&>0be^<5Ym>+2mk;807*qo IM6N<$g1~5vUjP6A literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-xxhdpi/check.png b/android/java/res/drawable-xxhdpi/check.png new file mode 100644 index 0000000000000000000000000000000000000000..cde36518ef9d2afd4f4355114f51bc0d121cee25 GIT binary patch literal 2423 zcmV--35fQIP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91O8@`>0N0T`KL7v-;Ymb6RCodHTMKMdRT}IY4y9^g7)Ezk@&CG6`}fPH(?jwKj96nGqH0pcyxL0uf3sVy*a1n?G+ETQfZDaR6w z@&W6T#fpYr+Tu$(Q7|GGSO6RYQcY+RZOcsxQBYg~)B>q4w6Vf2NqqEL7ATyAMw@|Q zmK!I&0d3qIvN`_Rp@_paU1dSs7y=`1;Nf&-MqxL7Fg~Y+Q~G-UiH$G$VbfR^9=F z#$l?xt7n)lK_I6;8f^iJ^%`eLeiQr{3X&SN{Lvg4Acw>~4`ezy%-Vgrr*nggA*zu?cp1Nu@S^e?ad4cZ0m} z^4^G9?d<`1;K2rIZEcU_S-1&u5}sn0T4etn(KDirC@iXUl#vkhwN^Q z9wCptthZeIN5>8$O6eBA?6NHZECF-wsguW6HQJ3g40V6?zgC$!f4d<$=MCvDfB)O* zhW%Nn(4AB4Gz$&7R9*k}fnc=Ci1njST4d^9O62lO3kA!7BeG#*v#fk#w=n37Cgo)w znLD%0>5+Vz3(xwKP@EM_xn5aw^GUgV#x^%Ez6fwNM(gB7mWIE;~K;-N^MCVjMEbkFB>-VOtDF81J@dA+3G+?!6~zN!9eNO z&3weLXRqH9Ieq%%$fCKvM3F;UwvwP)CkSF6IIc!f`~$cwTVJCwm^6-f16UdhUGD3pdl>}$^5Uh$PD^rcG!xe5Q&@5f4vvVGMB zJ>>SA2Pm^*y65A3*ts!n8SUr~auO!!9XmZlYr|djxIt758b!qr7Gek{MINVo(! z2@~`N)VDfq!gUjiTOH@_7%emMWsqki1qE5bHxa#hCG>HwG>iXcBo{%65EM!;4P70- z}aUtQAmFg&P$^!Z60NX9QtO7AU1%4UAT+{ z9$`97gtm?h*`7F)G36!#O+cy&ZM!ycjA&?r0foRypdCmRp)Is2sYe4Ux?s$3U;~hB zp$)@T#-&n%#sRMZiQIuw7j>pCF`a)T80!V*0p9`f6823U-p=}+N?VG9>?(x={3p>E zU^H+sVD}qcescB!unE|Rr_$HB##ItRkkSK?#n8eBFz6%(0wj#DPQ$NH`9&5%LVg4o p*bzHGO5`{c>EGpd22z}XUjXJ;Vxwx4lWYJ0002ovPDHLkV1nm9dg1^8 literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-xxhdpi/disclosure.png b/android/java/res/drawable-xxhdpi/disclosure.png new file mode 100644 index 0000000000000000000000000000000000000000..7b806cd8adee69690b2760ec3db3eb2f458a7b2b GIT binary patch literal 1044 zcmV+v1nc{WP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91EuaGc1ONa40RR91DgXcg0Q892KmY&(en~_@R9FesnN4dGK^Vs;QQEXY zOAJ+z;LRMQp*CDbM3(&ic=FxtKb{+kS z_9OH|DwX<)cD4f0dFV6fd+2Xy6rn%k7(Z{F97R&lO=t&dLOMvod?_pNNW2dH1hpZ| zyKWR53Adn8e+E%+j`_C|gCj{A`Z{X$g#N6Tjt!6CT0(%h;k8)MsJ0WgqM^8*NZ=@1 zfesB7kDG?|9|wW^mKr$Tf#WIkW>7$oZ7>*!ZnrCzmzPC8&ppMM43Mda&8X+jc-?*B z^k1M24czPXM7>@Y!{JaMxhR**Vr69|AZ;uYImq+e9qsuq#Vp^);I`XgTEEq5NnrXR zUNoCcadL7pEiB6Tw!@`kJkYSdf(FgL4jAt&E-sFn#PRX5NpSLzON)la-Q0q8Lyv^) ztgWqyTrTJHHVnSu@X0zF8dnwQHDC29hPk;pQLR>OgOiJVQryr_lrd_%u&^)-aLp%| zJWM?w5&7(!jSB4cKRY{6-dFK|v?LmhDKRi67TU7BtM-2|;KWWC>?Y7_}Kpas&51yE<2*FoZ zSADs$V#R@$oYtW`osKvllOG|F|Fn#al!d(VY2Vo+^_*ejD*#n1DZ!R>x;h&^p z37A-#Pan6ON55|vjQpghZqy?15H)UNrhl-OT0MAFqG6xLIARf)IQt5i7kZ|7f!XF7 z^ckvF6`H4tW#B&mcmU`x3PjH|4H!5@v!@2bwA|H#mbC<{#CX{~H!uf1(2n;@v^=_p z5*}>F*I|ReoXYJI*?@BqJBABq&XGwc8LlbmN8cY}rPWA}{}?&L=k7p2 zSa7Aqgw;GjFZE%4Rfm@H+oad#$ZdlQh>3$+3j{VW#ZggiqgsWcU4?s(gGcv**HzD> z_rPFUJD*P*;HAJLTlq2bN?T((s7H|?Q^gCU*Ba%oe7|5DU8P;pH#W8!T>=CxuX5Qe zrrxh}c)v*wKuiw|6rSYwv(A_?yO@uvh&PKwt{N$g*e@DZAO%`-%Zgny!>-X=cqP4# z2}zwiCge(_Eb&Y$%%o3DQzCeGwwc7RNRnv^5RhuwdaX2W!2OByy#6O&fiCr)oe&Pt zD1WR^sV{%T^ymQtxvC#pdyYfK=!aRrODsYwSyXz%>$ zKhTqqk`1AK*iKO!d9kUsty?AbPctV=S*ouov4Tr8JotfN?uRw*T{+89oN|$vVJEdD zb-XNb-;5>*Xw>k=m)A=3iV5Z)*p0@;f%@VHEEW$+(hz3tI|Zc7IO8R@DXmFB^l)Qz zxzf0#r@UU7rYM-i0yC5?sO>W2WR5MobG9>-^H$AafE@U@zf_1YQn0Wf>&?gWh-2N@ zJJxV$YwVJ*1l&%PbgbQ1qZk!sTtR~a?nMh6g-=%@4Yt!+6Yudvjk))5!k^dhZ>BAy zPh#?#X}T9B%2oUJdQqLJ`Et>+#(Z=>OlB6*%_Kf7X)?5QZT+DR+qT3Zu5*Wyr%ZQK>m*u6Ge7*gA%sOSL=B!68 z2dK2IHMm83D5>ntqm(D)n0)-BApi;g&YkGhpdumT(Ns{K_dca{{W7dcS zcJs>`)2thsR@4=2k{_unsjvNCTihC@h4);~+(bx|6JyE0+MMEr3AQBxDc@&6&iZ4T zIncN8Pt)9bZ7uzYGSJuIv?*nD{^p-!S7D*YN3N2$;uDO8f#|&kM<;yr`|@ZgKP;OQ z6~_a0MgK3Chbe-*W(CBqRIAWAo!3h(vF855q;6Kgw1~FiA|0A0-uOzT+Smt5c$t5f z?~xbypRhw_j}SghHe{JCoZMOGj3ZyH3F4F`6Q)6#Jg{#{qnV;5Ky>?O>g3H+&Iiv#H#8Bi=GnPuz&UPeiP2T z3!6Vnwa3#H(R*c#8@KxT;ZCb5n%iGHflwHOHyFnXn69WUFnaHT=k~#nnI0HQQhsI^ z-Gd5ohn0p9((gR-S@b9poQJ8QbGnNj?<9af4dvENX8Gv-CHGJ{vI}l98b;!O?R?fl zG?~X0YD~tA%5O&&Xg@@H%ygHlg-hB{Kn(scA&H6^-X%itaFtWB!TWeea|7iwTDfOM zeRk;WH8>8PP_=obra4VlQ~b|lR+~fqp;5z+jdE;Av@7)e6I#UBnGHk3!>4!oi!Ga6 zKGwnlaT~R0=EP!NaLi0Y*qVK_s4N28Dm*`_oG_4}2Z8vHL|73ncN&(xIm# zxOY`ZSN|M%>e$XrjGRAu(3{?w?zk~rTRq+d)puL8)QuH|x9F)3?f>P{e%n&{(z&_R zd#nWXaAvdrvv1~-m-7L9T&bq%9EP)$CaZqlX9eC zYAmEZwV_w+1z|hEt3p@4Y}V2UV4zrb*=(C|A7^>`YVbw9K!6>Co zNzjyj7v(O%ovOoQVJ5BP@vaX|fl0f1N0~hQ(X>n?M@n+0W%^M3g zLQoUWe_ynAInN* zSoy23@e7oE^<@0P)&6|V)7Io z{~Ujtg1hV%9I)xYW|k4-D4J7XlDBq4c+L9Qkr>*$vC8tm<0#gZX=Wni*>(k$J-mMg z!i(qRFy!_A2U^jynfXt{sE0-#985;WOM+?y2emiLzyKJis$^@tMpq0A87x3!NpH@I z$X!==Oo3%X0e#nFTBw9>`0$O|x$E-&tr+v3lN z+cvB_OmwynVRiW$=;QsYucv?i=`DFh4(QN#8me1W`8Jm8#q-A|bNxT`}BQ)W}LvsCSP-Wd-pfxfliDJI44MI(;2_gJi3qT1mVD z>MH8Nv%Iik022X+D^X!sli?su8u@xkCF<0d1e5gZX*A}fK_{IfTjhM)?>|k>@oyMf zT%V7nNY%;zp8o*e%9cDyQJ8!U6%gzO;&kbiS7x)IkANK1=a;E{%WqiZ4Os*kO)0JZvAb6P@<+XazeyC8O*Q>rAQU=c+n}YP3v&fJK{gY{GJ9a>#9Ld2OKMW@=v|mOdO^Pu>-}myr&h+mL~Z6I|KU3 zHI{KbwX}_w^KisL2IH7axgBoNGUU2bKe;qt%i5I;yKT>ZAJxJKm3d zKq>NBZa$$cbG98?7um$VL2(PHurLL|Jqwak_>ZvJiY^0zjJ7MG!LN>;Dz#A`9e!V8 zc=4RlN#+4u;ZVY|h=?q{-%Mfz2WA)WpX!KRne1trYp9bp|9poe|0FY?M%*sIYFS=~ zEpNidX)o)LA2}a_c=7{m8O&W7Ui_>Ycm>ur0*(aOf)dm<%={_Y#1f3C1`A^{CCH!^ z`L_-omy?;xAx!6nrRcS^oCV-jue2AbptLW@yU8MFEapn@SrEA0pxx;7P=1P*7$Z!K zao54y{^Tf(4fU%Ehn9f2Hi4CD!PXp58B8~k23~gh&W)vnLhW6oeJaiPTQW23SCpvO z6FCL>!k1$z9U)&d4+w5-2x@wWYSLB#9=u{gHU~&1r*S$8N$@zP0mS0*?CXTfdWqfg zh<@x@k*Z)*hr-j|@{O*G(3347K|!i-8avW@KJ8qhjB%C(of zm6khu_ecxdikUYm7q*P89}tI>tjSuxD zzP~O;u3{wX)L9GMmQ#;Evlid!f|_z93@ccl-_Oh!9^Uj!{F)qh{J{T#BX|6${|fJ? z*(cG<749)V0@_BsDw+APqfD6NvS)P?1`jTJz&r&*dZ5)+FQoj@YrbY||2&^=fR~B2 zXp(Appc~~;aKbR;@pE@SWH7UVh^722C~e9;`}QPwz7R_;9)-Q7Al0cfH8EMV|R?YK_xrULRB%s@tu)2 zTz&CiVO(lBR9Ce0Q&bWEY5quIh0KJZ(%p~7A)AUT{I?jMslQ{6ik8%ylgA}AcE?|v zz7)x0a+AsJ8QOhfsbS#;u!p&`&7yCjf_ZmpLS+O3g1TKSj_|36&@)m9x%o7y`dqo! zFtk*k=KuoaBFTBe1w_O)9J1eKtGLyg=V^eaynt4e1v~an1=01BQcgpCp3z&X#FZ|` zF<)F~P!l(7L742Y{vObX491Kd+~)OBnxgOy&5He;pXH%+cIk(z?PTGXww)=m=$dg7 zhn!Kjk`txr84G@>h(^6haK0y#E$-ioV!~q+CIkZ$1~k_h{?27d-ld&s_T*6 zHz*CUy<8Y-Jj$JKhjfMSy~{;icMh5B52OO9>U=pxqBu2pyc?GZ%AVG%+vQ<64ro&AM@F zL^%5rJ0VBv)YvG$w-ruyuL!4)pn$9?bBLO2j1vyHIKP}pj;P+qu&AZ&4qatdy!!lu zWWmx~$ty8W+X{$zjZ6D+tFOLxTCOMvz7+@w=Y`gvHIo$tT?~1jf0PYA`ttDxe_IAM z$*x5~CI5pF+L&k*@*Q7rfjt|EY?!?OqFLykKf(}yPtd{H$V#d!-5%X^slU-3vS@1a zeLZZOCGoSiQ`e%Ip7io~HTitLyq=tF1lreo>~e!q&=*D~>m;VOVAtdD2x)BFQIA&i zdADa8&k++XHzP&~+bpB&G$aZ9@C?0Rs*HyhU$x-Fk~EEBUvO_3%;j5?$-g0;MzY+8 zSgMuWB>K8JL}i^T^15p0hMw2KvwR5j)bX3qsf(ssU-pK~^o7n*47j`^&yP?(OP z?m}@D5Aq9!kPLM{Dt^hI#1RcTw#IF>7fJ35Z`wXoKLd#jbzj&fn0S0(H{?|Q!q zrES+$oLmtku;o8DdcRu!^|(0**$xz)6gvAIl_2&BRq4N^BhmTbL}Qnp>d^$7p6V#O z)^-awmvaAylvFNFFoHmJ^+SmRF)QC#awgC*qi-la*E6!M+0ZiZ+rH3O2m}dThFI;| zkd?8qQXde}dEkHC%p>tHKEc-;Rm)g3%eV-jDJpT<0hdaqp3^oU^MkFL@|Su-DkpXw z0lX+ee(`5{CmL%8`EqX1G9Pp|unQl-3sEcVr38Zt)sJyxo1&YDnfbeVc}2MJy9k=@ z=6W#7XTSx2=&8fi^7Mpd-8CBOh*vAOqKCVk*BPAc!ta>4G%`T7)tT6;DX?9GL;0g> z5Ps>yxK4pbX}pF?KYcE*m50lGJ3iOJ)RS3B5%8BokyaWpSJS`m=`$() z^j7y7M<{#?>GluQKL(wRZR5vz>Y@MwZ+ki$DE zrkl>Pi1V{TC`SjNo`a6TBkSe)F83Z#i;KvDIgKwt90yD__|f`#8J{Y7wt=9)Byqh~ zwu_dcYV@#%TncaM~%V2luEmBj+y#; zzP__Y|D;G#j_;X1XK--b=z|Zw>eG$P zIZ6AvmaC-25m;8No!1;|>ujqc%`lpT2`Wbg&8Bfnh`eGUMyN(}neXHAH=Nt>nWq3X zm{Xhx=2a%T7L$XR#(u;udeK3{Ex2zg?D3&x$0Q5gVF>d(0^HrE@5r)nZUu{dp1`CS z!Jp`!I!GvDC}!h;O@eM8@pUJXz?K}L3t!@U2#<6qrbDV3w9&Vm5L zY3jz{))BX`GoiI}ba`RKC_hXjg)hB@Z1Af%ZOuMk9_!39cH|J ziRI*8tuYE>>WGZ9eDaD!a`W?dvYBhz_J7Mgrbiw04@3Rz2%QdL)kpH+Z zZOl!NGeiKbR-p?lU;_iilX7W3=>}Y@^2Y5@dS=9cB%lRfMkep3dHuK$8dnyf-W1pE zh@Zlh!tjV7 z1$k#~@C(AnJUv4ZQ`ZqY?||+eLVW6X^NiFbLp8GXZNW^|#UE3-VZ{!*NStyYbmxJ9 zD_#j9z1elFnp;#|o1z-FZ#Q@!{C1=X*3r_H{9`Hfz4eND0KYvQx`TOU??q2T3CcB zN?w(>DQ(W((A|O#A)3u5Ig+;lRmfr8J%EDH%Dt_S&lGhB`ZvkN6c|NyN?o1|JIA~Y zjUD8D0*Wjj$FA}xfA>1Ev-1Swc<35UeUk+$cV#$;`>SsOIl9I%N3M;!tQD#amt+}8 zqCW^IbW?g&%-qlLITE%aGRk3q zi|_{MQ<_zcawP!{{g3R$)*ov`l3PFbk@|g>EH&+Gc8k+h=O4)Nvd=7(*79<<^GnC1 zlykM;E$d;#QkqAwTN*=$?j9(0Wx;7V+g$`z9MAq11B;BW8?l-(?%v1trLqo~3kJdI zGcejmnSTW{jerm`c>4a0&8Q0{ER0|#4ixCV)@uh4tE$N$$Et2j#Gxv zfrBYygOed2l9;Oreq2>x+>1a_tpnp2a|3_E&1CB#Qgw{Dc|pIe=-llS|1!`QF4ZVF z;sm%+63rmFj~||4EFLwc1VaUiD;<6Q!pcH0Crow689R4D=UxKZ$LnBK6BqUP&Wneo(D1x3vxY zrzSPTdLw@Vlp=@8LIiWq4EK&Yy$E{df6M@wnRv)|uOFn^{YXr2@ynQj0>7pPG{TDi zY|B{Bq{o9WEX-W=VSn|B5Xjovy3-d-{V`4p-HX!VpxpuAXU?OAgdXqwQQIX)c;q+hS=aR-s? zc0r{6$X791(Xs=F?GsB$sPRl?ObqLPbH`IfGc1kiEtAneUyy1uMi%guE2gaM#>6ix z-GurmE)_{+X9ld*SA?ix!u;ajgE+L=m^wDoZl2A4`H5-2q1Kvi62+0!`CXchB*ao* z*6Rx=!DqFG84q{CitZV{uX7x-1^>i=g9mbejZ*dw zAW7nL5zM2z>o4stoEf+){Y#eW8Hguivj68#jw_j7TEuD}vM%Z%U8?wxyqw*}6Z;*Cd-p=8igDTD1nrM!zd*f`SsmTv zgr)7OI%s#$r`|L56>Kghs@Ea9CM+AAF7gQxD@0MYHe6|D=bz~6VLsk^!blNroNI1o zI`}V-1`&S`l1J;H>@8w6mV)?eJ$^TwT?EBR;9stG@CFbkRQmAiBt=aR*4HkYk^>bnI<>%!Q zB~*0b$ybDXi%n>Q=EPdxtLHyhyEbI@yCRgQjFN`+Qk)$}o34xl@zzQEJ$wUFIp{;% zSZANUM>(C7A;0zW-rZS-02S$#XeFW+I!(9g6l~BK$a!LK{CL zT$UI|2NHDBDoPNw--#xQB%K#QiG{_|fs6C2C9y>vn!y#T6gcCep&%R@9yD zk$}O!6i^`vvoC)trzBkw{K9iI;$81jWuYvG-I>C)`HQl< ztt&|E!qxS|LwSHFPeI_!M=*2d(j+N5?#vhYqJc_3X8TrL=>6BW1ncQ>XX~LX1h^a~ z+NZI6=ti)G2}+=ox(+_lE;}lEwbglg|7sxx>3u$-rqyY)nzQD#u^Ar*mxh#TQX-b(bb(HF)(r@u+ z#^{imE^(PPhtJ<$;bZFonb>tO$d=o@NOj0&93sZg>S+>{8v*KB5kX7Q16tH68f2EQ zHLvj_byXod=q{+0G!_?h_k_&uJCp=0H3da;7Qbexqwt)UC<2sEwYdl8d(=b;U*}wP z-0y#BMYora89^W>VDxQbE86%qqF%V(mkLd1y7X+du1dlC)s{9Bj#*+#!vrJ zn+s&^G+3e?1vB04N(*^<=K|Ntnh2gtuuD-G{jNkttKS4!!o*faikrFOZEp@d7gyg? zEjU(DKdC*uX=rLqT1@B=Ic1bH)tZE5Q-h{(Py_@8IRAd-WTq5MPJx@)Ml}8CXZ=Sx zeV*VI{0<5PCY8xd9Ij*2QWSOP<_7-k%jvk|Fdg7Eo4q!qLFZ(J^o~>1%+JuB9W~La z_aqwR-#-7LPWf+%m2|qde9t%yLoHcpQrOJP+duKz%b>?n8=1N)*B6C>Wp>)1Xcd?5P&De1O>rydKK+eX$XJtAJ1;`VRdy>&ES&((#}u&q zWz@J3IcI+@*nyMQD3Q71q}gY)yFWqpknQBx=E2|Q#}P0+=Cu1#An{tDgPYqa9wbmZ zUfu6Fx6&ZapkbBs?qs;z-}}4Wgz&`bRaIi&P^@Y~|L~*y1Ak0jup6Snz$8776Usfw zNo%dl2upvhECgGF{FCR;7i7g5pZ!wHE4(k6l-4H%zw+@BNGN^8vB{LddFik6#p7wOENGR?=UpzNTae63lJf{oWWr= z#-b?5Gx}a+qfzj75yJp}?7#K;k-a={Gh0L%l-U#G?yImifSJgvfa8@qpu_(Z5s>)T zyd&1k28@YjJ5(g8FtRg@VxV*~&wBJ{ks7R)>(d@tE0)a`FOJBp$yyyeTu^?TlQNY6 zpWh8=J4k@4x)d`JJCoY1I^AU-G~^4u+nsJI$!x%}t$%)F#PUKb;|C%Q98=~-d;4$S zE{713_eqm}JB05FPk^z8mj)v=RA#c7HseBhtrp{Yw09R2q<+@89vwfCb(yj(VA&&B z?!Gx?0ns4| zxKjJu7CR*^Kq&iz<9|!-pqbZuj%83GbAmI0KlsiZm%kpb6&Y-LzpXsL>+x|8klHsh zeR8KeT%MnE^b_wC6a@Sy$e9a?cXwLM>2|a?uNiX5*)2T6c5>6j@do=ir4dcvg=`;@m#hhJ|FGBbO_pdM{tgLD0^ zZ=dM0Wm~Jy!DD0ws>}^q5?1EIybAY_eSjXn-+XaseW6`F)xu)@RqZ;^rGbwjy|kzW zCv^}5|EC1%qUx%*%tS>|hEelD-;1#^Wh`r&mE%Q8Z~;eIvf0pn!ODQ#y(Kb!Y2bGNmn_2lb~ zGFq4@`1z00=;aZTGcs5&BGg-rJZYtYMtg|sY_8`=9C%AqWguZq= zU)1?RmgU!2x+6g+Z$e}-12;^p01<>nlBNn>&=;G8u1V@6%B=u8QHYjrEa*d zA!d=GDT>)sq6FUZ82pq4Eb<`b(6OT4LtEQTo7|RO?9jrmXsyl~who)ClM2hEDS(kn zbl7Bb%<)Ap3ON^+ylL_6{P{0?Un-RcNgscT=W6LIR5ZMKu6?LRRf7r}gj#vV2J(Xr z5YhdNTv)>`tNDHovMfu;EhDCvGyez%pVtf)eXvbIoc3g3pG_Td@@h!qTuadPKwO$2 zZr*olZ4hK?dzmlJWW=3b_=mGozNAW5#=ch?Bx;K=WfVIqmk*N@ze^zfh|)bqm6Xny z*nxIF24hwE?P>;Ym zbm`u+NXvrlKmO@BV{KxU5}~lkYIN0t$Ht-WEb&IIj`T;q(;)q*_lcwVL1|hiz3`KN z?IHFXJW;%!Tv6KCS*{B`wGx^5(E7HBrMM>y5_j~t7jrxr9U+-KAuG)U} z&drzoZ+hd8*hR$(d*Dnv2gECjQ?`|6jk?YLU%~3*k(qqQ-kG&UdYNcqQlfX7G;1tNBbMy5AqZL2^E) zb11+FJWO5L2$;g71?I$%3|m*Ijng`VBs-JV#oC1&2{>S8R?}#*=QrWY`V~Tehqq4 z-q`f?+=fWW8AWQ@Vv@uM)@BQ7D8R!w!2MT=E2%RiGP55^kHZ`GW>`48{dwT31LsFO zWpnteIE4*!OWb9M-03qn(Q=tDQI3`s+O&Sf93CfMwJwLi^d_g{lz39yztFkT?9}rk z=_wzr2w15MsNj2BJE^}u6;x+cfxe!gc& zJ}VU;2^P86@U>!>W_`Zr;XN0N_f$29t^R%<728)!y6Aa$0?1bk(uW`ByXE9!jiI!5 zse>C*O@1>jTmVTP_~;xp_*Hec(#P~U2DK#nR{NP<3oPV}5A`Z`Cv+|_zB7SX@t4t& zZf3(vC0qn1zx%&OF407igBZZ7V4__c4NT-LpD3|nwi}g~b{*%xlGGn@$j`jZ+-+2y z*`E}J@@ie$`(Gu>cg$-MaL6=E77k^C0YlL%B-XL%wYNXB${W=e`3gFx^=Vcwsbo`( zsKw60kje_1`VD=Jx&vz-M*|RS1NeSi!B05uZNojQ1TSi)u2aS4YC3$(e_eI9Xk`z| zrUjy9q?8O|hPRy|F&ZzKQjl1eJinQhcQkGUaF7-q3Dv`s3KPV0hfQP38Z zapsYwvny5+@79?RJG@a?w_BHYm+c@8@K|-n{7QM-hkHn7l*q)VN+Ep%jYUg&VHtli zHh?gN+J}n!kXomfozsy{TfWPfk`an>Jtqcf=aWxtD4GP0#K>QS;@4+?uE z6Z>7lSO>25_#yxzLU12uu(UnH4IBB4z0@N zisYgg7SH$XovwWuxQi;7j*^bEBL}gcb(h7y`0N^0ck9T8{c@M=9^?Bl&^7`g|KkfC z$RDUPp)7Cc6sYon{k>I3LqAPZ#wdjX2Z4tQYU^5KnR|p6Y=BP1!}%v>dX})kW=V_M zPM&?xL6)r77D=$N-t7ASk9RzmTlRWEL>0%d|M`uZMvzBlEWE8 ziUw~6X@oe+DADPg@q^T}(3NK((F=4;BxVba*6oXe^UBoU?zLAR_Fp1aMF7$~3QVvK zRhTb@FvWkC)YsF}6uyYYBtDVT%k$)#+u;~#$yA$3ig7&A`CviT5HEVzT(9qjTZKYD z(2x>D5;$O~9FcGUbG1VJ1n2f+c zB^`7jEO8i!STP~$szggT129l@6cia7u+c)8puj|!Z^SN|e4i|_5!knsJcu?12?{eB zD4ZX3%db z%0T*P6d0VSZ?$Bz7@ZJcl*Hds5WmGy!9dASzt#T#eOTht)HIbOYcPfX-i;ALnKe_hoF4$McSl}ZjfhK0lN$=XjrsYB4wS5Y%LzKu5r$})JbYCzmDY3=26$s z+F%Lle;mR>X#;*KG9_Yb05Mgz%{v+RrcDFYo%SB5Sb+W$boi1V;}s;Bh7icHg8`6U z@`BTVtLHFP!{i{jU1Yh-B4zXRkyUr|c+Y@%CIbe85he#T8(xr%>&U!l?hgy>8M%(3 z6^*`*gopB_4QVqdq=6<~UkjQQ~GqmFsGBr=7q z?yxVuk&L}Q6U$r3-`df?q)B#G@qdO&PRRGlgnDrxTKOU88(f&zz9GNw;BXb4oD(r6 z4~w(7SIRm-DY);Co^dAH%yAqq5gSNQIU0%!MQUH*Q737LkPs-SL@E4m2~tLfHEU>L zdKK}4e@>plP&IL~dD42@W`leBi$rM-6+u#Vo$CSj+YI>aw|$a>ImQWr&-*Gr1rmiF z9+Jx|PJ}&r%kn~Mzu5RL#_v4up}~-ofiYK3P2-+UEzorwA}Vvx9o-f?v?#A*`i|<} zx4kf+NMS+D$ohM!K`*y@9>~)I4>A8f6bDeSocd0}M(>xkj?$qpw_we)XQC7tqFv_aAJMV$>!EU=h zUp&uSwdP|L9ANDDENN> Da`dba literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-xxhdpi/uphold_green.png b/android/java/res/drawable-xxhdpi/uphold_green.png new file mode 100644 index 0000000000000000000000000000000000000000..5a38db29a6b845a4c0fc17c7c795086133e1ed17 GIT binary patch literal 4404 zcmV-45zFq0P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91LI3~&09Ym8qW}O9o=HSORA>e5T6>h0)pb9Q@6KCM zM8WVV*2DxPMn)bgBy|LVf$BprIPY=w!-*?VF`|Q2X zew}@;R_{}*-F9!Ox~zYKG4=}Y)kL5jvdiRUdOfPzPd`>cC8bgq2HxxDZr=lXQ!)XLNyC1tt}l#C$O6 z4tlLxeL`*AKC}7v>A6KdL`xI}{^$SGFy1+HAAs*PrRG96K%%K5_-~C6MMUhQw9(@H zK#Q4}5g5J*vtXD_=9L)b2EtR|^Ra}t-}zkmbG zBFUIlVSmDFtzQKJo!YqBXX7{(_&UHf;_q_W1v#)~ zfeQP=onfEtFz6xSL4dGPM?b4?3E>h2g&3v}yP^aF+hPD|kt1|ofd=3MPJL^~Ivfxn~ zRk{Jnz}rOIE3?oiemohR$PKp~?lYw4dF1TL-hXj!iii7&RzT=)GXaPl)XGx;)q&#Fl!#&iPnSn==Z zrnm8l5Mf_G?Vb7!T;Q9e)_XS*a5J>>H^9ipM82Iw;hl@U03};V%utREz%xDVez9u? zeicO0)jqGB>(bi1r5Hc7o@A_^3;zBLu_G1s-vVHDG$*|SOLjL*^Hz6) z^Kx!)iufN|7q0xpjP(+bqDi^Fm%Oz4VwLb;K}7o+cBq0oC@KeFssts7r?Wu)km*t1 z-TKMq6S?qY_911dfQQ;>V!<6`f@+HYXZ?V~F0A_ov_MwpO?NeIl-J!K=7Ku@MrVbd7MoZhl*J^FI_rJaJNR*10+m|14>uU_oOA^rnI1 zY{Ee8-W8WZ7jLJIl0``GEP%gUjO3GO-undWunk>>wbD(Vjk>@m^u%;$kq@K+mhokw z3ABk#c)fJquDdTG3Sq#j(s|%)EG0%y0{7P1HZ!*?EVS;zuGOD}q&7llDn(lGFihh3 zjK9jD#B5r$XVu(7IC72cn6Z8@-0e?Ov~d^4mFUEL!U_ZM7Pm&O3|S;xxqmblqC$P} z@s}Iz9~0@rzb9?T{SwJpJH3*m+SnOw>|=y2ge&KmcaMSziTo+sx|MK-h625rMK{Qx zgoXZaB2lqBCz3p!O}@z(Z~oPm1Xt33Q(v*wza0qe9jdqg4)py_`Y>io?1z!WJ*=9V zM0j~np3_~GsOkib`$(g>Y^`TADKz~`O~U?8q}SjfLwncxe34mYv`R;~66(0TefA^WZJ&DVnDJ^k@SmdO2m@7ETD#=!&qwo%`A%iJopKPu4#ONKz8mYC zWCE=xgR4>|P!a{Tda)RU5lm8b)PuAiHo8kl=>AL_+In4c7npj0(qj`?s~?n1RC%)P>R>GuUCwSxT&xR}XjwrC7G_r}dkanZZDB%j7R3jJqZh-(JM=a@(x6N1&|C zPH}ueyeP9(HZUuSSW#IUlqGX25D%J>_P>skl{zIJ2pDA0_|ZcltL?b=LYUI$SXN2t z^GU1SqeIP$#&v&ulj{pl%3R`5?vC4Dz3YN#Jl{98{}KvW8eRfJ|Bs!+MJwS{3i}Dn>m*=C{^sk?L*JjR|yOj zB+WV=9x~xT?_sFWaS}w!hGtDGgb1g$Q8#FT-735K=LYX5AZIl0Ed*t^eS?i&*L zh)ekz;?4z|>cc5eO%oa+K}@m!L-m zylNj#+P(7=C|G&l&TN&qAdK-bXRpn-Ztc@6#(?N4q){TeSFdlK+kBE`FdTLDZf>J+ zXU$~;-seRG-sj+8jxXq;?3n*mzD0-XhYtUWIM`qh*nBl7-yBy}_6Z32(j<+t1G`Ck zGC48osi+igP-sPs|CW4+pzt##@L}63>&X$Pz-JGFS}%S|N&$ZWN*;}Qc!S)?0ccu>Us-PWWl1evhK zJRjJ99CO_PF=BcZuRbOhC0UbGeTzM4qpc!kIUe@uT?7*bQUT~Uto<<8hK@}=-FI|$ z79OR#doP8oF6R!gECQ=~t!u`5)E$S{US8J9a?NWJf2fYyjI$q#pJRV|%)o3Lvr|YL zX~gPJNA=R=o?v}c$68S*6G~uMI9&PV*<_hmY%F&B0;!~7CiZGyHq80I>wOxy1gG*B z#uIMrIXH}34xtLIDY(`MCe45?HQSLP9u~KT90ij8i`tI52@xQ_QOO^Jakve<;19cb zICFeh&%}|!M^Nl(AJ+gWc#ERE6b%BU|9q`Kc=D3(oujKt!+>@ zh$ycwjPfQf8hSnKyR9@{=iU(p&>_K*Yh*NQd>xLeqe+v{rqquz%Q9&OILCXv0okQ^ z1qLc`UY~htGTxU(hktG*SS>pB&Y&s#5ydWU0UEuL(R38jc-n)ftS2oL9B4a(6WGRR zoZo{OkV`i2w?yR&WQyaw3DfyHoNh8{N@0Lhu;R#?wa7{{8qVY?Zb%%?8)X6Nw9p9T zT*!F0Y@5B|wG8mV3~&IG9tsD-Gvcn0>%-eL;C}2Hjsa0`BrWa)V9MD)l7@7sGTK#o zH;^i2%!PaF8Mqom_bGkQlu+SA*=r5j0S@w#0=dq5R2jq;RA8!bY+ECxlRzDhGFM^U z`R~*{s z@9KK{?nJ`w2f}{3C>kDYhW*L>=W0pjpeFDl2bGO|+@j>d zHQ9s)=l`ay`g_N6t&)=g0^&YkiysI#^Lj^!)fy)z_gxH0HQhan)jS{iUaXq&ZeOFle#8NdYZZOK=$jj!;@fJ0V$@GEqk=UJLh=6A{#<>n`^N=8R{>xG?@*P`CgC#0`8dE(&<9nb!iosNSQI4 z0R|Pan-_I9EXe3C>T&Vz`h_?c)zD35HdzB};a+a#_E~F(EHV$t0FiH>(cFq{y%)&c zASSpW2Bj&h*Ua0s{E|#U3O)030@qn)nZhgAl34hCD92s?1I_}6XITXG)q7wu`BYpj0=cfPab(k?|E4Hi-OB=9v9@;JGe zId2AtWbvL=vr#5nZ%Tq|4?a zdG=))1!-{{3EVc+VgGsSthLV#20XvF5i<}iha3A@&YRDH@>?L)D?w~I{8Mrm3^9|% z%Rcy>ohI(LJOTF{%^k`2`^G>-1S=Q*Y+^F9$H`EYi>2SI6DrUL^x@z@+v4xxTJD4P zfdoE~!22bE5gRe{nzC{?s;7JGn@`p>As7tZminc(@1?Pm26}o=4cGritBi;N{&2$t z!DhJ4F*xj_THyBp@k_Wn-jB-Ov4qibfrx-shOjmUWveR?9j?Km*P+7kQQU7GLvi@8 zwpXvq`D3bx$U@&ip~0cX5SHpt0Q-|f4}PI#^>o}BPv;ySPQo~kocKvB8e&+$-@NgB z%O(dR{4m^9237uyTZOJ+Gw@zoDX7o$L#sV3g-9I0000Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91B%lKT1ONa40RR91GXMYp0Qk-^ zETF6@C~hcfEHNMiGyxZQpavvpLKNc`B8h9%_(IeNtuaB9`l7g@Kvaw-nrcu42`W&n zDF_iNG_@2c&=$d^6zlK*eRFQ--rjF3?ThiB{Cm!vW#)WyXXegrqM!?CZ*M<`v(criSu(Q zDv>FOPDbH>5iW?t?Wes3R>8fn2?~SYSa>D87LJ5I*3x*GM_KC|bJ8hhD%=fyY@l&F z9FnaQVv67b_!acAm&Wzk@$xP?}q!Kp#?=7Av*}11dmvz zlgE(1z)kQaI0L3F4xfsc2Fu_^s7>JiK$^++br~xnXc*k7=p3NOcXPBuY%}4P@E@2B zdk7dF?IUR8d@ZJj25djVpP{DOhXz%Se#jvBD%6(uq1n}sR3H9hvzV1Aoo5^4ba)aP zcA#ic4uQR3A6N_*!*8LFN*dq$2K24)UN{c+h3Z2KeIEP?8uSBZ1+yXrLm{lN2;?{L zyikzWz^CHwgNI=hT7OGmUoR!3;!|OItcLX{I_XoOQ37pt4xsBS$qM4;czLMF$Cc9o zNbE>hrzD_Rni331<9S&f9uFKD6k@ezbOJ|FjUnqfrLKuv>LtIN91ertQB}@y6d65T zW6L6Lh0Br9n%L&GSD|-asF9wC(PlX0^0aCCsmcrBAI?}2$%$hq{RYXBaU~Svj{miHZW!M$9z)-9q@wv1@4)X>TS+&3b``sjA^SNTLSZ$r9@1O zOuCgC>Q&G_s6m9-1xRN~nv#qtD5yqOIz5w6+z&2b60*|Y;38NoC4$Lb zd%dS;Q#TNxUoO}Tr&_7MIyh~Y??i7@g@O`=GvV~47XCBQHCvEYd^jS$wF~nR=eiOFlBDsug{W3)TX> z)9DiW_>)aIm=byYwHyuTpE-+Y+eUex8vazTwuYp?2b-mU#Z){jr5328-cJAB$$W(U z!$D)|@$2oN!tRj{j>C778h?UX#!W;P(M^1S%GxeROou)OZccE|sUhel9%#e(((sCD|wWEJDXsc^lg%K%{*I%7A z!U?D&;00)R?$;S}JMHwK;&Y)sn+=bkRJukDGPw@Y_t4=XR=ZbsWnnwirCzs8LAOqO zS$8DGX$0!?#;&5;ns#N?r_wcXIdL{(b=Uq23i{;HM}(lF=EdctwUJP!%or?7n-p=7 z`$SB>Os_;jvo}fV2R~JI1e&d)Y&{S&5b6;}p)b~)AA4vV5_L=59PN>|E&Nct-ymjr zOrF-Fj+Cy04u(VhUnmM)eeJ*u2Ef)I>eEJ_$3DKJF**o59fght!_|K8PX8LY2wn}Z zf_K1mFbciTY^$G6DIK|VSO~Rk?b8=EfOe$q%D{-CUG*sJ_|Ha1m))b$xxUS`KJ;ap z4*D+B34KYvqbBlAuy_X3p{8qT3Dnw9U-fVs+{6i-_NxT{|M>6BKwfKzb)(%f6Y36J z#X7OuU}#2&8;U_620EwK5!V(9$k2%U2Fnm$@DR>27oa;$4SF5aO;bhcN~#4u4%&(Q zH2QO}`#}L~VZNy7{z_brR5AnZ%A+E^TyN~Lg48hsoDC;Ky|3)9gBn05w*Cn=4cb>l b&NclDAmCw@ZhdY~00000NkvXXu0mjfTCO`! literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-xxhdpi/verified_disclosure.png b/android/java/res/drawable-xxhdpi/verified_disclosure.png new file mode 100644 index 0000000000000000000000000000000000000000..9f50a90837469ea46daaa6be5b32fd5040adc1c0 GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9d!3HD?58j^-q!^2X+?^QKos)S9jHyA|J`Sz++e(~j-ZaRtn6N}Y^q-`-L8mG1hdukO_Z(-W z%op0J_c86_2>J1zF)2XJhWSX=k(Wmna%C`R^Jz96VtB#PTfQv$wkpW~p00i_>zopr E0P&4@djJ3c literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-xxhdpi/wallet_add.png b/android/java/res/drawable-xxhdpi/wallet_add.png new file mode 100644 index 0000000000000000000000000000000000000000..817bf626897d051690585acbdf58ae8c1604416d GIT binary patch literal 1222 zcmV;%1UdVOP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91JfH&r1ONa40RR91FaQ7m08TFiT>te5TFp-rK@^{vEmb&p zgrJEb9EchdKOixY1HD1Knh-w{3T;F92P_|68iIiQ1q2He6iqmJFp=m54jPR_h%v^P z7>$UD-Z*HrwEKM1vdwgvF1zh6>;iL{ulIiQe*0#3-pni^2Q1N@_|DJID^H)jZBa9s zb3o}aM#zpjJ7GHA4;0cAl<%rvc|JRSXI&i6(D-n8;A~pmybpw&7nM9yrZkNX8obih zG~C|ap5b<5U7mvB{^m4nE_;?Nrv>0s0S2EeEI-y*Dq2CzJ7ck<|ohkF~O9>yn8ofpg%mc2rjo12Km{sLi>It~QARxKq=C@pxm(c4MA zvfJy7QHjlpA}8#2Hf7j%NVtrL=LywA4|~E*Wf*zjJe&O&OP;>s?*_m$bSUa_Kwl1;e#qY0FmAL5?L4$K%648D+!T1HonI(O#T{h{2N8 zAjcA6PBbxf_qJa-Qtwyj84Mk7XykV@-ySTP4{}PH(((Avm)#_&ABzVx`oP|7kRv6m zX4Fpn8VB?P8P!pz&ZyrleNw_aV#3I2UnYhxz3LP*C$USlnN?O)e#F>0RVqMnJ(|j4 z7nj(J9yUH6`$Z`U;Y-gq?Y1P2#W6XyEr2$HNUuvfLeWLMTWZOVL+R4&)L0;2cetPh z6?~1gW2h}>W`h&U>#!XL7-5J(g^`?7q z2FU*Lq78`izfvoEJ(m*3bxR*GGO`Du@)j zMiE4c7Nvx_^vvYQ3m>g$!s)$QRJ+U$Ef}y0Q|ubW3=WQIoSgf)G#3nPt+~cVNP6)a krAoX;DHTToy}z3N13EjKDKaRAZU6uP07*qoM6N<$f~_J1MgRZ+ literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-xxhdpi/wallet_withdraw.png b/android/java/res/drawable-xxhdpi/wallet_withdraw.png new file mode 100644 index 0000000000000000000000000000000000000000..4273668931f23e89a0f043e98672583f545e0a24 GIT binary patch literal 1373 zcmV-j1)}Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91JfH&r1ONa40RR91FaQ7m08TFiT>te5nonpHR~W$Gdo#PZ zJy^&gVh=VH8d@mykAXrxB;vtf4+_%IKakz*EH?B~d&q87kVR@tw<7JK5bSQ;q_sjW z?V(U<59*<%e?k>0SUgFsf(t$5pxf-uyszKeIMbQg=Va&4njQ4PFz?Uzeee6dH#6^> zH$%uHmgsuCOG``2ci;a$%njp3pmZ}MWL=&0Y<9aHDCiWFzj;#mVR7#GEqi~S&THD? z7j)kI0tk7@t`wU*r8-W~u|1G$K z%#8huDUF!59O!xz2%p2mn-VYrzT% zFoKt|l_;g0f%4j!GbetrDtkE7xaV$-mE`|uNBEit+tFoa?N)1mcv+Nc=>hhKJKRNpwQBn2Yh{4 zV3geOW0V6Kz$+!~N2i;zjMG)_>Oj;NKMoQx}3Aw>1T4e{PUh8u)&QdPfp!Uu*5EO<12B9yr`4Tu$QlyY<^Y;qd;(n z2$!>Sxb(d3CBKnvmCDQ?*uPkEt>kNlbGgG?aF3{9YUA?r*2Ki2SIu%9&c1+EHQ90S z(W~&jfam6lHAdNt34_bdxj5~F2)}*b!`1nZj$|gMKUa00Dwj*wO!#h`HLciZ@cL0s z_yF!;RI8PewcQ%DKi|Njqw3u3ji4R+(bM7HA`p08=x`2u$F-@0i=D+T5T z&*0N|#4YSqMx6n#_8@Kez!-Muaq0e1VOB(Urj0e*!7Y}{Gk20q z-5C^mJe&WFH^_Byh`jKm_4TlA10cAMEzPJm07Ssk;Q9sp{L>!JG9rDDiCGn(b`+K* zgVN8XI2sqx`2PZKXSIW%y+Svz-GG> z4WnreQ z`xK%v1$7cHm}||UD@f700000NkvXXu0mjfySkGC literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-xxxhdpi/check.png b/android/java/res/drawable-xxxhdpi/check.png new file mode 100644 index 0000000000000000000000000000000000000000..373651de64555589e4d142729571c472c020758c GIT binary patch literal 3306 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 literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-xxxhdpi/uphold_green.png b/android/java/res/drawable-xxxhdpi/uphold_green.png new file mode 100644 index 0000000000000000000000000000000000000000..d683053449003edae0e6e2955f0a6eb556691961 GIT binary patch literal 6115 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 literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-xxxhdpi/uphold_white.png b/android/java/res/drawable-xxxhdpi/uphold_white.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c6e7f061f5b4f9d48f9d77b680582b00de13af GIT binary patch literal 2473 zcmV;a30C%rP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91L;wH)0M}(I0{{RC6G=otRA>e5nrWU1X{uGr^1CO&aqX>AE8-J`~&v zz6GsP2LbK`yRP*XP{X8+-=lfyH1Y z5NTL#57f&ez9}m4^SC@f|#B_(Z8tzaNH0)9!Esh_`d`UXew}q zlVX91U@?ekI*N@m-11d8JrGAqWDTXIK!tq(?gPhw!i8X~FMA|t2k(J};CGPq6;O9S z0($4y*m5zxQeGu#4)&LWO)XT4C9glY2z&y{(sij|^#r1h0$CHQXn~($czhfmoxak? zMT2D6>C2Ce^N3c7{TDQB=KL~CFe}h}WRUm6sS%!Wt zP~6o(arXw=ZBPeCL49D|cU!%2zFL0~R$ z(&ACO=b+Tm==2-HNULW<7W>VCRwZq4S@a;vEgJ?h1MG)`_~?@U3K(nvJ_1fxSe(Kv z0k#JVJW#@SlGY5vB7yOn7{&Vnd84W?!btG18O?_8S2ZZe;IlEPH|7;yYyM^h!&S}j z=?i9pKx<%hjQ^hyCWV|Ny)@*NN%6fmilZY(yg5xN6EoNn=iDgvJ(WC^nt*RvrglW# zrb-b$nwYCCj(X{0pq0kIu1wA;6&z!HwgJD&IUx=CKFSybe3HC_oLbfz6^4D*xW6y> zk$*dI`UzoJ$S<1W^NIyo4nJ58&{E|+S1q_i;3*bZtj25g6bY}h&l|w$siN_N9nRX1 zoQ_Zf^y!^02@XY491jD3TL2wH4v2lx?FFLtrdQdMh~d7LoyqE!=d_!?z#U0zLUOoUh{|uS+Qf&Sq?|#eIl0DJnJXUp6odZpi5Wk8I47v4EdO>%96DJ;mBTSLwdn#4N8`|)=cvX8S= z1oCw8(JMlrZ(tfu-c%3-d^DMLe-5N`&bG0g%jElRuH(<3-pS{jYlgb#<^>u-{tjlZ z*X4$j*X%1SKAOz0nqK4kK$BA}mDMoY%amGtmV}=E&@yym+TY}uJs5=__Fj(-O2}_U zwueNri^CDTV?Ux3)`SMU+SQ&7)`|WslLMtUzY~Kebl(kT3^i^a{|98c6p9^@x*tM?dBTS`?TT(n?Pz{;E%^0n|ZX z{d9}J6#m5^R~x`5S%UJpkU^@->b&FRy)V6dTBSHfT*jFcP#Nz@K`&6(>b;=afFyGY z>8gZRqQ@=|xRK?F{Uef_5m!b|eihZ>?F!4+oO#IP)EwwV%Vv}Lk{Jwxzu4q;!Rlxd z=zN$xgFvc%W2VXJ1|%7Gld7eGt`18U3a$H2)!uStNj{EIDT6XK7p}8dI{Vy3Cwl{H z8-RgY=yO4VCMSWGC22?+9=(HMP8!DuW!!*|pFUqkF1G8_dc7bl2Z3~rI~oiDdTk4& zInxpms67ND)on{<9}2u2z3$aLCuLRuhg*P?cHKR|d{dTw1d9tJ*2@;J6JBM^F`d}< z*sr0C)21N)Ela-%zY792JObwxL=YX#7lmM?dMY2f1vW1I`{jFhk3Th5?DVn_{G`_)`atOOHFCy>tdqHcY!R@3g`EYniwrBC_t|m zk7t#h=$<1T3v>{x5PW|y8cYTCXgV3qEtjF7qA3OGVfR`PFMFseq@{5l(AN_5^iprg zXqUYS^vr}U+6dWE=qT_SXqGf&#+E6w$8D)VA8;zr4~052H6nc-J*l4q{C3w=-TaxN zsQ|%=$|%-Ipf}FZU>C4CkbVW|06OXFRQUm?-qoZnQ;#(ut_cm&bBoUUDx-@Ecf~gA z<@G(Vz6VI|=*8}5pf?}ABIsD5#_j}kQ1kU)%j$77LcZ&cXuwur322pc9BKLh z7r)Gv=>cs{pOwOh*q(W%5ha5$I@{GTg` nDbhKp9gGA1b5Vg(vQ7R2S{Qw`G>NAN00000NkvXXu0mjf#d3gc literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-xxxhdpi/verified_disclosure.png b/android/java/res/drawable-xxxhdpi/verified_disclosure.png new file mode 100644 index 0000000000000000000000000000000000000000..58c491db601f906f0b17f554faf297272bfdea2a GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^57&oUH;<*!DyLXa=LGr;B5V z2k+ZyhFpgXMB0`%?RD0FpklH6MTkxNVsoLAveKf@OmfZ#Z+fyH{B_h!$m_nb87u4W z2j+&AKjS_{dt1q>Z_;_aP|<77!?axv?k_rW*1R~ik%=OOrbr&yw^!toOhTQa(z_}j{DE&I8j;orG+b1gUSw_obxznkw#skisv{Z(R- zzlF7px|OP^8;C4XW+HEXlca{rA_MPiq(HLi0Ho~v|b(+Al$~!2&#!{Vq8xAYq}cSiJjyQ@?D)IY@~Bby xPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91P@n?<1ONa40RR91KmY&$08s$j%>V!dRY^oaRCodHoIPyQKoo%AIZ+Ye zCldn|LQGxRfCVZfHYTXVR0?jTPIN&kfdxejptKSLtr#k$ZUX}nQkj@h#R6m3P6#1> z#6kg8P$fRznOv3H=Zll)*o|`@68rhydv~ATo$sBU0GQ1XNRt5T#JO$Hjy8bVs5Hs} zh5`6cC;I(YmhE6$KVw_hbHE+PnP2y}Ariounex%C-`frXyXrSESjTLwc(`CMER=uB zcDDsMIeF(u9pEi+ep)IG^fzN0d4TiF%X7a32df>72EdYm*Fp&c$z#$KX(Q0K@11Qx z{auT?*=-WYLH?ZMJbJHo8!f;r0*Sj#1|X5B0cZdc2@usy1R8)u0z`Eafd(Lv08!mUAQ7OK3zy5~ zp${LoAGiP$nEM`YXLG`y4JOF#l;nBFzTj1>ojO^#kA8QgxL?0LfF3-~ONlfBFA!d+ z68aSG?k3{1hfcgM>_uJ=ov2Kw;Zs!)s_g$57@^xz9R>8$@ENE?L;(&vfs##`xrqeG z1O;Nu_DiKqyP)b<8q{NP!xLk+9CideArm~jXCh&D)tWQ!ou`89wS8*+DEbJ~Y!m_p zAcY?4lE*-N@IKrC{sc#ZOE|m!mSgbHsm`qu>(w{vqzJ_40t_EAzrqK1W4K?$EM}zP z@|7D?rOSOofLKuyz^SRy2!cD~uLF1ab-ygD$K)>Dk6`xX{@4JFqONmuQUq43l}!dL z@ahM%*t7i%b~pDI*^tQ1aUDR&x~Ve>AY+WPgM}-M!AqPl{s6`{a~8X~TCKe9rZP$C z$O&<)Kb5TYeAqs@3$Hvae?{Zh!W`^NxhfA=$s$yq6oC=!XTFF5NW8?_E*zG_5`AV$ z-9#YqavFfK0938G5)HRiPs3;1N_Aeqi$MISb*@U&NW&+s#%gU3pjchC7^~n!IJow& z*6Uu1K7=p1qT9Wp{h_H{aSpo+$F))&7lJ*xZI=_`$aN6`(2_fAr!kR@rd)70w@soR zB6n_iuI+WeW$N4I$_rB2dkCIC`EP<1l_P>e}b5S{8vpP2xd<}4x;ci~Q>C(hYL zCL*v?fN_>L0EsjWz+M8xXCB^LkbWQdJK|%0*`OY4BM{#-_@n~kTJ^``r=Y5HgC^6a zau(-raK=62ha!GI`^R<1@owfn75}j>_l(~G&7w8}8RQ+B`53fC?n!uV8$%7WCbR&> ze*)k*_(E$Tp_4NAOvqhiH(G$gN)BKe*9kWwTkMB|s&!A5EJ9n_0u=v`Qan_+fUmEu zMX=YiB3RK{T*g(lRI(`kv^NoHp!rWdW2yZ0Q_D?6)`$8na_6vjo~gEtz9En-fq(Ex VRzv&Afu#Td002ovPDHLkV1k_PBOU+% literal 0 HcmV?d00001 diff --git a/android/java/res/drawable-xxxhdpi/wallet_withdraw.png b/android/java/res/drawable-xxxhdpi/wallet_withdraw.png new file mode 100644 index 0000000000000000000000000000000000000000..a4d252a5b750012f9a92f4c36dd3c4af0450ed82 GIT binary patch literal 1388 zcmV-y1(W)TP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91P@n?<1ONa40RR91KmY&$08s$j%>V!d)=5M`RCodHoIPk1K@@=B>_vkY z%~gVmiYTPDQyYzfjaWs&N~4!RDq|re7aMb0D2ZTU#3GPva#{$2+K8oyjh40+DltUG z#zYM&xgFnIvtiwzx!awcJ8yRej@x}ZZ{ED`-t5l4**ySVG=XLkU{Q=0i$mR2U`15w z<^bCO`1&aNtyh=*Mqd}u*XKFlrfJ@I?)9NAfP;hO&c*M`CIUO*Z6I6w>|tSJzBn;a zUUK}d39zqkc+(2N3*daOqm=1y#$LAp9GspW|3(~)S}>{rlNz3j5(bjZWK|@Lz+&;z z{wl1zbgApjRRTF^J7AjEUkM|S!%9&T3nt*O!QmWUEXI!D@by(-2Hb1U8RsV_#}<7D zQzRG|C>4HHt=rs!(_Xi1HYgNEAdc_tUPanBthS43hev*rkK`+DdyB(H2#|B0_bSpp zj{Pq|@-)iAe0A6e0j3d1(mrW`l0-E?4N#JRq`Hnk4N#JRq`Hnk4N#JRq`HnkNr3jf zaJgJw|9)=yss+%C_r6YKMB%=iV@1sEt(T?lTU*JW<;GhSI*_oV=)6-pGpqySD$jlE&O ze2;!GgWZkNiB_&F1&}eu*@k=%WAFecj9-DVH#viyo1Gea(#lYx^j-QYJaeb~2@Rf# zVpL^aO3l5U`*DSFI7fCkgPGksJ4RKd&ZHtxC5X6f6FlHBf>Ww3^r7u{bIXqh2XD2< zZBwL|I)F~(xt+$D!m*_v^N&?q^x;Ax{E+Ucs^zTpL5x+bg#Ny#xCRGA*fS0$1!bgrXw9z|SO>jb&8V|!i0 znXc?>i*DE;M%~(?m>q#62s5NguF@u*;|NYtk+`<#M#~ViD25AgBqKKH2LPpJ493QA zB5WrKNv5oz4YK8=gH+i`5~7pFa`)Ad2{X=NSK*{G)$R_d+D>9Pi#XU3sH*e-L%T^v zVvs+n2S`q>tQ3cWx3)3Q$EJ)-we^81v0aHWsp8u%wA74mTB;`a}cn-@kPgEljAi%BbZ(noQd z|0g9Cw~+unAwc?106Y)g572A4$Vnf?H7u(iW>*N1lyU$Am?wN4)<9U(YD^63o8Y67H6^iMq%bNnPm<6(S^qk_-Fyhosoc}XUr u40d8!ckB=Pf4zO(o>5|>izd)q0)GH(e;L8#qlp0k0000aG literal 0 HcmV?d00001 diff --git a/android/java/res/drawable/rect_round_corners_12.xml b/android/java/res/drawable/rect_round_corners_12.xml new file mode 100644 index 000000000000..cfb0e71b2c9a --- /dev/null +++ b/android/java/res/drawable/rect_round_corners_12.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/android/java/res/drawable/rect_up_round_corners_12.xml b/android/java/res/drawable/rect_up_round_corners_12.xml new file mode 100644 index 000000000000..718e294099fb --- /dev/null +++ b/android/java/res/drawable/rect_up_round_corners_12.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/android/java/res/drawable/wallet_disconnected_button.xml b/android/java/res/drawable/wallet_disconnected_button.xml new file mode 100644 index 000000000000..497a105ca487 --- /dev/null +++ b/android/java/res/drawable/wallet_disconnected_button.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/java/res/drawable/wallet_verify_button.xml b/android/java/res/drawable/wallet_verify_button.xml new file mode 100644 index 000000000000..6da4ae2100ae --- /dev/null +++ b/android/java/res/drawable/wallet_verify_button.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/java/res/layout-land/verify_wallet_activity.xml b/android/java/res/layout-land/verify_wallet_activity.xml new file mode 100644 index 000000000000..a67e3facb1b8 --- /dev/null +++ b/android/java/res/layout-land/verify_wallet_activity.xml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/java/res/layout/verify_wallet_activity.xml b/android/java/res/layout/verify_wallet_activity.xml new file mode 100644 index 000000000000..dad3c86070f3 --- /dev/null +++ b/android/java/res/layout/verify_wallet_activity.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + +