diff --git a/android/brave_java_resources.gni b/android/brave_java_resources.gni index ea9c56bd0c8d..8828c3b9f856 100644 --- a/android/brave_java_resources.gni +++ b/android/brave_java_resources.gni @@ -152,6 +152,7 @@ brave_java_resources = [ "java/res/drawable-nodpi/fee_icon.png", "java/res/drawable-nodpi/ic_quick_action_search_and_bookmark_widget_preview.png", "java/res/drawable-nodpi/loader0_orange.png", + "java/res/drawable-sw600dp/bottomsheet_rewards_tipping_success_background.xml", "java/res/drawable-xhdpi/brave_ads_launch_graphic.png", "java/res/drawable-xhdpi/brave_sync_btn_laptop.png", "java/res/drawable-xhdpi/btn_bat.png", @@ -348,6 +349,7 @@ brave_java_resources = [ "java/res/drawable/blue_rounded_notification_bg.xml", "java/res/drawable/bookmark_menu_bg.xml", "java/res/drawable/bottomsheet_rewards_background.xml", + "java/res/drawable/bottomsheet_rewards_background_tablet.xml", "java/res/drawable/bottomsheet_rewards_tipping_success_background.xml", "java/res/drawable/bottomsheet_top_bar.xml", "java/res/drawable/brave_badge_rewards_background_large.xml", @@ -710,6 +712,7 @@ brave_java_resources = [ "java/res/drawable/tab_gradient_separator.xml", "java/res/drawable/tab_selector.xml", "java/res/drawable/tipping_background_success.xml", + "java/res/drawable/tipping_banner_tablet_ui_background.xml", "java/res/drawable/tipping_banner_view_background.xml", "java/res/drawable/tipping_default_background.xml", "java/res/drawable/tipping_error_alert_message_background.xml", @@ -723,6 +726,7 @@ brave_java_resources = [ "java/res/drawable/transparent_shadow_background.xml", "java/res/drawable/unverified_48_rounded_bg.xml", "java/res/drawable/upload_icon.xml", + "java/res/drawable/verification_tick_mark.xml", "java/res/drawable/wallet_chip_outline.xml", "java/res/drawable/wallet_radio_button_normal.xml", "java/res/drawable/wallet_radio_button_selected.xml", @@ -738,7 +742,11 @@ brave_java_resources = [ "java/res/layout-land/brave_shields_stats_row.xml", "java/res/layout-land/verify_wallet_activity.xml", "java/res/layout-sw600dp-land/brave_shields_stats_row.xml", + "java/res/layout-sw600dp/brave_rewards_tippingpanel_fragment.xml", + "java/res/layout-sw600dp/brave_rewards_tippingpanel_fragment_base.xml", "java/res/layout-sw600dp/brave_shields_stats_row.xml", + "java/res/layout-sw600dp/rewards_tipping_banner_fragment.xml", + "java/res/layout-sw600dp/rewards_tipping_success_contribution_fragment.xml", "java/res/layout/activity_account_detail.xml", "java/res/layout/activity_account_details_with_qr.xml", "java/res/layout/activity_account_private_key.xml", @@ -758,6 +766,7 @@ brave_java_resources = [ "java/res/layout/activity_playlist_host.xml", "java/res/layout/activity_split_tunnel.xml", "java/res/layout/activity_tipping_banner_mobile.xml", + "java/res/layout/activity_tipping_banner_tablet.xml", "java/res/layout/activity_welcome_onboarding.xml", "java/res/layout/application_item_layout.xml", "java/res/layout/approve_tx_bottom_sheet.xml", @@ -800,7 +809,9 @@ brave_java_resources = [ "java/res/layout/brave_rewards_panel_tip_layout.xml", "java/res/layout/brave_rewards_panel_unverified_layout.xml", "java/res/layout/brave_rewards_reset_tab_content.xml", + "java/res/layout/brave_rewards_tippingpanel_bottomsheet.xml", "java/res/layout/brave_rewards_tippingpanel_fragment.xml", + "java/res/layout/brave_rewards_tippingpanel_fragment_base.xml", "java/res/layout/brave_set_default_browser_dialog.xml", "java/res/layout/brave_shields_main_layout.xml", "java/res/layout/brave_shields_option_layout.xml", @@ -934,6 +945,7 @@ brave_java_resources = [ "java/res/layout/rewards_onboarding_location_choose.xml", "java/res/layout/rewards_panel_vbat_expire_notice.xml", "java/res/layout/rewards_response_modal.xml", + "java/res/layout/rewards_tipping_banner_fragment.xml", "java/res/layout/rewards_tipping_success_contribution_fragment.xml", "java/res/layout/rewards_you_are_not_earning_dialog.xml", "java/res/layout/search_preference.xml", diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index 2fae959096cc..b638aeb492e8 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -332,9 +332,12 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/rewards/onboarding/CountrySelectionSpinnerAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/rewards/onboarding/RewardsOnboarding.java", "../../brave/android/java/org/chromium/chrome/browser/rewards/tipping/MonthlyContributionToolTip.java", + "../../brave/android/java/org/chromium/chrome/browser/rewards/tipping/PopupWindowTippingTabletUI.java", "../../brave/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingBannerActivity.java", + "../../brave/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingBannerFragment.java", + "../../brave/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingPanelBottomsheet.java", "../../brave/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingPanelFragment.java", - "../../brave/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingSuccessContributionFragment.java", + "../../brave/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingSuccessContribution.java", "../../brave/android/java/org/chromium/chrome/browser/rewards/tipping/TippingVerifiedCreatorToolTip.java", "../../brave/android/java/org/chromium/chrome/browser/safe_browsing/settings/BraveStandardProtectionSettingsFragment.java", "../../brave/android/java/org/chromium/chrome/browser/safe_browsing/settings/NoGooglePlayServicesDialog.java", diff --git a/android/java/org/chromium/chrome/browser/rewards/BraveRewardsPanel.java b/android/java/org/chromium/chrome/browser/rewards/BraveRewardsPanel.java index cf0c542a05d7..2ad3cb317ecf 100644 --- a/android/java/org/chromium/chrome/browser/rewards/BraveRewardsPanel.java +++ b/android/java/org/chromium/chrome/browser/rewards/BraveRewardsPanel.java @@ -75,6 +75,7 @@ import org.chromium.chrome.browser.preferences.BravePref; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.rewards.onboarding.RewardsOnboarding; +import org.chromium.chrome.browser.rewards.tipping.PopupWindowTippingTabletUI; import org.chromium.chrome.browser.rewards.tipping.RewardsTippingBannerActivity; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.util.BraveConstants; @@ -162,7 +163,7 @@ public enum NotificationClickAction { TURN_ON_ADS; } - private boolean shouldShowOnboardingForConnectAccount; + private boolean mShouldShowOnboardingForConnectAccount; private final View mAnchorView; private final PopupWindow mPopupWindow; @@ -203,7 +204,7 @@ public enum NotificationClickAction { private View mNotificationLayout; private View mNotificationPermissionLayout; private boolean mClaimInProcess; - private boolean notificationShown; + private boolean mNotificationShown; private View mBraveRewardsOnboardingModalView; private View mRewardsResponseModal; @@ -219,6 +220,8 @@ public enum NotificationClickAction { private View mBalanceDataViewGroups; private View mEstimatedToolTip; private View mVbatUserdrainToolTip; + private PopupWindowTippingTabletUI mPopupWindowTippingTabletUI; + private boolean mIsTablet; public BraveRewardsPanel(View anchorView) { mCurrentNotificationId = ""; @@ -336,9 +339,9 @@ private void setUpViews() { mPopupView = (ViewGroup) inflater.inflate(R.layout.brave_rewards_panel_layout, null); int deviceWidth = ConfigurationUtils.getDisplayMetrics(mActivity).get("width"); - boolean isTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(mActivity); + mIsTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(mActivity); - mPopupWindow.setWidth((int) (isTablet ? (deviceWidth * 0.6) : (deviceWidth * 0.95))); + mPopupWindow.setWidth((int) (mIsTablet ? (deviceWidth * 0.6) : (deviceWidth * 0.95))); mBravePanelShadow = mPopupView.findViewById(R.id.panel_shadow); mBraveRewardsOnboardingView = @@ -413,10 +416,17 @@ public void onClick(View v) { TextView btnSendTip = mPopupView.findViewById(R.id.btn_send_tip); btnSendTip.setOnClickListener(view -> { - Intent intent = new Intent( - ContextUtils.getApplicationContext(), RewardsTippingBannerActivity.class); - intent.putExtra(RewardsTippingBannerActivity.TAB_ID_EXTRA, mCurrentTabId); - mActivity.startActivityForResult(intent, BraveConstants.SITE_BANNER_REQUEST_CODE); + if (mIsTablet) { + mPopupWindowTippingTabletUI = + PopupWindowTippingTabletUI.newInstance(mAnchorView, mCurrentTabId); + mPopupWindowTippingTabletUI.show(mBraveActivity.getSupportFragmentManager(), + "PopupWindowTippingTabletUITag"); + } else { + Intent intent = new Intent( + ContextUtils.getApplicationContext(), RewardsTippingBannerActivity.class); + intent.putExtra(RewardsTippingBannerActivity.TAB_ID_EXTRA, mCurrentTabId); + mActivity.startActivityForResult(intent, BraveConstants.SITE_BANNER_REQUEST_CODE); + } }); mBtnTip = mPopupView.findViewById(R.id.tip_btn); @@ -839,7 +849,7 @@ private void showNotification(String id, int type, long timestamp, String[] args mRewardsMainLayout.setForeground( new ColorDrawable(ContextCompat.getColor(mActivity, foregroundColor))); enableControls(false, mRewardsMainLayout); - notificationShown = true; + mNotificationShown = true; } setNotificationButtoClickListener(notificationClickAction); @@ -1197,8 +1207,8 @@ public void onBalance(boolean success) { @Override public void OnRewardsParameters() { - if (shouldShowOnboardingForConnectAccount) { - shouldShowOnboardingForConnectAccount = false; + if (mShouldShowOnboardingForConnectAccount) { + mShouldShowOnboardingForConnectAccount = false; showBraveRewardsOnboarding(true); } else if (mExternalWallet != null) { if (mBraveRewardsNativeWorker.getVbatDeadline() > 0) { @@ -1240,8 +1250,7 @@ private void showOnBoarding() { try { BraveActivity activity = BraveActivity.getBraveActivity(); int deviceWidth = ConfigurationUtils.getDisplayMetrics(activity).get("width"); - boolean isTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(activity); - deviceWidth = (int) (isTablet ? (deviceWidth * 0.6) : (deviceWidth * 0.95)); + deviceWidth = (int) (mIsTablet ? (deviceWidth * 0.6) : (deviceWidth * 0.95)); RewardsOnboarding panel = new RewardsOnboarding(mAnchorView, deviceWidth); panel.showLikePopDownMenu(); } catch (BraveActivity.BraveActivityNotFoundException e) { @@ -1373,7 +1382,7 @@ private void clickOnCloseButtonOfNotificationPermission() { View closeButton = mNotificationPermissionLayout.findViewById(R.id.close_text_button); closeButton.setOnClickListener((v) -> { mNotificationPermissionLayout.setVisibility(View.GONE); - if (!notificationShown) { + if (!mNotificationShown) { mNotificationLayout.setVisibility(View.GONE); } }); @@ -1385,7 +1394,7 @@ private void clickOnTurnOnNotificationButton() { turnOnNotification.setOnClickListener((v) -> { mNotificationPermissionLayout.setVisibility(View.GONE); BravePermissionUtils.notificationSettingPage(mAnchorView.getContext()); - if (!notificationShown) { + if (!mNotificationShown) { mNotificationLayout.setVisibility(View.GONE); } }); @@ -2171,6 +2180,11 @@ public void run() { public void dismiss() { mPopupWindow.dismiss(); + if (mPopupWindowTippingTabletUI != null && mPopupWindowTippingTabletUI.getDialog() != null + && mPopupWindowTippingTabletUI.getDialog().isShowing() + && !mPopupWindowTippingTabletUI.isRemoving()) { + mPopupWindowTippingTabletUI.getDialog().dismiss(); + } } public boolean isShowing() { diff --git a/android/java/org/chromium/chrome/browser/rewards/tipping/PopupWindowTippingTabletUI.java b/android/java/org/chromium/chrome/browser/rewards/tipping/PopupWindowTippingTabletUI.java new file mode 100644 index 000000000000..b76caa53efeb --- /dev/null +++ b/android/java/org/chromium/chrome/browser/rewards/tipping/PopupWindowTippingTabletUI.java @@ -0,0 +1,123 @@ +/** + * Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. + */ + +package org.chromium.chrome.browser.rewards.tipping; + +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.text.SpannableString; +import android.text.method.LinkMovementMethod; +import android.util.DisplayMetrics; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.fragment.app.DialogFragment; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.BraveRewardsHelper; +import org.chromium.chrome.browser.util.ConfigurationUtils; + +public class PopupWindowTippingTabletUI extends DialogFragment { + private static final String TAG = "TippingBanner"; + private static final String ANCHOR_Y_POSITION = "y_position"; + + private int mCurrentTabId = -1; + + public static PopupWindowTippingTabletUI newInstance(View anchorView, int currentTabId) { + int[] location = new int[2]; + anchorView.getLocationOnScreen(location); + int popup_y_position = location[1] + anchorView.getHeight() - 40; + PopupWindowTippingTabletUI fragment = new PopupWindowTippingTabletUI(); + Bundle args = new Bundle(); + args.putInt(RewardsTippingBannerActivity.TAB_ID_EXTRA, currentTabId); + args.putInt(ANCHOR_Y_POSITION, popup_y_position); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onResume() { + super.onResume(); + setDialogParams(); + } + + private void setDialogParams() { + DisplayMetrics displayMetrics = new DisplayMetrics(); + getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + int mDeviceWidth = displayMetrics.widthPixels; + Window window = getDialog().getWindow(); + + WindowManager.LayoutParams params = window.getAttributes(); + boolean isLandscape = ConfigurationUtils.isLandscape(getActivity()); + double widthRatio = isLandscape ? 0.8 : 0.96; + params.width = (int) (widthRatio * mDeviceWidth); + params.height = LinearLayout.LayoutParams.WRAP_CONTENT; + window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + if (getArguments() != null) { + params.y = getArguments().getInt(ANCHOR_Y_POSITION); + } + + params.gravity = Gravity.TOP; + params.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND; + window.setAttributes(params); + } + + @Override + public View onCreateView( + LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.activity_tipping_banner_tablet, container, false); + + if (getArguments() != null) { + mCurrentTabId = getArguments().getInt(RewardsTippingBannerActivity.TAB_ID_EXTRA); + } + replace(); + updateTermsOfServicePlaceHolder(view); + return view; + } + + private void updateTermsOfServicePlaceHolder(View view) { + Resources res = getResources(); + TextView proceedTextView = view.findViewById(R.id.proceed_terms_of_service); + proceedTextView.setMovementMethod(LinkMovementMethod.getInstance()); + String termsOfServiceText = String.format(res.getString(R.string.brave_rewards_tos_text), + res.getString(R.string.terms_of_service), res.getString(R.string.privacy_policy)); + + SpannableString spannableString = BraveRewardsHelper.tosSpannableString( + termsOfServiceText, R.color.terms_of_service_text_color); + proceedTextView.setText(spannableString); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + setDialogParams(); + } + + public void replace() { + RewardsTippingBannerFragment tippingBannerFragment = + RewardsTippingBannerFragment.newInstance(mCurrentTabId); + getChildFragmentManager() + .beginTransaction() + .replace(R.id.tippingBannerFragment, tippingBannerFragment) + .commit(); + RewardsTippingPanelFragment tippingPanelFragment = + RewardsTippingPanelFragment.newInstance(mCurrentTabId); + getChildFragmentManager() + .beginTransaction() + .replace(R.id.tippingPanelFragment2, tippingPanelFragment) + .commit(); + } +} diff --git a/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingBannerActivity.java b/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingBannerActivity.java index 518966b3503f..814240b5457f 100644 --- a/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingBannerActivity.java +++ b/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingBannerActivity.java @@ -7,32 +7,16 @@ package org.chromium.chrome.browser.rewards.tipping; -import android.app.Activity; -import android.content.Intent; -import android.text.TextUtils; -import android.text.method.ScrollingMovementMethod; import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.request.RequestOptions; - -import org.json.JSONException; import org.chromium.base.IntentUtils; -import org.chromium.base.Log; import org.chromium.chrome.R; import org.chromium.chrome.browser.BraveRewardsHelper; import org.chromium.chrome.browser.BraveRewardsNativeWorker; import org.chromium.chrome.browser.BraveRewardsObserver; -import org.chromium.chrome.browser.app.BraveActivity; import org.chromium.chrome.browser.init.AsyncInitializationActivity; import org.chromium.chrome.browser.rewards.BraveRewardsBannerInfo; -import org.chromium.chrome.browser.util.TabUtils; -import java.util.HashMap; -import java.util.Map; public class RewardsTippingBannerActivity extends AsyncInitializationActivity implements BraveRewardsObserver { @@ -40,250 +24,31 @@ public class RewardsTippingBannerActivity public static final String TIP_MONTHLY_EXTRA = "tipMonthly"; public static final String TIP_AMOUNT_EXTRA = "tipAmount"; private BraveRewardsNativeWorker mBraveRewardsNativeWorker; - private final int PUBLISHER_ICON_SIDE_LEN = 64; // dp - private static final String TAG = "TippingBanner"; - private int currentTabId_ = -1; + private int mCurrentTabId = -1; private BraveRewardsBannerInfo mBannerInfo; private BraveRewardsHelper mIconFetcher; - private final String TWITTER = "twitter"; - private final String YOUTUBE = "youtube"; - private final String TWITCH = "twitch"; - private final String GITHUB = "github"; - private final String REDDIT = "reddit"; - private final String VIMEO = "vimeo"; - private final String DISCORD = "discord"; - private final String FACEBOOK = "facebook"; - private final String INSTAGRAM = "instagram"; - private static final String IMAGE_URL_PREFIX = "chrome://rewards-image/"; @Override protected void triggerLayoutInflation() { setContentView(R.layout.activity_tipping_banner_mobile); - showCustomUI(); - ((TextView) findViewById(R.id.tipping_details_description)) - .setMovementMethod(new ScrollingMovementMethod()); - currentTabId_ = IntentUtils.safeGetIntExtra(getIntent(), TAB_ID_EXTRA, -1); + mCurrentTabId = IntentUtils.safeGetIntExtra(getIntent(), TAB_ID_EXTRA, -1); + showCustomUI(); onInitialLayoutInflationComplete(); - clickOnVerifiedIcon(); - sendTipButtonClick(); - closeButtonClick(); - } - - private void closeButtonClick() { - ImageView view = findViewById(R.id.close_it); - view.setOnClickListener(v -> { finish(); }); - } - - private void clickOnVerifiedIcon() { - ImageView view = findViewById(R.id.verified_tick_mark); - view.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - TippingVerifiedCreatorToolTip toolTip = - new TippingVerifiedCreatorToolTip(RewardsTippingBannerActivity.this); - toolTip.show(view); - } - }); - } - - private void background() { - if (mBannerInfo == null) return; - String background = mBannerInfo.getBackground(); - if (!TextUtils.isEmpty(background)) { - String prefix = IMAGE_URL_PREFIX; - if (background.contains(prefix)) { - background = background.substring(prefix.length()); - ImageView iv = - (ImageView) findViewById(R.id.top_tipping_banner_ui_background_scenery); - Glide.with(this) - .load(background) - .placeholder(R.drawable.tipping_default_background) - .error(R.drawable.tipping_default_background) - .into(iv); - } - } - } - - private void setDescription() { - if (mBannerInfo == null) return; - String description = mBannerInfo.getDescription(); - if (!TextUtils.isEmpty(description)) { - TextView descriptionTextView = findViewById(R.id.tipping_details_description); - descriptionTextView.setText(description); - } - } - - @Override - public boolean shouldStartGpuProcess() { - return true; - } - - @Override - public void onPublisherBanner(String jsonBannerInfo) { - try { - mBannerInfo = new BraveRewardsBannerInfo(jsonBannerInfo); - setTitle(); - setDescription(); - setLogo(); - background(); - checkForShowSocialLinkIcons(); - setWeb3WalletClick(); - } catch (JSONException e) { - Log.e(TAG, "TippingBanner -> CreatorPanel:onAttach JSONException error " + e); - } - } - - private void setWeb3WalletClick() { - if (mBannerInfo == null) return; - String web3Url = mBannerInfo.getWeb3Url(); - if (!TextUtils.isEmpty(web3Url)) { - View web3Button = findViewById(R.id.use_web3_wallet_button); - web3Button.setVisibility(View.VISIBLE); - web3Button.setOnClickListener(v -> { - TabUtils.openUrlInNewTab(false, web3Url); - setResult(Activity.RESULT_OK); - finish(); - }); - } - } - - private void checkForShowSocialLinkIcons() { - if (mBannerInfo == null) return; - HashMap links = mBannerInfo.getLinks(); - if (links != null) { - for (Map.Entry element : links.entrySet()) { - String name = element.getKey(); - String url = element.getValue(); - showSocialLinkIcon(name, url); - } - } - } - - private void showSocialLinkIcon(String name, String url) { - switch (name) { - case TWITTER: - ImageView twitterIcon = findViewById(R.id.link_twitter); - showAndSetListener(twitterIcon, url); - break; - - case YOUTUBE: - ImageView youtubeIcon = findViewById(R.id.link_youtube); - showAndSetListener(youtubeIcon, url); - break; - - case TWITCH: - ImageView twitchIcon = findViewById(R.id.link_twitch); - showAndSetListener(twitchIcon, url); - break; - - case GITHUB: - ImageView githubIcon = findViewById(R.id.link_github); - showAndSetListener(githubIcon, url); - break; - - case REDDIT: - ImageView redditIcon = findViewById(R.id.link_reddit); - showAndSetListener(redditIcon, url); - break; - - case VIMEO: - ImageView vimeoIcon = findViewById(R.id.link_vimeo); - showAndSetListener(vimeoIcon, url); - break; - - case DISCORD: - ImageView discordIcon = findViewById(R.id.link_discord); - showAndSetListener(discordIcon, url); - break; - - case FACEBOOK: - ImageView facebookIcon = findViewById(R.id.link_facebook); - showAndSetListener(facebookIcon, url); - break; - - case INSTAGRAM: - ImageView instagramIcon = findViewById(R.id.link_instagram); - showAndSetListener(instagramIcon, url); - break; - } - } - - private void showAndSetListener(ImageView icon, String url) { - icon.setVisibility(View.VISIBLE); - icon.setTag(url); - icon.setOnClickListener(v -> { - String openUrl = (String) v.getTag(); - openLink(openUrl); - }); - } - - private void openLink(String url) { - Intent intent = new Intent(); - intent.putExtra(BraveActivity.OPEN_URL, url); - setResult(Activity.RESULT_OK, intent); - finish(); - } - - private void setLogo() { - if (mBannerInfo == null) return; - String logo = mBannerInfo.getLogo(); - if (!TextUtils.isEmpty(logo)) { - String prefix = IMAGE_URL_PREFIX; - if (logo.contains(prefix)) { - logo = logo.substring(prefix.length()); - ImageView iv = (ImageView) findViewById(R.id.publisher_favicon); - Glide.with(this).load(logo).apply(RequestOptions.circleCropTransform()).into(iv); - } - } - } - - private void setTitle() { - if (mBannerInfo == null) return; - String title = mBannerInfo.getName(); - if (!TextUtils.isEmpty(title)) { - TextView titleTextView = findViewById(R.id.tipping_publisher_name); - String provider = getProvider(mBannerInfo.getProvider()); - if (!TextUtils.isEmpty(provider)) { - title = String.format( - getResources().getString(R.string.title_on_provider), title, provider); - } - titleTextView.setText(title); - } - } - - private String getProvider(String provider) { - if (TextUtils.isEmpty(provider)) { - return ""; - } - switch (provider) { - case "twitter": - return "Twitter"; - case "youtube": - return "YouTube"; - case "twitch": - return "Twitch"; - case "reddit": - return "Reddit"; - case "vimeo": - return "Vimeo"; - case "github": - return "GitHub"; - default: - return provider; - } } @Override public void finishNativeInitialization() { super.finishNativeInitialization(); - mBraveRewardsNativeWorker = BraveRewardsNativeWorker.getInstance(); - mBraveRewardsNativeWorker.AddObserver(this); - mBraveRewardsNativeWorker.GetPublisherBanner( - mBraveRewardsNativeWorker.GetPublisherId(currentTabId_)); + RewardsTippingBannerFragment tippingBannerFragment = + RewardsTippingBannerFragment.newInstance(mCurrentTabId); + getSupportFragmentManager() + .beginTransaction() + .replace(R.id.tippingBannerFragment, tippingBannerFragment) + .commit(); } private void showCustomUI() { @@ -292,20 +57,8 @@ private void showCustomUI() { View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } - public void sendTipButtonClick() { - View sendTipButton = findViewById(R.id.send_tip_button); - sendTipButton.setOnClickListener((v) -> { - RewardsTippingPanelFragment.showTippingPanelBottomSheet( - this, currentTabId_, mBannerInfo.getWeb3Url()); - }); - } - @Override - public void onDestroy() { - super.onDestroy(); - - if (null != mBraveRewardsNativeWorker) { - mBraveRewardsNativeWorker.RemoveObserver(this); - } + public boolean shouldStartGpuProcess() { + return true; } } diff --git a/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingBannerFragment.java b/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingBannerFragment.java new file mode 100644 index 000000000000..250bf215367c --- /dev/null +++ b/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingBannerFragment.java @@ -0,0 +1,337 @@ +/** + * Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. + */ + +package org.chromium.chrome.browser.rewards.tipping; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.os.Bundle; +import android.text.TextUtils; +import android.text.method.ScrollingMovementMethod; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; + +import com.bumptech.glide.Glide; + +import org.json.JSONException; + +import org.chromium.base.Log; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.BraveRewardsHelper; +import org.chromium.chrome.browser.BraveRewardsNativeWorker; +import org.chromium.chrome.browser.BraveRewardsObserver; +import org.chromium.chrome.browser.app.BraveActivity; +import org.chromium.chrome.browser.app.helpers.ImageLoader; +import org.chromium.chrome.browser.rewards.BraveRewardsBannerInfo; +import org.chromium.chrome.browser.util.TabUtils; +import org.chromium.ui.base.DeviceFormFactor; +import org.chromium.ui.base.ViewUtils; + +import java.util.HashMap; +import java.util.Map; + +public class RewardsTippingBannerFragment extends Fragment implements BraveRewardsObserver { + public static final String TAB_ID_EXTRA = "currentTabId"; + public static final String TIP_MONTHLY_EXTRA = "tipMonthly"; + public static final String TIP_AMOUNT_EXTRA = "tipAmount"; + private BraveRewardsNativeWorker mBraveRewardsNativeWorker; + private static final String TAG = "TippingBanner"; + private int mCurrentTabId = -1; + private BraveRewardsBannerInfo mBannerInfo; + + private BraveRewardsHelper mIconFetcher; + + private static final String TWITTER = "twitter"; + private static final String YOUTUBE = "youtube"; + private static final String TWITCH = "twitch"; + private static final String GITHUB = "github"; + private static final String REDDIT = "reddit"; + private static final String VIMEO = "vimeo"; + private static final String DISCORD = "discord"; + private static final String FACEBOOK = "facebook"; + private static final String INSTAGRAM = "instagram"; + private static final int LOGO_RADIUS = 60; + + private static final String IMAGE_URL_PREFIX = "chrome://rewards-image/"; + private AppCompatActivity mActivity; + + public static RewardsTippingBannerFragment newInstance(int currentTabId) { + RewardsTippingBannerFragment fragment = new RewardsTippingBannerFragment(); + Bundle args = new Bundle(); + args.putInt(TAB_ID_EXTRA, currentTabId); + fragment.setArguments(args); + return fragment; + } + + private View mContentView; + + @Override + public View onCreateView( + LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.rewards_tipping_banner_fragment, container, false); + mCurrentTabId = getArguments().getInt(TAB_ID_EXTRA); + mBraveRewardsNativeWorker = BraveRewardsNativeWorker.getInstance(); + mBraveRewardsNativeWorker.AddObserver(this); + mBraveRewardsNativeWorker.GetPublisherBanner( + mBraveRewardsNativeWorker.GetPublisherId(mCurrentTabId)); + mContentView = view; + return view; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mActivity = (AppCompatActivity) getActivity(); + ((TextView) view.findViewById(R.id.tipping_details_description)) + .setMovementMethod(new ScrollingMovementMethod()); + + clickOnVerifiedIcon(); + sendTipButtonClick(); + closeButtonClick(); + } + + private void closeButtonClick() { + ImageView view = mContentView.findViewById(R.id.close_it); + view.setOnClickListener(v -> { mActivity.finish(); }); + } + + private void clickOnVerifiedIcon() { + ImageView view = mContentView.findViewById(R.id.verified_tick_mark); + view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + TippingVerifiedCreatorToolTip toolTip = + new TippingVerifiedCreatorToolTip(mActivity); + toolTip.show(view); + } + }); + } + + private void background() { + if (mBannerInfo == null) return; + String background = mBannerInfo.getBackground(); + if (!TextUtils.isEmpty(background)) { + String prefix = IMAGE_URL_PREFIX; + if (background.contains(prefix)) { + background = background.substring(prefix.length()); + ImageView iv = (ImageView) mContentView.findViewById( + R.id.top_tipping_banner_ui_background_scenery); + ImageLoader.downloadImage(background, Glide.with(mActivity), false, 1, iv, null); + } + } + } + + @SuppressLint("SetTextI18n") + private void setDescription() { + if (mBannerInfo == null) return; + String description = mBannerInfo.getDescription(); + if (!TextUtils.isEmpty(description)) { + TextView descriptionTextView = + mContentView.findViewById(R.id.tipping_details_description); + descriptionTextView.setText( + description + "\n\n"); // Adding two new line to show shadow if more text exist + } + } + + @Override + public void onPublisherBanner(String jsonBannerInfo) { + try { + mBannerInfo = new BraveRewardsBannerInfo(jsonBannerInfo); + setTitle(); + setDescription(); + setLogo(); + background(); + checkForShowSocialLinkIcons(); + setWeb3WalletClick(); + } catch (JSONException e) { + Log.e(TAG, "TippingBanner -> CreatorPanel:onAttach JSONException error " + e); + } + } + + private void setWeb3WalletClick() { + if (mBannerInfo == null) return; + String web3Url = mBannerInfo.getWeb3Url(); + if (!TextUtils.isEmpty(web3Url)) { + View web3Button = mContentView.findViewById(R.id.use_web3_wallet_button); + web3Button.setVisibility(View.VISIBLE); + web3Button.setOnClickListener(v -> { + TabUtils.openUrlInNewTab(false, web3Url); + dismissRewardsPanel(); + }); + } + } + + private void checkForShowSocialLinkIcons() { + if (mBannerInfo == null) return; + HashMap links = mBannerInfo.getLinks(); + if (links != null) { + for (Map.Entry element : links.entrySet()) { + String name = element.getKey(); + String url = element.getValue(); + showSocialLinkIcon(name, url); + } + } + } + + private void showSocialLinkIcon(String name, String url) { + switch (name) { + case TWITTER: + ImageView twitterIcon = mContentView.findViewById(R.id.link_twitter); + showAndSetListener(twitterIcon, url); + break; + + case YOUTUBE: + ImageView youtubeIcon = mContentView.findViewById(R.id.link_youtube); + showAndSetListener(youtubeIcon, url); + break; + + case TWITCH: + ImageView twitchIcon = mContentView.findViewById(R.id.link_twitch); + showAndSetListener(twitchIcon, url); + break; + + case GITHUB: + ImageView githubIcon = mContentView.findViewById(R.id.link_github); + showAndSetListener(githubIcon, url); + break; + + case REDDIT: + ImageView redditIcon = mContentView.findViewById(R.id.link_reddit); + showAndSetListener(redditIcon, url); + break; + + case VIMEO: + ImageView vimeoIcon = mContentView.findViewById(R.id.link_vimeo); + showAndSetListener(vimeoIcon, url); + break; + + case DISCORD: + ImageView discordIcon = mContentView.findViewById(R.id.link_discord); + showAndSetListener(discordIcon, url); + break; + + case FACEBOOK: + ImageView facebookIcon = mContentView.findViewById(R.id.link_facebook); + showAndSetListener(facebookIcon, url); + break; + + case INSTAGRAM: + ImageView instagramIcon = mContentView.findViewById(R.id.link_instagram); + showAndSetListener(instagramIcon, url); + break; + } + } + + private void showAndSetListener(ImageView icon, String url) { + icon.setVisibility(View.VISIBLE); + icon.setTag(url); + icon.setOnClickListener(v -> { + String openUrl = (String) v.getTag(); + openLink(openUrl); + }); + } + + private void openLink(String url) { + TabUtils.openUrlInNewTab(false, url); + dismissRewardsPanel(); + } + + private void setLogo() { + if (mBannerInfo == null) return; + String logo = mBannerInfo.getLogo(); + if (!TextUtils.isEmpty(logo)) { + String prefix = IMAGE_URL_PREFIX; + if (logo.contains(prefix)) { + logo = logo.substring(prefix.length()); + ImageView iv = (ImageView) mContentView.findViewById(R.id.publisher_favicon); + int radius = ViewUtils.dpToPx(mActivity, LOGO_RADIUS); + ImageLoader.downloadImage(logo, Glide.with(mActivity), false, radius, iv, null); + } + } + } + + private void setTitle() { + if (mBannerInfo == null) return; + TextView titleTextView = mContentView.findViewById(R.id.tipping_publisher_name); + String title = mBannerInfo.getName(); + if (!TextUtils.isEmpty(title)) { + String provider = getProvider(mBannerInfo.getProvider()); + if (!TextUtils.isEmpty(provider)) { + title = String.format( + getResources().getString(R.string.title_on_provider), title, provider); + } + titleTextView.setText(title); + } else { + title = mBannerInfo.getTitle(); + if (!TextUtils.isEmpty(title)) { + titleTextView.setText(title); + } + } + } + + private String getProvider(String provider) { + if (TextUtils.isEmpty(provider)) { + return ""; + } + switch (provider) { + case "twitter": + return "Twitter"; + case "youtube": + return "YouTube"; + case "twitch": + return "Twitch"; + case "reddit": + return "Reddit"; + case "vimeo": + return "Vimeo"; + case "github": + return "GitHub"; + default: + return provider; + } + } + + public void sendTipButtonClick() { + View sendTipButton = mContentView.findViewById(R.id.send_tip_button); + sendTipButton.setOnClickListener((v) -> { + RewardsTippingPanelBottomsheet.showTippingPanelBottomSheet( + (AppCompatActivity) mActivity, mCurrentTabId, mBannerInfo.getWeb3Url()); + }); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (null != mBraveRewardsNativeWorker) { + mBraveRewardsNativeWorker.RemoveObserver(this); + } + } + + private void dismissRewardsPanel() { + boolean isTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(getActivity()); + + if (isTablet) { + try { + BraveActivity braveActivity = BraveActivity.getBraveActivity(); + braveActivity.dismissRewardsPanel(); + } catch (BraveActivity.BraveActivityNotFoundException e) { + Log.e(TAG, "setShareYourSupportClickListener " + e); + } + } else { + mActivity.setResult(Activity.RESULT_OK); + mActivity.finish(); + } + } +} diff --git a/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingPanelBottomsheet.java b/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingPanelBottomsheet.java new file mode 100644 index 000000000000..aae101c8a91d --- /dev/null +++ b/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingPanelBottomsheet.java @@ -0,0 +1,107 @@ +/** + * Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. + */ + +package org.chromium.chrome.browser.rewards.tipping; +import android.app.Dialog; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; + +import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + +import org.chromium.base.Log; +import org.chromium.chrome.R; + +public class RewardsTippingPanelBottomsheet extends BottomSheetDialogFragment { + public static final String TAG_FRAGMENT = "tipping_bottomsheet_tag"; + + private int mCurrentTabId = -1; + private String mWeb3Url; + private static final String WEB3_URL = "web3_url"; + private static final String TAG = "TippingBottomsheet"; + + public static RewardsTippingPanelBottomsheet newInstance(int tabId, String web3Url) { + RewardsTippingPanelBottomsheet fragment = new RewardsTippingPanelBottomsheet(); + Bundle args = new Bundle(); + args.putInt(RewardsTippingBannerActivity.TAB_ID_EXTRA, tabId); + args.putString(WEB3_URL, web3Url); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setStyle(STYLE_NORMAL, R.style.AppBottomSheetDialogTheme); + } + + @Override + public void show(@NonNull FragmentManager manager, @Nullable String tag) { + try { + RewardsTippingPanelBottomsheet fragment = + (RewardsTippingPanelBottomsheet) manager.findFragmentByTag( + RewardsTippingPanelBottomsheet.TAG_FRAGMENT); + FragmentTransaction transaction = manager.beginTransaction(); + if (fragment != null) { + transaction.remove(fragment); + } + transaction.add(this, tag); + transaction.commitAllowingStateLoss(); + } catch (IllegalStateException e) { + Log.e(TAG, e.getMessage()); + } + } + + public void replace() { + if (getArguments() != null) { + mCurrentTabId = getArguments().getInt(RewardsTippingBannerActivity.TAB_ID_EXTRA); + } + RewardsTippingPanelFragment tippingPanelFragment = + RewardsTippingPanelFragment.newInstance(mCurrentTabId); + getChildFragmentManager() + .beginTransaction() + .replace(R.id.tippingPanelFragment, tippingPanelFragment) + .commit(); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstance) { + BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstance); + final View view = LayoutInflater.from(getContext()) + .inflate(R.layout.brave_rewards_tippingpanel_bottomsheet, null); + dialog.setContentView(view); + replace(); + setupFullHeight(dialog); + + return dialog; + } + + private void setupFullHeight(BottomSheetDialog bottomSheetDialog) { + FrameLayout bottomSheet = + (FrameLayout) bottomSheetDialog.findViewById(R.id.design_bottom_sheet); + BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet); + behavior.setState(BottomSheetBehavior.STATE_EXPANDED); + } + + public static void showTippingPanelBottomSheet( + AppCompatActivity activity, int tabId, String web3Url) { + if (activity != null) { + RewardsTippingPanelBottomsheet dialog = + RewardsTippingPanelBottomsheet.newInstance(tabId, web3Url); + dialog.show(activity.getSupportFragmentManager(), TAG_FRAGMENT); + } + } +} diff --git a/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingPanelFragment.java b/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingPanelFragment.java index 4ae3b19b4e55..be757b764e93 100644 --- a/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingPanelFragment.java +++ b/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingPanelFragment.java @@ -8,7 +8,6 @@ package org.chromium.chrome.browser.rewards.tipping; import android.annotation.SuppressLint; import android.app.Activity; -import android.app.Dialog; import android.content.res.Resources; import android.os.Bundle; import android.text.Editable; @@ -20,6 +19,7 @@ import android.text.method.LinkMovementMethod; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout; @@ -28,15 +28,12 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.SwitchCompat; import androidx.core.content.res.ResourcesCompat; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; +import androidx.fragment.app.Fragment; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.bottomsheet.BottomSheetDialog; -import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import org.json.JSONException; @@ -51,15 +48,16 @@ import org.chromium.chrome.browser.BraveRewardsObserver; import org.chromium.chrome.browser.BraveWalletProvider; import org.chromium.chrome.browser.app.BraveActivity; +import org.chromium.chrome.browser.rewards.BraveRewardsBannerInfo; import org.chromium.chrome.browser.util.TabUtils; +import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.text.NoUnderlineClickableSpan; import java.math.RoundingMode; import java.text.DecimalFormat; -public class RewardsTippingPanelFragment - extends BottomSheetDialogFragment implements BraveRewardsObserver { - final public static String TAG_FRAGMENT = "tipping_panel_tag"; +public class RewardsTippingPanelFragment extends Fragment implements BraveRewardsObserver { + public static final String TAG_FRAGMENT = "tipping_panel_tag"; private static final String TAG = "TippingPanelFragment"; private static final String WEB3_URL = "web3_url"; @@ -96,17 +94,18 @@ public class RewardsTippingPanelFragment private boolean mIsBatCurrency; private BraveRewardsExternalWallet mExternalWallet; private ProgressBar mTipProgressBar; + private ProgressBar mFetchBalanceProgressBar; private TextView mUsdSymbol1; private TextView mUsdSymbol2; private boolean mEnoughFundWarningShown; private TextView mCustodianText; + private boolean mIsTablet; - public static RewardsTippingPanelFragment newInstance(int tabId, String web3Url) { + public static RewardsTippingPanelFragment newInstance(int tabId) { RewardsTippingPanelFragment fragment = new RewardsTippingPanelFragment(); Bundle args = new Bundle(); args.putInt(RewardsTippingBannerActivity.TAB_ID_EXTRA, tabId); - args.putString(WEB3_URL, web3Url); fragment.setArguments(args); return fragment; } @@ -114,51 +113,34 @@ public static RewardsTippingPanelFragment newInstance(int tabId, String web3Url) @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setStyle(STYLE_NORMAL, R.style.AppBottomSheetDialogTheme); init(); } private void init() { mBraveRewardsNativeWorker = BraveRewardsNativeWorker.getInstance(); mBraveRewardsNativeWorker.AddObserver(this); - mBraveRewardsNativeWorker.GetExternalWallet(); } @Override - public void show(@NonNull FragmentManager manager, @Nullable String tag) { - try { - RewardsTippingPanelFragment fragment = - (RewardsTippingPanelFragment) manager.findFragmentByTag( - RewardsTippingPanelFragment.TAG_FRAGMENT); - FragmentTransaction transaction = manager.beginTransaction(); - if (fragment != null) { - transaction.remove(fragment); - } - transaction.add(this, tag); - transaction.commitAllowingStateLoss(); - } catch (IllegalStateException e) { - Log.e(TAG, e.getMessage()); - } - } - - @Override - public Dialog onCreateDialog(Bundle savedInstance) { - BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstance); + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { final View view = LayoutInflater.from(getContext()) - .inflate(R.layout.brave_rewards_tippingpanel_fragment, null); - dialog.setContentView(view); + .inflate(R.layout.brave_rewards_tippingpanel_fragment_base, null); + mIsTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(getActivity()); if (getArguments() != null) { mCurrentTabId = getArguments().getInt(RewardsTippingBannerActivity.TAB_ID_EXTRA); - mWeb3Url = getArguments().getString(WEB3_URL); + mBraveRewardsNativeWorker.GetPublisherBanner( + mBraveRewardsNativeWorker.GetPublisherId(mCurrentTabId)); } mContentView = view; mSendButton = view.findViewById(R.id.send_tip_button); mWeb3WalletButton = view.findViewById(R.id.use_web3_wallet_button); mTipProgressBar = view.findViewById(R.id.send_tip_progress_bar); + mFetchBalanceProgressBar = view.findViewById(R.id.fetchBalanceProgressBar); mCustodianText = view.findViewById(R.id.custodian_text); init(view); - setBalanceText(view); + mBraveRewardsNativeWorker.fetchBalance(); initTipChoice(mToggle); setAlreadyMonthlyContributionSetMessage(); sendTipButtonClick(view); @@ -167,10 +149,21 @@ public Dialog onCreateDialog(Bundle savedInstance) { setCustodianIconAndName(view); updateTermsOfServicePlaceHolder(view); checkEnoughFund(); - setupFullHeight(dialog); setMonthlyInformationClick(view); - return dialog; + return view; + } + + @Override + public void onBalance(boolean success) { + mFetchBalanceProgressBar.setVisibility(View.GONE); + if (success) { + try { + setBalanceText(); + } catch (NullPointerException e) { + Log.e(TAG, "BraveRewardsPanel onBalance " + e); + } + } } private void setMonthlyInformationClick(View view) { @@ -285,11 +278,20 @@ private void setAlreadyMonthlyContributionSetMessage() { } } + public void replaceSuccessUI() { + new RewardsTippingSuccessContribution(getActivity(), mContentView, mAmountSelected); + View tippingSuccessFragment = + mContentView.findViewById(R.id.rewards_tipping_success_fragment); + View tippingTipFragment = mContentView.findViewById(R.id.rewards_tipping_tip_fragment); + tippingTipFragment.setVisibility(View.GONE); + + tippingSuccessFragment.setVisibility(View.VISIBLE); + } + @Override public void onSendContribution(boolean result) { if (result) { - RewardsTippingSuccessContributionFragment.showTippingSuccessContributionUi( - (AppCompatActivity) getActivity(), mAmountSelected); + replaceSuccessUI(); mSendButton.setText(R.string.send); } else { showErrorLayout(); @@ -341,8 +343,7 @@ private SpannableString stringMonthlyToSpannableString(String text) { getActivity(), R.color.monthly_contributions_text_color, (textView) -> { TabUtils.openUrlInNewTab( false, BraveActivity.BRAVE_REWARDS_SETTINGS_MONTHLY_URL); - getActivity().setResult(Activity.RESULT_OK); - getActivity().finish(); + dismissRewardsPanel(); }); BraveRewardsHelper.setSpan(getActivity(), text, textSpannableString, @@ -403,8 +404,7 @@ private void showWarningMessage(View view, int background, String title, String private void web3ButtonClick(View view) { mWeb3WalletButton.setOnClickListener(v -> { TabUtils.openUrlInNewTab(false, mWeb3Url); - getActivity().setResult(Activity.RESULT_OK); - getActivity().finish(); + dismissRewardsPanel(); }); } @@ -413,8 +413,7 @@ private void sendTipButtonClick(View view) { if (mIsLogoutState) { if (mExternalWallet != null) { TabUtils.openUrlInNewTab(false, mExternalWallet.getLoginUrl()); - getActivity().setResult(Activity.RESULT_OK); - getActivity().finish(); + dismissRewardsPanel(); } } else { SwitchCompat isMonthly = view.findViewById(R.id.monthly_switch); @@ -446,7 +445,7 @@ private void exchangeButtonClick(View view) { }); } - private TextWatcher textChangeListener = new TextWatcher() { + private TextWatcher mTextChangeListener = new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @@ -481,7 +480,7 @@ private void init(View view) { mCurrency1ValueTextView = view.findViewById(R.id.currencyOneEditText1); mCurrency2ValueTextView = view.findViewById(R.id.exchange_amount1); - mCurrency1ValueEditTextView.addTextChangedListener(textChangeListener); + mCurrency1ValueEditTextView.addTextChangedListener(mTextChangeListener); mRate = mBraveRewardsNativeWorker.GetWalletRate(); mRadioTipAmount[0] = view.findViewById(R.id.tipChoice1); mRadioTipAmount[1] = view.findViewById(R.id.tipChoice2); @@ -489,11 +488,11 @@ private void init(View view) { mRadioTipAmount[3] = view.findViewById(R.id.tipChoiceCustom); for (TextView tb : mRadioTipAmount) { - tb.setOnClickListener(radio_clicker); + tb.setOnClickListener(mRadioClicker); } } - void setBalanceText(View view) { + void setBalanceText() { double balance = DEFAULT_AMOUNT; BraveRewardsBalance rewards_balance = mBraveRewardsNativeWorker.GetWalletBalance(); if (rewards_balance != null) { @@ -506,7 +505,7 @@ void setBalanceText(View view) { df.setMinimumFractionDigits(3); String walletAmount = df.format(balance) + " " + BraveRewardsHelper.BAT_TEXT; - ((TextView) view.findViewById(R.id.wallet_amount_text)).setText(walletAmount); + ((TextView) mContentView.findViewById(R.id.wallet_amount_text)).setText(walletAmount); } private void checkEnoughFund() { @@ -588,8 +587,11 @@ private void initTipChoice(boolean isBat) { } } - private View.OnClickListener radio_clicker = view -> { - mCurrency1ValueEditTextView.removeTextChangedListener(textChangeListener); + private View.OnClickListener mRadioClicker = view -> { + if (mFetchBalanceProgressBar.getVisibility() == View.VISIBLE) { + return; + } + mCurrency1ValueEditTextView.removeTextChangedListener(mTextChangeListener); TextView tb_pressed = (TextView) view; if (!tb_pressed.isSelected()) { @@ -630,32 +632,24 @@ private void initTipChoice(boolean isBat) { mAmountSelected = selectedAmount(); checkEnoughFund(); - mCurrency1ValueEditTextView.addTextChangedListener(textChangeListener); + mCurrency1ValueEditTextView.addTextChangedListener(mTextChangeListener); }; private double selectedAmount() { double amount = 0.0; try { - if (mIsBatCurrency) + if (mIsBatCurrency) { amount = Double.parseDouble(mCurrency1ValueEditTextView.getText().toString()); - else + } else { amount = Double.parseDouble(mCurrency2ValueTextView.getText().toString()); + } } catch (NumberFormatException e) { } return amount; } - public static void showTippingPanelBottomSheet( - AppCompatActivity activity, int tabId, String web3Url) { - if (activity != null) { - RewardsTippingPanelFragment dialog = - RewardsTippingPanelFragment.newInstance(tabId, web3Url); - dialog.show(activity.getSupportFragmentManager(), TAG_FRAGMENT); - } - } - private double roundExchangeUp(double batValue) { return Math.ceil(batValue * 100) / 100; } @@ -693,4 +687,32 @@ public void onDestroyView() { mBraveRewardsNativeWorker.RemoveObserver(this); } } + + private void dismissRewardsPanel() { + if (mIsTablet) { + try { + BraveActivity braveActivity = BraveActivity.getBraveActivity(); + braveActivity.dismissRewardsPanel(); + } catch (BraveActivity.BraveActivityNotFoundException e) { + Log.e(TAG, "setShareYourSupportClickListener " + e); + } + } else { + getActivity().setResult(Activity.RESULT_OK); + getActivity().finish(); + } + } + + @Override + public void onPublisherBanner(String jsonBannerInfo) { + try { + BraveRewardsBannerInfo bannerInfo = new BraveRewardsBannerInfo(jsonBannerInfo); + mWeb3Url = bannerInfo.getWeb3Url(); + if (!TextUtils.isEmpty(mWeb3Url)) { + mWeb3WalletButton.setVisibility(View.VISIBLE); + } + mBraveRewardsNativeWorker.GetExternalWallet(); + } catch (JSONException e) { + Log.e(TAG, "TippingBanner -> CreatorPanel:onAttach JSONException error " + e); + } + } } diff --git a/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingSuccessContribution.java b/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingSuccessContribution.java new file mode 100644 index 000000000000..d54c24c8f512 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingSuccessContribution.java @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. + */ + +package org.chromium.chrome.browser.rewards.tipping; + +import android.app.Activity; +import android.content.Intent; +import android.net.Uri; +import android.view.View; + +import androidx.annotation.NonNull; + +import org.chromium.base.Log; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.app.BraveActivity; +import org.chromium.ui.base.DeviceFormFactor; + +public class RewardsTippingSuccessContribution { + private static final String AMOUNT_SELECTED = "amount_selected"; + private static final String TAG = "TippingSuccess"; + private View mContentView; + private double mAmountSelected; + private Activity mActivity; + private boolean mIsTablet; + + public RewardsTippingSuccessContribution( + @NonNull Activity activity, View rootView, double amountSelected) { + mContentView = rootView; + mAmountSelected = amountSelected; + mActivity = activity; + setShareYourSupportClickListener(); + setGoBackClick(); + mIsTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(mActivity); + } + + private void setGoBackClick() { + View goBackButton = mContentView.findViewById(R.id.go_back_button); + goBackButton.setOnClickListener(v -> { dismissRewardsPanel(); }); + } + + private void dismissRewardsPanel() { + if (mIsTablet) { + try { + BraveActivity braveActivity = BraveActivity.getBraveActivity(); + braveActivity.dismissRewardsPanel(); + } catch (BraveActivity.BraveActivityNotFoundException e) { + Log.e(TAG, "setShareYourSupportClickListener " + e); + } + } else { + mActivity.setResult(Activity.RESULT_OK); + mActivity.finish(); + } + } + + private void setShareYourSupportClickListener() { + View shareYourSupportButton = mContentView.findViewById(R.id.share_your_support); + shareYourSupportButton.setOnClickListener(v -> { + double amount = mAmountSelected; + + String tweetUrl = getTipSuccessTweetUrl(amount); + Uri uri = Uri.parse(tweetUrl); + mActivity.startActivity(new Intent(Intent.ACTION_VIEW, uri)); + dismissRewardsPanel(); + }); + } + + private String getTipSuccessTweetUrl(double amount) { + Uri.Builder builder = new Uri.Builder(); + builder.scheme("https") + .authority("twitter.com") + .appendPath("intent") + .appendPath("tweet") + .appendQueryParameter("text", + String.format(mActivity.getString(R.string.brave_rewards_tip_success_tweet), + amount)); + return builder.build().toString(); + } +} diff --git a/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingSuccessContributionFragment.java b/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingSuccessContributionFragment.java deleted file mode 100644 index cff73da9ea3e..000000000000 --- a/android/java/org/chromium/chrome/browser/rewards/tipping/RewardsTippingSuccessContributionFragment.java +++ /dev/null @@ -1,132 +0,0 @@ -/** - * Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. - */ - -package org.chromium.chrome.browser.rewards.tipping; - -import android.app.Activity; -import android.app.Dialog; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.FrameLayout; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; - -import com.google.android.material.bottomsheet.BottomSheetBehavior; -import com.google.android.material.bottomsheet.BottomSheetDialog; -import com.google.android.material.bottomsheet.BottomSheetDialogFragment; - -import org.chromium.base.Log; -import org.chromium.chrome.R; - -public class RewardsTippingSuccessContributionFragment extends BottomSheetDialogFragment { - final public static String TAG_FRAGMENT = "tipping_success_contribution"; - private static final String AMOUNT_SELECTED = "amount_selected"; - private static final String TAG = "TippingSuccess"; - - public static RewardsTippingSuccessContributionFragment newInstance(double amountSelected) { - RewardsTippingSuccessContributionFragment fragment = - new RewardsTippingSuccessContributionFragment(); - Bundle args = new Bundle(); - args.putDouble(AMOUNT_SELECTED, amountSelected); - fragment.setArguments(args); - return fragment; - } - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setStyle(STYLE_NORMAL, R.style.AppBottomSheetDialogTheme); - } - @Override - public Dialog onCreateDialog(Bundle savedInstance) { - BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstance); - final View view = - LayoutInflater.from(getContext()) - .inflate(R.layout.rewards_tipping_success_contribution_fragment, null); - dialog.setContentView(view); - setShareYourSupportClickListener(view); - setupFullHeight(dialog); - setGoBackClick(view); - - return dialog; - } - - private void setGoBackClick(View view) { - View goBackButton = view.findViewById(R.id.go_back_button); - goBackButton.setOnClickListener(v -> { - getActivity().setResult(Activity.RESULT_OK); - getActivity().finish(); - }); - } - - private void setupFullHeight(BottomSheetDialog bottomSheetDialog) { - FrameLayout bottomSheet = - (FrameLayout) bottomSheetDialog.findViewById(R.id.design_bottom_sheet); - BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet); - behavior.setState(BottomSheetBehavior.STATE_EXPANDED); - } - - private void setShareYourSupportClickListener(View view) { - View shareYourSupportButton = view.findViewById(R.id.share_your_support); - shareYourSupportButton.setOnClickListener(v -> { - double amount = 0.0; - - if (getArguments() != null) { - amount = getArguments().getDouble(AMOUNT_SELECTED); - } - - String tweetUrl = getTipSuccessTweetUrl(amount); - Uri uri = Uri.parse(tweetUrl); - startActivity(new Intent(Intent.ACTION_VIEW, uri)); - getActivity().setResult(Activity.RESULT_OK); - getActivity().finish(); - }); - } - - @Override - public void show(@NonNull FragmentManager manager, @Nullable String tag) { - try { - RewardsTippingSuccessContributionFragment fragment = - (RewardsTippingSuccessContributionFragment) manager.findFragmentByTag( - RewardsTippingSuccessContributionFragment.TAG_FRAGMENT); - FragmentTransaction transaction = manager.beginTransaction(); - if (fragment != null) { - transaction.remove(fragment); - } - transaction.add(this, tag); - transaction.commitAllowingStateLoss(); - } catch (IllegalStateException e) { - Log.e(TAG, e.getMessage()); - } - } - - public static void showTippingSuccessContributionUi( - AppCompatActivity activity, double amountSelected) { - if (activity != null) { - RewardsTippingSuccessContributionFragment braveAskPlayStoreRatingDialog = - RewardsTippingSuccessContributionFragment.newInstance(amountSelected); - braveAskPlayStoreRatingDialog.show(activity.getSupportFragmentManager(), TAG_FRAGMENT); - } - } - - private String getTipSuccessTweetUrl(double amount) { - Uri.Builder builder = new Uri.Builder(); - builder.scheme("https") - .authority("twitter.com") - .appendPath("intent") - .appendPath("tweet") - .appendQueryParameter("text", - String.format(getString(R.string.brave_rewards_tip_success_tweet), amount)); - return builder.build().toString(); - } -} diff --git a/android/java/res/drawable-sw600dp/bottomsheet_rewards_tipping_success_background.xml b/android/java/res/drawable-sw600dp/bottomsheet_rewards_tipping_success_background.xml new file mode 100644 index 000000000000..6c1aa3ace872 --- /dev/null +++ b/android/java/res/drawable-sw600dp/bottomsheet_rewards_tipping_success_background.xml @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/android/java/res/drawable/bottomsheet_rewards_background_tablet.xml b/android/java/res/drawable/bottomsheet_rewards_background_tablet.xml new file mode 100644 index 000000000000..9a057c620816 --- /dev/null +++ b/android/java/res/drawable/bottomsheet_rewards_background_tablet.xml @@ -0,0 +1,33 @@ + + + + + + > + + + + + + > + + + + diff --git a/android/java/res/drawable/tipping_banner_tablet_ui_background.xml b/android/java/res/drawable/tipping_banner_tablet_ui_background.xml new file mode 100644 index 000000000000..f79402c83997 --- /dev/null +++ b/android/java/res/drawable/tipping_banner_tablet_ui_background.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/android/java/res/drawable/verification_tick_mark.xml b/android/java/res/drawable/verification_tick_mark.xml new file mode 100644 index 000000000000..ed75d3893e2e --- /dev/null +++ b/android/java/res/drawable/verification_tick_mark.xml @@ -0,0 +1,12 @@ + + + + diff --git a/android/java/res/layout-sw600dp/brave_rewards_tippingpanel_fragment.xml b/android/java/res/layout-sw600dp/brave_rewards_tippingpanel_fragment.xml new file mode 100644 index 000000000000..3df83bd90ac6 --- /dev/null +++ b/android/java/res/layout-sw600dp/brave_rewards_tippingpanel_fragment.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/java/res/layout-sw600dp/brave_rewards_tippingpanel_fragment_base.xml b/android/java/res/layout-sw600dp/brave_rewards_tippingpanel_fragment_base.xml new file mode 100644 index 000000000000..df391064209c --- /dev/null +++ b/android/java/res/layout-sw600dp/brave_rewards_tippingpanel_fragment_base.xml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/android/java/res/layout-sw600dp/rewards_tipping_banner_fragment.xml b/android/java/res/layout-sw600dp/rewards_tipping_banner_fragment.xml new file mode 100644 index 000000000000..d21eb080f66f --- /dev/null +++ b/android/java/res/layout-sw600dp/rewards_tipping_banner_fragment.xml @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/java/res/layout-sw600dp/rewards_tipping_success_contribution_fragment.xml b/android/java/res/layout-sw600dp/rewards_tipping_success_contribution_fragment.xml new file mode 100644 index 000000000000..4ade6e46905f --- /dev/null +++ b/android/java/res/layout-sw600dp/rewards_tipping_success_contribution_fragment.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + +