Update Rewards onboarding UI

Update Rewards onboarding behaviour

Update StartProcess in Rewards panel
This commit is contained in:
Deep
2020-12-08 08:33:36 -05:00
parent 2593366342
commit d53fbf1b15
15 changed files with 364 additions and 143 deletions
@@ -6,6 +6,7 @@ package org.chromium.chrome.browser;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
@@ -20,15 +21,16 @@ import android.text.Spanned;
import android.util.DisplayMetrics;
import android.view.TouchDelegate;
import android.view.View;
import android.content.SharedPreferences;
import androidx.annotation.Nullable;
import org.chromium.base.ContextUtils;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.chrome.R;
import org.chromium.base.ContextUtils;
import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.app.BraveActivity;
import org.chromium.chrome.browser.preferences.BravePreferenceKeys;
import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabImpl;
@@ -42,8 +44,14 @@ import java.util.Calendar;
import java.util.Locale;
public class BraveRewardsHelper implements LargeIconBridge.LargeIconCallback{
private static final String PREF_BRAVE_REWARDS_OPEN_COUNT = "brave_rewards_open_count";
private static final String PREF_SHOW_BRAVE_REWARDS_ONBOARDING = "show_brave_rewards_onboarding";
private static final String PREF_BRAVE_REWARDS_OPEN_COUNT = "brave_rewards_app_open_count";
private static final String PREF_SHOW_BRAVE_REWARDS_ONBOARDING_MODAL_ONCE =
"show_brave_rewards_onboarding_modal_once";
private static final String PREF_SHOW_BRAVE_REWARDS_ONBOARDING_ONCE =
"show_brave_rewards_onboarding_once";
private static final String PREF_SHOW_ONBOARDING_MINI_MODAL = "show_onboarding_mini_modal";
private static final String PREF_SHOW_REWARDS_SETTINGS_ONBOARDING_MODAL =
"show_REWARDS_SETTINGS_ONBOARDING_MODAL";
private static final int FAVICON_CIRCLE_MEASUREMENTS = 70; // dp
private static final int FAVICON_TEXT_SIZE = 50; // dp
private static final int FAVICON_FETCH_INTERVAL = 1000; // In milliseconds
@@ -62,23 +70,62 @@ public class BraveRewardsHelper implements LargeIconBridge.LargeIconCallback{
private static final float DP_PER_INCH_MDPI = 160f;
private Tab mTab;
public static int getBraveRewardsOpenCount() {
public static int getBraveRewardsAppOpenCount() {
return ContextUtils.getAppSharedPreferences().getInt(PREF_BRAVE_REWARDS_OPEN_COUNT, 0);
}
public static void updateBraveRewardsOpenCount() {
public static void updateBraveRewardsAppOpenCount() {
SharedPreferences.Editor sharedPreferencesEditor = ContextUtils.getAppSharedPreferences().edit();
sharedPreferencesEditor.putInt(PREF_BRAVE_REWARDS_OPEN_COUNT, getBraveRewardsOpenCount() + 1);
sharedPreferencesEditor.putInt(PREF_BRAVE_REWARDS_OPEN_COUNT,
SharedPreferencesManager.getInstance().readInt(
BravePreferenceKeys.BRAVE_APP_OPEN_COUNT));
sharedPreferencesEditor.apply();
}
public static boolean shouldShowBraveRewardsOnboarding() {
return ContextUtils.getAppSharedPreferences().getBoolean(PREF_SHOW_BRAVE_REWARDS_ONBOARDING, false);
public static boolean shouldShowBraveRewardsSettingsOnboardingModal() {
return ContextUtils.getAppSharedPreferences().getBoolean(
PREF_SHOW_REWARDS_SETTINGS_ONBOARDING_MODAL, true);
}
public static void setShowBraveRewardsOnboarding(boolean enabled) {
public static void setShowBraveRewardsSettingsOnboardingModal(boolean enabled) {
SharedPreferences.Editor sharedPreferencesEditor = ContextUtils.getAppSharedPreferences().edit();
sharedPreferencesEditor.putBoolean(PREF_SHOW_BRAVE_REWARDS_ONBOARDING, enabled);
sharedPreferencesEditor.putBoolean(PREF_SHOW_REWARDS_SETTINGS_ONBOARDING_MODAL, enabled);
sharedPreferencesEditor.apply();
}
public static boolean shouldShowMiniOnboardingModal() {
return ContextUtils.getAppSharedPreferences().getBoolean(
PREF_SHOW_ONBOARDING_MINI_MODAL, true);
}
public static void setShowMiniOnboardingModal(boolean enabled) {
SharedPreferences.Editor sharedPreferencesEditor =
ContextUtils.getAppSharedPreferences().edit();
sharedPreferencesEditor.putBoolean(PREF_SHOW_ONBOARDING_MINI_MODAL, enabled);
sharedPreferencesEditor.apply();
}
public static boolean shouldShowBraveRewardsOnboardingModalOnce() {
return ContextUtils.getAppSharedPreferences().getBoolean(
PREF_SHOW_BRAVE_REWARDS_ONBOARDING_MODAL_ONCE, false);
}
public static void setShowBraveRewardsOnboardingModalOnce(boolean enabled) {
SharedPreferences.Editor sharedPreferencesEditor =
ContextUtils.getAppSharedPreferences().edit();
sharedPreferencesEditor.putBoolean(PREF_SHOW_BRAVE_REWARDS_ONBOARDING_MODAL_ONCE, enabled);
sharedPreferencesEditor.apply();
}
public static boolean shouldShowBraveRewardsOnboardingOnce() {
return ContextUtils.getAppSharedPreferences().getBoolean(
PREF_SHOW_BRAVE_REWARDS_ONBOARDING_ONCE, false);
}
public static void setShowBraveRewardsOnboardingOnce(boolean enabled) {
SharedPreferences.Editor sharedPreferencesEditor =
ContextUtils.getAppSharedPreferences().edit();
sharedPreferencesEditor.putBoolean(PREF_SHOW_BRAVE_REWARDS_ONBOARDING_ONCE, enabled);
sharedPreferencesEditor.apply();
}
@@ -422,11 +422,18 @@ public class BraveRewardsNativeWorker {
}
public void StartProcess() {
synchronized(lock) {
synchronized (lock) {
nativeStartProcess(mNativeBraveRewardsNativeWorker);
}
}
@CalledByNative
public void OnStartProcess() {
for (BraveRewardsObserver observer : mObservers) {
observer.OnStartProcess();
}
}
@CalledByNative
public void OnRefreshPublisher(int status, String publisherKey) {
for (BraveRewardsObserver observer : mObservers) {
@@ -30,4 +30,5 @@ public interface BraveRewardsObserver {
default public void OnRecoverWallet(int errorCode) {};
default public void OnRefreshPublisher(int status, String publisherKey){};
default public void OnOneTimeTip(){};
default public void OnStartProcess(){};
}
@@ -6,18 +6,21 @@
package org.chromium.chrome.browser;
import android.content.Context;
import androidx.viewpager.widget.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.appcompat.widget.AppCompatImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.viewpager.widget.PagerAdapter;
import org.chromium.base.ContextUtils;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.BraveAdsNativeHelper;
import org.chromium.chrome.browser.BraveRewardsNativeWorker;
import org.chromium.chrome.browser.profiles.Profile;
import java.util.Arrays;
import java.util.List;
@@ -108,7 +111,10 @@ public class BraveRewardsOnboardingPagerAdapter extends PagerAdapter {
} else if (checkedId == R.id.hour_5_radio) {
hour = 5;
}
BraveRewardsNativeWorker.getInstance().SetAdsPerHour(hour);
if (BraveAdsNativeHelper.nativeIsBraveAdsEnabled(
Profile.getLastUsedRegularProfile())) {
BraveRewardsNativeWorker.getInstance().SetAdsPerHour(hour);
}
}
});
@@ -128,7 +134,10 @@ public class BraveRewardsOnboardingPagerAdapter extends PagerAdapter {
} else if (checkedId == R.id.contribute_50_radio) {
contribute = 50;
}
BraveRewardsNativeWorker.getInstance().SetAutoContributionAmount(contribute);
if (BraveRewardsNativeWorker.getInstance().IsAutoContributeEnabled()) {
BraveRewardsNativeWorker.getInstance().SetAutoContributionAmount(
contribute);
}
}
});
} else {
@@ -7,17 +7,23 @@
package org.chromium.chrome.browser;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.PorterDuff;
import android.os.Handler;
import android.os.Build;
import android.os.Handler;
import android.text.Html;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -30,8 +36,8 @@ import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
@@ -40,59 +46,53 @@ import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.Switch;
import android.widget.TextView;
import android.content.Intent;
import android.widget.Toast;
import android.text.SpannableString;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.viewpager.widget.ViewPager;
import androidx.annotation.NonNull;
import com.google.android.material.tabs.TabLayout;
import org.json.JSONException;
import org.chromium.base.ContextUtils;
import org.chromium.chrome.browser.util.PackageUtils;
import org.chromium.base.Log;
import org.chromium.base.SysUtils;
import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.BraveAdsNativeHelper;
import org.chromium.chrome.browser.BraveRewardsBalance;
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.ChromeTabbedActivity;
import org.chromium.chrome.browser.app.BraveActivity;
import org.chromium.chrome.browser.custom_layout.HeightWrappingViewPager;
import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.browser.preferences.BravePreferenceKeys;
import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.util.PackageUtils;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.chrome.browser.custom_layout.HeightWrappingViewPager;
import org.json.JSONException;
import java.math.RoundingMode;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import java.util.Timer;
import java.util.TimerTask;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveRewardsHelper.LargeIconReadyCallback {
private static final String BRAVE_TERMS_PAGE = "https://basicattentiontoken.org/user-terms-of-service/";
private static final String BRAVE_PRIVACY_POLICY = "https://brave.com/privacy/#rewards";
private static final String TAG = "BraveRewards";
private static final int UPDATE_BALANCE_INTERVAL = 60000; // In milliseconds
private static final int PUBLISHER_INFO_FETCH_RETRY = 3 * 1000; // In milliseconds
@@ -468,6 +468,9 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
SetupNotificationsControls();
ShowWebSiteView();
mBraveRewardsNativeWorker.GetRewardsParameters();
mBraveRewardsNativeWorker.GetExternalWallet();
}
@@ -485,8 +488,7 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
@Override
public void onClick(@NonNull View textView) {
braveRewardsOptInView.setVisibility(View.GONE);
showBraveRewardsOnboarding(root);
showBraveRewardsOnboarding(root, false);
}
@Override
public void updateDrawState(@NonNull TextPaint ds) {
@@ -507,6 +509,8 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
braveRewardsOptInView.setVisibility(View.GONE);
BraveAdsNativeHelper.nativeSetAdsEnabled(Profile.getLastUsedRegularProfile());
BraveRewardsNativeWorker.getInstance().SetAutoContributeEnabled(true);
if (mBraveActivity != null)
mBraveActivity.openNewOrSelectExistingTab(BraveActivity.REWARDS_SETTINGS_URL);
}
}));
@@ -518,7 +522,7 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
ClickableSpan tosClickableSpan = new ClickableSpan() {
@Override
public void onClick(@NonNull View textView) {
CustomTabActivity.showInfoPage(mActivity, BRAVE_TERMS_PAGE);
CustomTabActivity.showInfoPage(mActivity, BraveActivity.BRAVE_TERMS_PAGE);
}
@Override
public void updateDrawState(@NonNull TextPaint ds) {
@@ -533,7 +537,7 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
ClickableSpan privacyProtectionClickableSpan = new ClickableSpan() {
@Override
public void onClick(@NonNull View textView) {
CustomTabActivity.showInfoPage(mActivity, BRAVE_PRIVACY_POLICY);
CustomTabActivity.showInfoPage(mActivity, BraveActivity.BRAVE_PRIVACY_POLICY);
}
@Override
public void updateDrawState(@NonNull TextPaint ds) {
@@ -554,7 +558,6 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
modalCloseButton.setOnClickListener((new View.OnClickListener() {
@Override
public void onClick(View v) {
showBraveRewardsOptInLayout(root);
braveRewardsOptInView.setVisibility(View.GONE);
}
}));
@@ -572,7 +575,7 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
ClickableSpan tosClickableSpan = new ClickableSpan() {
@Override
public void onClick(@NonNull View textView) {
CustomTabActivity.showInfoPage(mActivity, BRAVE_TERMS_PAGE);
CustomTabActivity.showInfoPage(mActivity, BraveActivity.BRAVE_TERMS_PAGE);
}
@Override
public void updateDrawState(@NonNull TextPaint ds) {
@@ -587,7 +590,7 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
ClickableSpan privacyProtectionClickableSpan = new ClickableSpan() {
@Override
public void onClick(@NonNull View textView) {
CustomTabActivity.showInfoPage(mActivity, BRAVE_PRIVACY_POLICY);
CustomTabActivity.showInfoPage(mActivity, BraveActivity.BRAVE_PRIVACY_POLICY);
}
@Override
public void updateDrawState(@NonNull TextPaint ds) {
@@ -609,7 +612,7 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
@Override
public void onClick(View v) {
braveRewardsOnboardingModalView.setVisibility(View.GONE);
showBraveRewardsOnboarding(root);
showBraveRewardsOnboarding(root, false);
}
}));
Button btnBraveRewards = root.findViewById(R.id.btn_brave_rewards);
@@ -619,7 +622,7 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
braveRewardsOnboardingModalView.setVisibility(View.GONE);
BraveAdsNativeHelper.nativeSetAdsEnabled(Profile.getLastUsedRegularProfile());
BraveRewardsNativeWorker.getInstance().SetAutoContributeEnabled(true);
showBraveRewardsOnboarding(root);
showBraveRewardsOnboarding(root, true);
}
}));
AppCompatImageView modalCloseButton = braveRewardsOnboardingModalView.findViewById(R.id.modal_close);
@@ -632,7 +635,7 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
}));
}
private void showBraveRewardsOnboarding(View root) {
private void showBraveRewardsOnboarding(View root, boolean shouldShowMoreOption) {
braveRewardsOnboardingView = root.findViewById(R.id.brave_rewards_onboarding_layout_id);
braveRewardsOnboardingView.setVisibility(View.VISIBLE);
final Button btnNext = braveRewardsOnboardingView.findViewById(R.id.btn_next);
@@ -673,7 +676,7 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
public void onPageScrollStateChanged(int state) {}
});
braveRewardsOnboardingPagerAdapter = new BraveRewardsOnboardingPagerAdapter();
braveRewardsOnboardingPagerAdapter.setOnboardingType(BraveAdsNativeHelper.nativeIsBraveAdsEnabled(Profile.getLastUsedRegularProfile()));
braveRewardsOnboardingPagerAdapter.setOnboardingType(shouldShowMoreOption);
braveRewardsViewPager.setAdapter(braveRewardsOnboardingPagerAdapter);
TabLayout braveRewardsTabLayout = braveRewardsOnboardingView.findViewById(R.id.brave_rewards_tab_layout);
braveRewardsTabLayout.setupWithViewPager(braveRewardsViewPager, true);
@@ -705,7 +708,7 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
@Override
public void onClick(View v) {
braveRewardsWelcomeView.setVisibility(View.GONE);
showBraveRewardsOnboarding(root);
showBraveRewardsOnboarding(root, false);
}
}));
}
@@ -730,6 +733,8 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
}
if (BraveAdsNativeHelper.nativeIsBraveAdsEnabled(Profile.getLastUsedRegularProfile())) {
showBraveRewardsWelcomeLayout(root);
} else {
showBraveRewardsOptInLayout(root);
}
} else {
braveRewardsViewPager.setCurrentItem(braveRewardsViewPager.getCurrentItem() + 1);
@@ -739,7 +744,8 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
if (viewId == R.id.btn_skip
&& braveRewardsOnboardingView != null) {
braveRewardsViewPager.setCurrentItem(braveRewardsOnboardingPagerAdapter.getCount() - 1);
braveRewardsViewPager.setCurrentItem(
braveRewardsOnboardingPagerAdapter.getCount() - 1);
}
if (viewId == R.id.btn_go_back
@@ -817,21 +823,36 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
public void showLikePopDownMenu() {
this.showLikePopDownMenu(0, 0);
BraveRewardsNativeWorker.getInstance().StartProcess();
}
@Override
public void OnStartProcess() {
if (root != null && PackageUtils.isFirstInstall(mActivity)) {
if (BraveRewardsHelper.shouldShowBraveRewardsOnboarding()) {
showBraveRewardsOnboarding(root);
BraveRewardsHelper.setShowBraveRewardsOnboarding(false);
} else if ((BraveRewardsHelper.getBraveRewardsOpenCount() == 0)
&& !BraveAdsNativeHelper.nativeIsBraveAdsEnabled(Profile.getLastUsedRegularProfile())) {
if (BraveRewardsHelper.shouldShowBraveRewardsOnboardingModalOnce()) {
showBraveRewardsOnboardingModal(root);
BraveRewardsHelper.updateBraveRewardsOpenCount();
} else if (BraveRewardsHelper.getBraveRewardsOpenCount() == 1) {
BraveRewardsHelper.setShowBraveRewardsOnboardingModalOnce(false);
BraveRewardsHelper.setShowBraveRewardsSettingsOnboardingModal(false);
BraveRewardsHelper.updateBraveRewardsAppOpenCount();
} else if (BraveRewardsHelper.shouldShowBraveRewardsOnboardingOnce()) {
showBraveRewardsOnboarding(root, false);
BraveRewardsHelper.setShowBraveRewardsOnboardingOnce(false);
} else if ((BraveRewardsHelper.getBraveRewardsAppOpenCount() == 0)
&& !BraveAdsNativeHelper.nativeIsBraveAdsEnabled(
Profile.getLastUsedRegularProfile())) {
showBraveRewardsOnboardingModal(root);
BraveRewardsHelper.updateBraveRewardsAppOpenCount();
BraveRewardsHelper.setShowBraveRewardsSettingsOnboardingModal(false);
} else if (SharedPreferencesManager.getInstance().readInt(
BravePreferenceKeys.BRAVE_APP_OPEN_COUNT)
> BraveRewardsHelper.getBraveRewardsAppOpenCount()
&& BraveRewardsHelper.shouldShowMiniOnboardingModal()) {
if (BraveAdsNativeHelper.nativeIsBraveAdsEnabled(Profile.getLastUsedRegularProfile())) {
showBraveRewardsWelcomeLayout(root);
} else {
showBraveRewardsOptInLayout(root);
}
BraveRewardsHelper.updateBraveRewardsOpenCount();
BraveRewardsHelper.setShowMiniOnboardingModal(false);
}
}
}
@@ -1830,8 +1851,6 @@ public class BraveRewardsPanelPopup implements BraveRewardsObserver, BraveReward
}
}
SetVerifyWalletControl(walletStatus);
mBraveRewardsNativeWorker.GetRewardsParameters();
ShowWebSiteView();
}
/**
@@ -41,6 +41,7 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.ApplicationLifetime;
import org.chromium.chrome.browser.BraveConfig;
import org.chromium.chrome.browser.BraveHelper;
import org.chromium.chrome.browser.BraveRewardsNativeWorker;
import org.chromium.chrome.browser.BraveSyncReflectionUtils;
import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.CrossPromotionalModalDialogFragment;
@@ -78,7 +79,6 @@ import org.chromium.chrome.browser.util.BraveReferrer;
import org.chromium.chrome.browser.util.PackageUtils;
import org.chromium.chrome.browser.widget.crypto.binance.BinanceAccountBalance;
import org.chromium.chrome.browser.widget.crypto.binance.BinanceWidgetManager;
import org.chromium.chrome.browser.BraveRewardsNativeWorker;
import org.chromium.components.bookmarks.BookmarkId;
import org.chromium.components.bookmarks.BookmarkType;
import org.chromium.components.embedder_support.util.UrlConstants;
@@ -98,8 +98,12 @@ public abstract class BraveActivity<C extends ChromeActivityComponent> extends C
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 BRAVE_REWARDS_SETTINGS_URL = "brave://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";
public static final String BRAVE_TERMS_PAGE =
"https://basicattentiontoken.org/user-terms-of-service/";
public static final String BRAVE_PRIVACY_POLICY = "https://brave.com/privacy/#rewards";
private static final String PREF_CLOSE_TABS_ON_EXIT = "close_tabs_on_exit";
public static final String OPEN_URL = "open_url";
@@ -215,8 +219,6 @@ public abstract class BraveActivity<C extends ChromeActivityComponent> extends C
public void finishNativeInitialization() {
super.finishNativeInitialization();
BraveRewardsNativeWorker.getInstance().StartProcess();
int appOpenCount = SharedPreferencesManager.getInstance().readInt(BravePreferenceKeys.BRAVE_APP_OPEN_COUNT);
SharedPreferencesManager.getInstance().writeInt(BravePreferenceKeys.BRAVE_APP_OPEN_COUNT, appOpenCount + 1);
@@ -93,8 +93,8 @@ public class RetentionNotificationPublisher extends BroadcastReceiver {
case RetentionNotificationUtil.DAY_35:
// Can't check for rewards code in background
if (braveActivity != null
&& (ChromeFeatureList.isEnabled(BraveFeatureList.BRAVE_REWARDS) && !UserPrefs.get(Profile.getLastUsedRegularProfile()).getBoolean(BravePref.ENABLED))
&& !BraveAdsNativeHelper.nativeIsBraveAdsEnabled(Profile.getLastUsedRegularProfile())) {
&& !BraveAdsNativeHelper.nativeIsBraveAdsEnabled(
Profile.getLastUsedRegularProfile())) {
createNotification(context, intent);
}
break;
@@ -156,9 +156,9 @@ public class NTPUtil {
&& ntpImage instanceof Wallpaper
&& !BraveAdsNativeHelper.nativeIsBraveAdsEnabled(Profile.getLastUsedRegularProfile())) {
return SponsoredImageUtil.BR_ON_ADS_OFF ;
} else if (!PackageUtils.isFirstInstall(context)
&& ntpImage instanceof Wallpaper
&& BraveAdsNativeHelper.nativeIsBraveAdsEnabled(Profile.getLastUsedRegularProfile()) ) {
} else if (ntpImage instanceof Wallpaper
&& BraveAdsNativeHelper.nativeIsBraveAdsEnabled(
Profile.getLastUsedRegularProfile())) {
return SponsoredImageUtil.BR_ON_ADS_ON;
}
}
@@ -170,11 +170,16 @@ public class NTPUtil {
nonDistruptiveBannerLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// clickOnBottomBanner(chromeActivity, ntpType, nonDistruptiveBannerLayout, sponsoredTab, newTabPageListener);
if (BraveActivity.getBraveActivity() != null) {
nonDistruptiveBannerLayout.setVisibility(View.GONE);
BraveRewardsHelper.setShowBraveRewardsOnboarding(true);
BraveActivity.getBraveActivity().openRewardsPanel();
if (BraveAdsNativeHelper.nativeIsBraveAdsEnabled(
Profile.getLastUsedRegularProfile())) {
clickOnBottomBanner(chromeActivity, ntpType, nonDistruptiveBannerLayout,
sponsoredTab, newTabPageListener);
} else {
if (BraveActivity.getBraveActivity() != null) {
nonDistruptiveBannerLayout.setVisibility(View.GONE);
BraveRewardsHelper.setShowBraveRewardsOnboardingModalOnce(true);
BraveActivity.getBraveActivity().openRewardsPanel();
}
}
}
});
@@ -194,7 +194,6 @@ public class OnboardingPrefManager {
public boolean showOnboardingForSkip(Context context) {
boolean shouldShow = PackageUtils.isFirstInstall(context)
&& !hasOnboardingShownForSkip()
&& (ChromeFeatureList.isEnabled(BraveFeatureList.BRAVE_REWARDS) && !UserPrefs.get(Profile.getLastUsedRegularProfile()).getBoolean(BravePref.ENABLED))
&& !BraveAdsNativeHelper.nativeIsBraveAdsEnabled(Profile.getLastUsedRegularProfile())
&& (getNextOnboardingDate() > 0 && System.currentTimeMillis() > getNextOnboardingDate());
return shouldShow;
@@ -7,6 +7,7 @@ package org.chromium.chrome.browser.toolbar.top;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -14,18 +15,28 @@ import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.util.AttributeSet;
import android.util.Pair;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.AppCompatImageView;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.ContextUtils;
@@ -37,10 +48,13 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.BraveAdsNativeHelper;
import org.chromium.chrome.browser.BraveFeatureList;
import org.chromium.chrome.browser.BraveRelaunchUtils;
import org.chromium.chrome.browser.BraveRewardsHelper;
import org.chromium.chrome.browser.BraveRewardsNativeWorker;
import org.chromium.chrome.browser.BraveRewardsObserver;
import org.chromium.chrome.browser.BraveRewardsPanelPopup;
import org.chromium.chrome.browser.app.BraveActivity;
import org.chromium.chrome.browser.brave_stats.BraveStatsUtil;
import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbar;
import org.chromium.chrome.browser.dialogs.BraveAdsSignupDialog;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
@@ -340,6 +354,15 @@ public abstract class BraveToolbarLayout extends ToolbarLayout implements OnClic
&& !tab.isIncognito()) {
mBraveRewardsNativeWorker.OnNotifyFrontTabUrlChanged(tab.getId(), tab.getUrlString());
}
if (tab.getUrlString() != null
&& (tab.getUrlString().equals(BraveActivity.REWARDS_SETTINGS_URL)
|| tab.getUrlString().equals(BraveActivity.BRAVE_REWARDS_SETTINGS_URL))
&& !BraveAdsNativeHelper.nativeIsBraveAdsEnabled(
Profile.getLastUsedRegularProfile())
&& BraveRewardsHelper.shouldShowBraveRewardsSettingsOnboardingModal()) {
showBraveRewardsOnboardingModal();
BraveRewardsHelper.setShowBraveRewardsSettingsOnboardingModal(false);
}
}
@Override
@@ -366,6 +389,112 @@ public abstract class BraveToolbarLayout extends ToolbarLayout implements OnClic
}
}
private void showBraveRewardsOnboardingModal() {
Context context = getContext();
final Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(false);
dialog.setContentView(R.layout.brave_rewards_onboarding_modal);
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
View braveRewardsOnboardingModalView =
dialog.findViewById(R.id.brave_rewards_onboarding_modal_layout);
braveRewardsOnboardingModalView.setBackgroundColor(
context.getResources().getColor(android.R.color.white));
braveRewardsOnboardingModalView.setVisibility(View.VISIBLE);
String tosText =
String.format(context.getResources().getString(R.string.brave_rewards_tos_text),
context.getResources().getString(R.string.terms_of_service),
context.getResources().getString(R.string.privacy_policy));
int termsOfServiceIndex =
tosText.indexOf(context.getResources().getString(R.string.terms_of_service));
Spanned tosTextSpanned = BraveRewardsHelper.spannedFromHtmlString(tosText);
SpannableString tosTextSS = new SpannableString(tosTextSpanned.toString());
ClickableSpan tosClickableSpan = new ClickableSpan() {
@Override
public void onClick(@NonNull View textView) {
CustomTabActivity.showInfoPage(context, BraveActivity.BRAVE_TERMS_PAGE);
}
@Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
};
tosTextSS.setSpan(tosClickableSpan, termsOfServiceIndex,
termsOfServiceIndex
+ context.getResources().getString(R.string.terms_of_service).length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tosTextSS.setSpan(new ForegroundColorSpan(context.getResources().getColor(
R.color.brave_rewards_modal_theme_color)),
termsOfServiceIndex,
termsOfServiceIndex
+ context.getResources().getString(R.string.terms_of_service).length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ClickableSpan privacyProtectionClickableSpan = new ClickableSpan() {
@Override
public void onClick(@NonNull View textView) {
CustomTabActivity.showInfoPage(context, BraveActivity.BRAVE_PRIVACY_POLICY);
}
@Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
};
int privacyPolicyIndex =
tosText.indexOf(context.getResources().getString(R.string.privacy_policy));
tosTextSS.setSpan(privacyProtectionClickableSpan, privacyPolicyIndex,
privacyPolicyIndex
+ context.getResources().getString(R.string.privacy_policy).length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tosTextSS.setSpan(new ForegroundColorSpan(context.getResources().getColor(
R.color.brave_rewards_modal_theme_color)),
privacyPolicyIndex,
privacyPolicyIndex
+ context.getResources().getString(R.string.privacy_policy).length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView tosAndPpText = braveRewardsOnboardingModalView.findViewById(R.id.tos_pp_text);
tosAndPpText.setMovementMethod(LinkMovementMethod.getInstance());
tosAndPpText.setText(tosTextSS);
TextView takeQuickTourButton =
braveRewardsOnboardingModalView.findViewById(R.id.take_quick_tour_button);
takeQuickTourButton.setOnClickListener((new View.OnClickListener() {
@Override
public void onClick(View v) {
BraveRewardsHelper.setShowBraveRewardsOnboardingOnce(true);
BraveActivity.getBraveActivity().openRewardsPanel();
dialog.dismiss();
}
}));
Button btnBraveRewards = braveRewardsOnboardingModalView.findViewById(R.id.btn_brave_rewards);
btnBraveRewards.setOnClickListener((new View.OnClickListener() {
@Override
public void onClick(View v) {
BraveAdsNativeHelper.nativeSetAdsEnabled(Profile.getLastUsedRegularProfile());
BraveRewardsNativeWorker.getInstance().SetAutoContributeEnabled(true);
dialog.dismiss();
}
}));
AppCompatImageView modalCloseButton =
braveRewardsOnboardingModalView.findViewById(R.id.modal_close);
modalCloseButton.setOnClickListener((new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
}));
dialog.show();
}
private void addSavedBandwidthToDb(long savings) {
new AsyncTask<Void>() {
@Override
@@ -465,7 +594,6 @@ public abstract class BraveToolbarLayout extends ToolbarLayout implements OnClic
private boolean checkForRewardsOnboarding() {
return PackageUtils.isFirstInstall(getContext())
&& (ChromeFeatureList.isEnabled(BraveFeatureList.BRAVE_REWARDS) && !UserPrefs.get(Profile.getLastUsedRegularProfile()).getBoolean(BravePref.ENABLED))
&& !BraveAdsNativeHelper.nativeIsBraveAdsEnabled(Profile.getLastUsedRegularProfile())
&& !OnboardingPrefManager.getInstance().isOnboardingShown();
}
@@ -691,34 +819,33 @@ public abstract class BraveToolbarLayout extends ToolbarLayout implements OnClic
@Override
public void OnNotificationsCount(int count) {
boolean rewardsEnabled = UserPrefs.get(Profile.getLastUsedRegularProfile()).getBoolean(BravePref.ENABLED);
if (mBraveRewardsNotificationsCount != null && rewardsEnabled) {
if (count != 0) {
String value = Integer.toString(count);
if (count > 99) {
mBraveRewardsNotificationsCount.setBackground(
getResources().getDrawable(R.drawable.brave_rewards_rectangle));
value = "99+";
} else {
mBraveRewardsNotificationsCount.setBackground(
getResources().getDrawable(R.drawable.brave_rewards_circle));
}
mBraveRewardsNotificationsCount.setText(value);
mBraveRewardsNotificationsCount.setVisibility(View.VISIBLE);
mIsNotificationPosted = true;
} else {
mBraveRewardsNotificationsCount.setText("");
mBraveRewardsNotificationsCount.setBackgroundResource(0);
mBraveRewardsNotificationsCount.setVisibility(View.INVISIBLE);
mIsNotificationPosted = false;
updateVerifiedPublisherMark();
if (mBraveRewardsNotificationsCount != null) {
if (count != 0) {
String value = Integer.toString(count);
if (count > 99) {
mBraveRewardsNotificationsCount.setBackground(
getResources().getDrawable(R.drawable.brave_rewards_rectangle));
value = "99+";
} else {
mBraveRewardsNotificationsCount.setBackground(
getResources().getDrawable(R.drawable.brave_rewards_circle));
}
mBraveRewardsNotificationsCount.setText(value);
mBraveRewardsNotificationsCount.setVisibility(View.VISIBLE);
mIsNotificationPosted = true;
} else {
mBraveRewardsNotificationsCount.setText("");
mBraveRewardsNotificationsCount.setBackgroundResource(0);
mBraveRewardsNotificationsCount.setVisibility(View.INVISIBLE);
mIsNotificationPosted = false;
updateVerifiedPublisherMark();
}
}
}
updateNotificationBadgeForNewInstall(rewardsEnabled);
if (!PackageUtils.isFirstInstall(getContext())
&& !OnboardingPrefManager.getInstance().isAdsAvailable()) {
mayShowBraveAdsOnboardingDialog();
updateNotificationBadgeForNewInstall();
if (!PackageUtils.isFirstInstall(getContext())
&& !OnboardingPrefManager.getInstance().isAdsAvailable()) {
mayShowBraveAdsOnboardingDialog();
}
if (checkForRewardsOnboarding()) {
@@ -731,19 +858,19 @@ public abstract class BraveToolbarLayout extends ToolbarLayout implements OnClic
}
}
private void updateNotificationBadgeForNewInstall(boolean rewardsEnabled) {
SharedPreferences sharedPref = ContextUtils.getAppSharedPreferences();
boolean shownBefore = sharedPref.getBoolean(BraveRewardsPanelPopup.PREF_WAS_TOOLBAR_BAT_LOGO_BUTTON_PRESSED, false);
boolean shouldShow =
mBraveRewardsNotificationsCount != null && !shownBefore && !rewardsEnabled;
mIsInitialNotificationPosted = shouldShow; // initial notification
private void updateNotificationBadgeForNewInstall() {
SharedPreferences sharedPref = ContextUtils.getAppSharedPreferences();
boolean shownBefore = sharedPref.getBoolean(
BraveRewardsPanelPopup.PREF_WAS_TOOLBAR_BAT_LOGO_BUTTON_PRESSED, false);
boolean shouldShow = mBraveRewardsNotificationsCount != null && !shownBefore;
mIsInitialNotificationPosted = shouldShow; // initial notification
if (!shouldShow) return;
if (!shouldShow) return;
mBraveRewardsNotificationsCount.setText("");
mBraveRewardsNotificationsCount.setBackground(
getResources().getDrawable(R.drawable.brave_rewards_circle));
mBraveRewardsNotificationsCount.setVisibility(View.VISIBLE);
mBraveRewardsNotificationsCount.setText("");
mBraveRewardsNotificationsCount.setBackground(
getResources().getDrawable(R.drawable.brave_rewards_circle));
mBraveRewardsNotificationsCount.setVisibility(View.VISIBLE);
}
@Override
@@ -5,6 +5,7 @@
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/brave_rewards_onboarding_modal_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="4dp"
@@ -3,16 +3,16 @@
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:background="@drawable/header">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="top|center"
android:background="@drawable/header"
tools:ignore="UselessParent">
<GridLayout
@@ -215,4 +215,4 @@
android:visibility="gone"/>
</RelativeLayout>
</FrameLayout>
</LinearLayout>
@@ -44,13 +44,10 @@ public class BraveAdsSignupDialog {
private static final long MOMENT_LATER = 2_500;
public static boolean shouldShowNewUserDialog(Context context) {
boolean shouldShow =
shouldShowOnboardingDialog()
&& PackageUtils.isFirstInstall(context)
&& !BraveAdsNativeHelper.nativeIsBraveAdsEnabled(Profile.getLastUsedRegularProfile())
&& !UserPrefs.get(Profile.getLastUsedRegularProfile()).getBoolean(BravePref.ENABLED)
&& hasElapsed24Hours(context)
&& ChromeFeatureList.isEnabled(BraveFeatureList.BRAVE_REWARDS);
boolean shouldShow = shouldShowOnboardingDialog() && PackageUtils.isFirstInstall(context)
&& !BraveAdsNativeHelper.nativeIsBraveAdsEnabled(
Profile.getLastUsedRegularProfile())
&& hasElapsed24Hours(context);
boolean shouldShowForViewCount = shouldShowForViewCount();
if (shouldShow) updateViewCount();
@@ -59,12 +56,9 @@ public class BraveAdsSignupDialog {
}
public static boolean shouldShowNewUserDialogIfRewardsIsSwitchedOff(Context context) {
boolean shouldShow =
shouldShowOnboardingDialog()
&& !PackageUtils.isFirstInstall(context)
&& !BraveAdsNativeHelper.nativeIsBraveAdsEnabled(Profile.getLastUsedRegularProfile())
&& !UserPrefs.get(Profile.getLastUsedRegularProfile()).getBoolean(BravePref.ENABLED)
&& ChromeFeatureList.isEnabled(BraveFeatureList.BRAVE_REWARDS);
boolean shouldShow = shouldShowOnboardingDialog() && !PackageUtils.isFirstInstall(context)
&& !BraveAdsNativeHelper.nativeIsBraveAdsEnabled(
Profile.getLastUsedRegularProfile());
boolean shouldShowForViewCount = shouldShowForViewCount();
if (shouldShow) updateViewCount();
@@ -73,13 +67,10 @@ public class BraveAdsSignupDialog {
}
public static boolean shouldShowExistingUserDialog(Context context) {
boolean shouldShow =
shouldShowOnboardingDialog()
&& !PackageUtils.isFirstInstall(context)
&& !BraveAdsNativeHelper.nativeIsBraveAdsEnabled(Profile.getLastUsedRegularProfile())
&& UserPrefs.get(Profile.getLastUsedRegularProfile()).getBoolean(BravePref.ENABLED)
&& BraveAdsNativeHelper.nativeIsLocaleValid(Profile.getLastUsedRegularProfile())
&& ChromeFeatureList.isEnabled(BraveFeatureList.BRAVE_REWARDS);
boolean shouldShow = shouldShowOnboardingDialog() && !PackageUtils.isFirstInstall(context)
&& !BraveAdsNativeHelper.nativeIsBraveAdsEnabled(
Profile.getLastUsedRegularProfile())
&& BraveAdsNativeHelper.nativeIsLocaleValid(Profile.getLastUsedRegularProfile());
boolean shouldShowForViewCount = shouldShowForViewCount();
if (shouldShow) updateViewCount();
@@ -273,13 +273,24 @@ void BraveRewardsNativeWorker::FetchGrants(JNIEnv* env,
}
}
void BraveRewardsNativeWorker::StartProcess(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
void BraveRewardsNativeWorker::StartProcess(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
if (brave_rewards_service_) {
brave_rewards_service_->StartProcess(base::DoNothing());
brave_rewards_service_->StartProcess(
base::BindOnce(&BraveRewardsNativeWorker::OnStartProcess,
base::Unretained(this), brave_rewards_service_));
}
}
void BraveRewardsNativeWorker::OnStartProcess(
brave_rewards::RewardsService* rewards_service,
const ledger::type::Result result) {
JNIEnv* env = base::android::AttachCurrentThread();
Java_BraveRewardsNativeWorker_OnStartProcess(
env, weak_java_brave_rewards_native_worker_.get(env));
}
void BraveRewardsNativeWorker::GetCurrentBalanceReport(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
if (brave_rewards_service_) {
@@ -250,9 +250,11 @@ class BraveRewardsNativeWorker : public brave_rewards::RewardsServiceObserver,
const base::android::JavaParamRef<jobject>& obj,
bool isAutoContributeEnabled);
void StartProcess(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
const base::android::JavaParamRef<jobject>& obj);
void OnStartProcess(brave_rewards::RewardsService* rewards_service,
const ledger::type::Result result);
private:
private:
std::string StdStrStrMapToJsonString(
const base::flat_map<std::string, std::string>& args);