diff --git a/android/brave_java_resources.gni b/android/brave_java_resources.gni index 3f836459502a..3de3a69825eb 100644 --- a/android/brave_java_resources.gni +++ b/android/brave_java_resources.gni @@ -640,6 +640,7 @@ brave_java_resources = [ "java/res/drawable/rounded_filled_binance.xml", "java/res/drawable/rounded_holo_button.xml", "java/res/drawable/rounded_shape.xml", + "java/res/drawable/rounded_white_bg.xml", "java/res/drawable/selected_indicator.xml", "java/res/drawable/shields_tooltip_background_1.xml", "java/res/drawable/shields_tooltip_background_2.xml", @@ -742,6 +743,7 @@ brave_java_resources = [ "java/res/layout/toolbar_space.xml", "java/res/layout/top_sites_layout.xml", "java/res/layout/tracker_item_layout.xml", + "java/res/layout/uphold_login_popup_window.xml", "java/res/layout/user_wallet_activity.xml", "java/res/layout/verify_wallet_activity.xml", "java/res/layout/web_notification_big_brave_ads.xml", diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsExternalWallet.java b/android/java/org/chromium/chrome/browser/BraveRewardsExternalWallet.java index cf78ed29e861..ba6f58bc360a 100644 --- a/android/java/org/chromium/chrome/browser/BraveRewardsExternalWallet.java +++ b/android/java/org/chromium/chrome/browser/BraveRewardsExternalWallet.java @@ -24,9 +24,11 @@ class BraveRewardsExternalWallet { 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"; + public static final String LOGIN_URL = "login_url"; //WalletStatus @ //vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom @@ -41,16 +43,57 @@ class BraveRewardsExternalWallet { 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; + private String mAccountUrl; + private String mAddUrl; + private String mAddress; + @WalletStatus + private int mStatus; + private String mToken; + private String mType; + private String mUserName; + private String mVerifyUrl; + private String mWithdrawUrl; + private String mLoginUrl; + public String getAccountUrl() { + return mAccountUrl; + } + + public String getAddUrl() { + return mAddUrl; + } + + public String getAddress() { + return mAddress; + } + + public int getStatus() { + return mStatus; + } + + public String getToken() { + return mToken; + } + + public String getType() { + return mType; + } + + public String getUserName() { + return mUserName; + } + + public String getVerifyUrl() { + return mVerifyUrl; + } + + public String getWithdrawUrl() { + return mWithdrawUrl; + } + + public String getLoginUrl() { + return mLoginUrl; + } BraveRewardsExternalWallet (String json_external_wallet) throws JSONException { fromJson (json_external_wallet); @@ -58,29 +101,27 @@ class BraveRewardsExternalWallet { 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); + mAccountUrl = jsonObj.getString(ACCOUNT_URL); + mAddUrl = jsonObj.getString(ADD_URL); mAddress = jsonObj.getString(ADDRESS); mStatus = jsonObj.getInt(STATUS); mToken = jsonObj.getString(TOKEN); - mUser_name = jsonObj.getString(USER_NAME); - mVerify_url = jsonObj.getString(VERIFY_URL); - mWithdraw_url = jsonObj.getString(WITHDRAW_URL); + mType = jsonObj.getString(TYPE); + mUserName = jsonObj.getString(USER_NAME); + mVerifyUrl = jsonObj.getString(VERIFY_URL); + mWithdrawUrl = jsonObj.getString(WITHDRAW_URL); + mLoginUrl = jsonObj.getString(LOGIN_URL); } @VisibleForTesting @Override public String toString() { - return "BraveRewardsExternalWallet{" + - "mAccount_url='" + mAccount_url + '\'' + - ", mAdd_url='" + mAdd_url + '\'' + - ", mAddress='" + mAddress + '\'' + - ", mStatus=" + mStatus + - ", mToken='" + mToken + '\'' + - ", mUser_name='" + mUser_name + '\'' + - ", mVerify_url='" + mVerify_url + '\'' + - ", mWithdraw_url='" + mWithdraw_url + '\'' + - '}'; + return "BraveRewardsExternalWallet{" + + "mAccountUrl='" + mAccountUrl + '\'' + ", mAddUrl='" + mAddUrl + '\'' + + ", mAddress='" + mAddress + '\'' + ", mStatus=" + mStatus + ", mToken='" + mToken + + '\'' + ", mUserName='" + mUserName + '\'' + ", mVerifyUrl='" + mVerifyUrl + '\'' + + ", mWithdrawUrl='" + mWithdrawUrl + '\'' + ", mLoginUrl='" + mLoginUrl + '\'' + + '}'; } public static String WalletStatusToString (@WalletStatus int status){ diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsPanelPopup.java b/android/java/org/chromium/chrome/browser/BraveRewardsPanelPopup.java index 67867bcac7a2..515c002d5b53 100644 --- a/android/java/org/chromium/chrome/browser/BraveRewardsPanelPopup.java +++ b/android/java/org/chromium/chrome/browser/BraveRewardsPanelPopup.java @@ -133,6 +133,9 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward private static final int BALANCE_REPORT_RECURRING_DONATION = 3; private static final int BALANCE_REPORT_ONE_TIME_DONATION = 4; + private static final int CLICK_DISABLE_INTERVAL = 1000; // In milliseconds + private static final int WALLET_BALANCE_LIMIT = 15; + public static final String PREF_VERIFY_WALLET_ENABLE = "verify_wallet_enable"; protected final View anchor; @@ -171,8 +174,6 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward //flag, Handler and delay to prevent quick opening of multiple site banners private boolean mTippingInProgress; private final Handler mHandler = new Handler(); - private static final int CLICK_DISABLE_INTERVAL = 1000; // In milliseconds - private static final int WALLET_BALANCE_LIMIT = 25; private boolean mClaimInProcess; @@ -181,7 +182,7 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward private String batText; - private BraveRewardsExternalWallet mExternal_wallet; + private BraveRewardsExternalWallet mExternalWallet; private double walletBalance; @@ -1690,14 +1691,7 @@ public void OnRewardsParameters(int errorCode) { ((TextView)this.root.findViewById(R.id.br_usd_wallet)).setText(usdText); Button btnVerifyWallet = (Button) root.findViewById(R.id.btn_verify_wallet); - if (btnVerifyWallet != null) { - if (walletBalance < WALLET_BALANCE_LIMIT && !isVerifyWalletEnabled()) { - btnVerifyWallet.setBackgroundResource( - R.drawable.wallet_disconnected_button); - } else { - btnVerifyWallet.setBackgroundResource(R.drawable.wallet_verify_button); - } - } + btnVerifyWallet.setBackgroundResource(R.drawable.wallet_verify_button); } walletDetailsReceived = true; } else if (errorCode == BraveRewardsNativeWorker.LEDGER_ERROR) { // No Internet connection @@ -1805,7 +1799,7 @@ private void SetAddFundsBtnClickHandler(@WalletStatus final int status) { @Override public void onClick(View v) { dismiss(); - mBraveActivity.openNewOrSelectExistingTab (mExternal_wallet.mAdd_url); + mBraveActivity.openNewOrSelectExistingTab(mExternalWallet.getAddUrl()); } })); } @@ -1825,8 +1819,10 @@ public void onClick(View v) { case BraveRewardsExternalWallet.CONNECTED: case BraveRewardsExternalWallet.PENDING: case BraveRewardsExternalWallet.VERIFIED: - if (walletBalance < WALLET_BALANCE_LIMIT && !isVerifyWalletEnabled()) { - Toast.makeText(ContextUtils.getApplicationContext(), root.getResources().getString(R.string.required_minium_balance), Toast.LENGTH_SHORT).show(); + if (walletBalance < WALLET_BALANCE_LIMIT + && mExternalWallet.getType().equals(BraveUphold.UPHOLD) + && !isVerifyWalletEnabled()) { + showUpholdLoginPopupWindow(btnVerifyWallet); } else { int requestCode = (status == BraveRewardsExternalWallet.NOT_CONNECTED) ? @@ -1838,12 +1834,15 @@ public void onClick(View v) { break; case BraveRewardsExternalWallet.DISCONNECTED_NOT_VERIFIED: case BraveRewardsExternalWallet.DISCONNECTED_VERIFIED: - if (walletBalance < WALLET_BALANCE_LIMIT && !isVerifyWalletEnabled()) { - Toast.makeText(ContextUtils.getApplicationContext(), root.getResources().getString(R.string.required_minium_balance), Toast.LENGTH_SHORT).show(); + if (walletBalance < WALLET_BALANCE_LIMIT + && mExternalWallet.getType().equals(BraveUphold.UPHOLD) + && !isVerifyWalletEnabled()) { + showUpholdLoginPopupWindow(btnVerifyWallet); } else { - if (!TextUtils.isEmpty(mExternal_wallet.mVerify_url)) { + if (!TextUtils.isEmpty(mExternalWallet.getVerifyUrl())) { dismiss(); - mBraveActivity.openNewOrSelectExistingTab (mExternal_wallet.mVerify_url); + mBraveActivity.openNewOrSelectExistingTab( + mExternalWallet.getVerifyUrl()); } } break; @@ -1872,14 +1871,14 @@ private Intent BuildVerifyWalletActivityIntent(@WalletStatus final int status) { } 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.USER_NAME, mExternal_wallet.mUser_name); - intent.putExtra(BraveRewardsExternalWallet.VERIFY_URL, mExternal_wallet.mVerify_url); - intent.putExtra(BraveRewardsExternalWallet.WITHDRAW_URL, mExternal_wallet.mWithdraw_url); + intent.putExtra(BraveRewardsExternalWallet.ACCOUNT_URL, mExternalWallet.getAccountUrl()); + intent.putExtra(BraveRewardsExternalWallet.ADD_URL, mExternalWallet.getAddUrl()); + intent.putExtra(BraveRewardsExternalWallet.ADDRESS, mExternalWallet.getAddress()); + intent.putExtra(BraveRewardsExternalWallet.STATUS, mExternalWallet.getStatus()); + intent.putExtra(BraveRewardsExternalWallet.TOKEN, mExternalWallet.getToken()); + intent.putExtra(BraveRewardsExternalWallet.USER_NAME, mExternalWallet.getUserName()); + intent.putExtra(BraveRewardsExternalWallet.VERIFY_URL, mExternalWallet.getVerifyUrl()); + intent.putExtra(BraveRewardsExternalWallet.WITHDRAW_URL, mExternalWallet.getWithdrawUrl()); return intent; } @@ -1888,11 +1887,11 @@ public void OnGetExternalWallet(int error_code, String external_wallet) { int walletStatus = BraveRewardsExternalWallet.NOT_CONNECTED; if(!TextUtils.isEmpty(external_wallet)) { try { - mExternal_wallet = new BraveRewardsExternalWallet(external_wallet); - walletStatus = mExternal_wallet.mStatus; + mExternalWallet = new BraveRewardsExternalWallet(external_wallet); + walletStatus = mExternalWallet.getStatus(); } catch (JSONException e) { Log.e (TAG, "Error parsing external wallet status"); - mExternal_wallet = null; + mExternalWallet = null; } } SetVerifyWalletControl(walletStatus); @@ -2003,4 +2002,76 @@ public void OnRefreshPublisher(int status, String publisherKey) { UpdatePublisherStatus(status); } }; + + public void showUpholdLoginPopupWindow(final View view) { + PopupWindow loginPopupWindow = new PopupWindow(mActivity); + + LayoutInflater inflater = + (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View loginPopupView = inflater.inflate(R.layout.uphold_login_popup_window, null); + + TextView loginActionButton = loginPopupView.findViewById(R.id.login_action_button); + + String verifiedAccountUpholdText = + String.format(mActivity.getResources().getString(R.string.verified_account_uphold), + mActivity.getResources().getString(R.string.continue_to_login)); + int countinueToLoginIndex = verifiedAccountUpholdText.indexOf( + mActivity.getResources().getString(R.string.continue_to_login)); + Spanned verifiedAccountUpholdTextSpanned = + BraveRewardsHelper.spannedFromHtmlString(verifiedAccountUpholdText); + SpannableString verifiedAccountUpholdTextSS = + new SpannableString(verifiedAccountUpholdTextSpanned.toString()); + + ClickableSpan verifiedAccountUpholdClickableSpan = new ClickableSpan() { + @Override + public void onClick(@NonNull View textView) { + dismiss(); + loginPopupWindow.dismiss(); + mBraveActivity.openNewOrSelectExistingTab(mExternalWallet.getLoginUrl()); + } + @Override + public void updateDrawState(@NonNull TextPaint ds) { + super.updateDrawState(ds); + ds.setUnderlineText(false); + } + }; + + verifiedAccountUpholdTextSS.setSpan(verifiedAccountUpholdClickableSpan, + countinueToLoginIndex, + countinueToLoginIndex + + mActivity.getResources().getString(R.string.continue_to_login).length(), + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + verifiedAccountUpholdTextSS.setSpan( + new ForegroundColorSpan( + mActivity.getResources().getColor(R.color.brave_rewards_modal_theme_color)), + countinueToLoginIndex, + countinueToLoginIndex + + mActivity.getResources().getString(R.string.continue_to_login).length(), + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + loginActionButton.setMovementMethod(LinkMovementMethod.getInstance()); + loginActionButton.setText(verifiedAccountUpholdTextSS); + + loginPopupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); + loginPopupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); + loginPopupWindow.setBackgroundDrawable( + new ColorDrawable(android.graphics.Color.TRANSPARENT)); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + loginPopupWindow.setElevation(20); + } + + loginPopupWindow.setTouchable(true); + loginPopupWindow.setFocusable(true); + loginPopupWindow.setOutsideTouchable(true); + loginPopupWindow.setContentView(loginPopupView); + + view.post(new Runnable() { + public void run() { + if (SysUtils.isLowEndDevice()) { + loginPopupWindow.setAnimationStyle(0); + } + loginPopupWindow.showAsDropDown(view, 0, 0); + } + }); + } } diff --git a/android/java/org/chromium/chrome/browser/BraveUphold.java b/android/java/org/chromium/chrome/browser/BraveUphold.java index 418fa70ea4f1..d601c670e671 100644 --- a/android/java/org/chromium/chrome/browser/BraveUphold.java +++ b/android/java/org/chromium/chrome/browser/BraveUphold.java @@ -34,6 +34,9 @@ public class BraveUphold implements BraveRewardsObserver { public static final String UPHOLD_SUPPORT_URL = "http://uphold.com/en/brave/support"; public static final String UPHOLD_ORIGIN_URL = "http://uphold.com"; + // Wallet types + public static final String UPHOLD = "uphold"; + private static int UNKNOWN_ERROR_CODE = -1; private ExternalNavigationParams mExternalNavigationParams; diff --git a/android/java/res/drawable/rounded_white_bg.xml b/android/java/res/drawable/rounded_white_bg.xml new file mode 100644 index 000000000000..38afe6f85d62 --- /dev/null +++ b/android/java/res/drawable/rounded_white_bg.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/java/res/layout/uphold_login_popup_window.xml b/android/java/res/layout/uphold_login_popup_window.xml new file mode 100644 index 000000000000..5c1103bfee24 --- /dev/null +++ b/android/java/res/layout/uphold_login_popup_window.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/browser/brave_rewards/android/brave_rewards_native_worker.cc b/browser/brave_rewards/android/brave_rewards_native_worker.cc index 0effc6fcd1f9..0ccd64b36268 100644 --- a/browser/brave_rewards/android/brave_rewards_native_worker.cc +++ b/browser/brave_rewards/android/brave_rewards_native_worker.cc @@ -642,6 +642,7 @@ void BraveRewardsNativeWorker::OnGetExternalWallet( dict.SetIntKey("status", static_cast(wallet->status)); dict.SetStringKey("verify_url", wallet->verify_url); dict.SetStringKey("add_url", wallet->add_url); + dict.SetStringKey("type", wallet->type); dict.SetStringKey("withdraw_url", wallet->withdraw_url); dict.SetStringKey("user_name", wallet->user_name); dict.SetStringKey("account_url", wallet->account_url); diff --git a/browser/ui/android/strings/android_brave_strings.grd b/browser/ui/android/strings/android_brave_strings.grd index c6a1c52dbc59..d62cbf3b58db 100644 --- a/browser/ui/android/strings/android_brave_strings.grd +++ b/browser/ui/android/strings/android_brave_strings.grd @@ -1071,9 +1071,6 @@ until they verify, or until 90 days have passed. Advanced controls - - A minimum balance of 25 BAT is required to verify. - Show top sites in autocomplete @@ -1670,6 +1667,21 @@ until they verify, or until 90 days have passed. Enable Tab Groups + + Verifying wallet allows you to manage your funds easily, adding & withdrawing + + + You don't have enough BAT. + + + You need to have minimum 15 BAT to create a verified Uphold wallet. Please try again later. + + + If you already have a verified Uphold account, %1$s. + + + continue to login +