From a5cf235b67fd5ad3f66fb51db111a8082c3048de Mon Sep 17 00:00:00 2001 From: Deep Date: Thu, 18 Nov 2021 04:53:14 -0500 Subject: [PATCH] ADd code for notifications for dormant users engagement --- android/brave_java_resources.gni | 4 + android/brave_java_sources.gni | 1 + .../DormantUsersEngagementDialogFragment.java | 142 +++++++ .../chrome/browser/app/BraveActivity.java | 68 ++++ .../RetentionNotificationPublisher.java | 30 +- .../retention/RetentionNotificationUtil.java | 41 ++ .../onboarding/OnboardingPrefManager.java | 22 ++ .../java/res/drawable/ic_brave_battery.xml | 282 ++++++++++++++ .../java/res/drawable/ic_brave_mobiledata.xml | 105 ++++++ android/java/res/drawable/ic_rocket.xml | 355 ++++++++++++++++++ ...agment_dormant_users_engagement_dialog.xml | 77 ++++ .../android/strings/android_brave_strings.grd | 4 +- 12 files changed, 1128 insertions(+), 3 deletions(-) create mode 100644 android/java/org/chromium/chrome/browser/DormantUsersEngagementDialogFragment.java create mode 100644 android/java/res/drawable/ic_brave_battery.xml create mode 100644 android/java/res/drawable/ic_brave_mobiledata.xml create mode 100644 android/java/res/drawable/ic_rocket.xml create mode 100644 android/java/res/layout/fragment_dormant_users_engagement_dialog.xml diff --git a/android/brave_java_resources.gni b/android/brave_java_resources.gni index 55d7ce530c4..908df59d9b3 100644 --- a/android/brave_java_resources.gni +++ b/android/brave_java_resources.gni @@ -585,7 +585,9 @@ brave_java_resources = [ "java/res/drawable/ic_bg_video_playback.xml", "java/res/drawable/ic_binance.xml", "java/res/drawable/ic_brave.xml", + "java/res/drawable/ic_brave_battery.xml", "java/res/drawable/ic_brave_logo.xml", + "java/res/drawable/ic_brave_mobiledata.xml", "java/res/drawable/ic_brave_vpn_graphic.xml", "java/res/drawable/ic_carat_down.xml", "java/res/drawable/ic_card_background.xml", @@ -638,6 +640,7 @@ brave_java_resources = [ "java/res/drawable/ic_rate.xml", "java/res/drawable/ic_refresh.xml", "java/res/drawable/ic_rewards.xml", + "java/res/drawable/ic_rocket.xml", "java/res/drawable/ic_safe.xml", "java/res/drawable/ic_search.xml", "java/res/drawable/ic_search_21dp.xml", @@ -811,6 +814,7 @@ brave_java_resources = [ "java/res/layout/fragment_cross_promotional_modal_dialog.xml", "java/res/layout/fragment_crypto_wallet_onboarding.xml", "java/res/layout/fragment_crypto_widget_bottom_sheet_dialog.xml", + "java/res/layout/fragment_dormant_users_engagement_dialog.xml", "java/res/layout/fragment_onboarding_v2.xml", "java/res/layout/fragment_portfolio.xml", "java/res/layout/fragment_qr_code_share.xml", diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index c972b394ce4..e18f8510f31 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -34,6 +34,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/BraveSyncWorker.java", "../../brave/android/java/org/chromium/chrome/browser/BraveUphold.java", "../../brave/android/java/org/chromium/chrome/browser/CrossPromotionalModalDialogFragment.java", + "../../brave/android/java/org/chromium/chrome/browser/DormantUsersEngagementDialogFragment.java", "../../brave/android/java/org/chromium/chrome/browser/InternetConnection.java", "../../brave/android/java/org/chromium/chrome/browser/QRCodeShareDialogFragment.java", "../../brave/android/java/org/chromium/chrome/browser/SetDefaultBrowserActivity.java", diff --git a/android/java/org/chromium/chrome/browser/DormantUsersEngagementDialogFragment.java b/android/java/org/chromium/chrome/browser/DormantUsersEngagementDialogFragment.java new file mode 100644 index 00000000000..64d5fec5d56 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/DormantUsersEngagementDialogFragment.java @@ -0,0 +1,142 @@ +/** + * Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +package org.chromium.chrome.browser; + +import android.content.DialogInterface; +import android.content.res.Configuration; +import android.os.Bundle; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.style.ForegroundColorSpan; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.fragment.app.DialogFragment; + +import org.chromium.base.ContextUtils; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.BraveRewardsHelper; +import org.chromium.chrome.browser.app.BraveActivity; +import org.chromium.chrome.browser.notifications.retention.RetentionNotificationUtil; +import org.chromium.chrome.browser.util.ConfigurationUtils; +import org.chromium.ui.base.DeviceFormFactor; + +import java.util.Arrays; +import java.util.List; + +public class DormantUsersEngagementDialogFragment extends DialogFragment { + private static final List mTexts = + Arrays.asList(ContextUtils.getApplicationContext().getResources().getString( + R.string.dormant_users_engagement_text_1), + ContextUtils.getApplicationContext().getResources().getString( + R.string.dormant_users_engagement_text_2), + ContextUtils.getApplicationContext().getResources().getString( + R.string.dormant_users_engagement_text_3)); + private static final List mImages = Arrays.asList( + R.drawable.ic_rocket, R.drawable.ic_brave_battery, R.drawable.ic_brave_mobiledata); + private String notificationType; + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + setDialogParams(); + } + + @Override + public void onResume() { + super.onResume(); + getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() { + @Override + public boolean onKey(android.content.DialogInterface dialog, int keyCode, + android.view.KeyEvent event) { + if ((keyCode == android.view.KeyEvent.KEYCODE_BACK)) { + dismiss(); + return true; + } else + return false; + } + }); + setDialogParams(); + } + + @Override + public View onCreateView( + LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate( + R.layout.fragment_dormant_users_engagement_dialog, container, false); + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + TextView engagementText = view.findViewById(R.id.dormant_users_engagement_text); + ImageView imageView = view.findViewById(R.id.image_view); + + if (notificationType.equals(RetentionNotificationUtil.DORMANT_USERS_DAY_14)) { + engagementText.setText(mTexts.get(0)); + imageView.setImageResource(mImages.get(0)); + } else if (notificationType.equals(RetentionNotificationUtil.DORMANT_USERS_DAY_25)) { + engagementText.setText(mTexts.get(1)); + imageView.setImageResource(mImages.get(1)); + } else if (notificationType.equals(RetentionNotificationUtil.DORMANT_USERS_DAY_40)) { + engagementText.setText(mTexts.get(2)); + imageView.setImageResource(mImages.get(2)); + } + + Button doneButton = view.findViewById(R.id.btn_done); + doneButton.setOnClickListener((new View.OnClickListener() { + @Override + public void onClick(View v) { + if (BraveActivity.getBraveActivity() != null) { + BraveActivity.getBraveActivity().handleBraveSetDefaultBrowserDialog(); + } + dismiss(); + } + })); + + Button notNowButton = view.findViewById(R.id.btn_not_now); + notNowButton.setOnClickListener((new View.OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + } + })); + } + + public void setNotificationType(String notificationType) { + this.notificationType = notificationType; + } + + private void setDialogParams() { + DisplayMetrics displayMetrics = new DisplayMetrics(); + getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + int mDeviceHeight = displayMetrics.heightPixels; + int mDeviceWidth = displayMetrics.widthPixels; + + WindowManager.LayoutParams params = getDialog().getWindow().getAttributes(); + boolean isTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(getActivity()); + boolean isLandscape = ConfigurationUtils.isLandscape(getActivity()); + if (isTablet) { + params.width = (int) (0.5 * mDeviceWidth); + } else { + if (isLandscape) { + params.width = (int) (0.5 * mDeviceWidth); + } else { + params.width = (int) (0.9 * mDeviceWidth); + } + } + params.height = LinearLayout.LayoutParams.WRAP_CONTENT; + getDialog().getWindow().setAttributes(params); + } +} diff --git a/android/java/org/chromium/chrome/browser/app/BraveActivity.java b/android/java/org/chromium/chrome/browser/app/BraveActivity.java index f2cc892367e..621d2406d6d 100644 --- a/android/java/org/chromium/chrome/browser/app/BraveActivity.java +++ b/android/java/org/chromium/chrome/browser/app/BraveActivity.java @@ -69,6 +69,7 @@ import org.chromium.chrome.browser.BraveSyncInformers; import org.chromium.chrome.browser.BraveSyncWorker; import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.CrossPromotionalModalDialogFragment; +import org.chromium.chrome.browser.DormantUsersEngagementDialogFragment; import org.chromium.chrome.browser.LaunchIntentDispatcher; import org.chromium.chrome.browser.SetDefaultBrowserActivity; import org.chromium.chrome.browser.bookmarks.BookmarkBridge; @@ -554,6 +555,58 @@ public abstract class BraveActivity extends C BraveVpnUtils.SUBSCRIPTION_PARAM_TEXT, getPackageName()); } } + + OnboardingPrefManager.getInstance().setDormantUsersNotificationTime( + RetentionNotificationUtil.DORMANT_USERS_DAY_14, setTimeInMillis(14 * 24 * 60)); + OnboardingPrefManager.getInstance().setDormantUsersNotificationTime( + RetentionNotificationUtil.DORMANT_USERS_DAY_25, setTimeInMillis(25 * 24 * 60)); + OnboardingPrefManager.getInstance().setDormantUsersNotificationTime( + RetentionNotificationUtil.DORMANT_USERS_DAY_40, setTimeInMillis(40 * 24 * 60)); + if (!OnboardingPrefManager.getInstance().isDormantUsersNotificationsStarted()) { + RetentionNotificationUtil.scheduleNotificationWithTime(this, + RetentionNotificationUtil.DORMANT_USERS_DAY_14, + OnboardingPrefManager.getInstance().getDormantUsersNotificationTime( + RetentionNotificationUtil.DORMANT_USERS_DAY_14)); + RetentionNotificationUtil.scheduleNotificationWithTime(this, + RetentionNotificationUtil.DORMANT_USERS_DAY_25, + OnboardingPrefManager.getInstance().getDormantUsersNotificationTime( + RetentionNotificationUtil.DORMANT_USERS_DAY_25)); + RetentionNotificationUtil.scheduleNotificationWithTime(this, + RetentionNotificationUtil.DORMANT_USERS_DAY_40, + OnboardingPrefManager.getInstance().getDormantUsersNotificationTime( + RetentionNotificationUtil.DORMANT_USERS_DAY_40)); + OnboardingPrefManager.getInstance().setDormantUsersNotificationsStarted(true); + } + } + + private long setTimeInMillis(int timeInMinutes) { + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(System.currentTimeMillis()); + calendar.add(Calendar.MINUTE, timeInMinutes); + + Date date = calendar.getTime(); + return date.getTime(); + } + + private void setDormantUsersPrefs() { + OnboardingPrefManager.getInstance().setDormantUsersNotificationTime( + RetentionNotificationUtil.DORMANT_USERS_DAY_14, setTimeInMillis(14 * 24 * 60)); + OnboardingPrefManager.getInstance().setDormantUsersNotificationTime( + RetentionNotificationUtil.DORMANT_USERS_DAY_25, setTimeInMillis(25 * 24 * 60)); + OnboardingPrefManager.getInstance().setDormantUsersNotificationTime( + RetentionNotificationUtil.DORMANT_USERS_DAY_40, setTimeInMillis(40 * 24 * 60)); + RetentionNotificationUtil.scheduleNotificationWithTime(this, + RetentionNotificationUtil.DORMANT_USERS_DAY_14, + OnboardingPrefManager.getInstance().getDormantUsersNotificationTime( + RetentionNotificationUtil.DORMANT_USERS_DAY_14)); + RetentionNotificationUtil.scheduleNotificationWithTime(this, + RetentionNotificationUtil.DORMANT_USERS_DAY_25, + OnboardingPrefManager.getInstance().getDormantUsersNotificationTime( + RetentionNotificationUtil.DORMANT_USERS_DAY_25)); + RetentionNotificationUtil.scheduleNotificationWithTime(this, + RetentionNotificationUtil.DORMANT_USERS_DAY_40, + OnboardingPrefManager.getInstance().getDormantUsersNotificationTime( + RetentionNotificationUtil.DORMANT_USERS_DAY_40)); } private final ConnectivityManager.NetworkCallback mNetworkCallback = @@ -662,6 +715,11 @@ public abstract class BraveActivity extends C case RetentionNotificationUtil.DAY_35: openRewardsPanel(); break; + case RetentionNotificationUtil.DORMANT_USERS_DAY_14: + case RetentionNotificationUtil.DORMANT_USERS_DAY_25: + case RetentionNotificationUtil.DORMANT_USERS_DAY_40: + showDormantUsersEngagementDialog(notificationType); + break; } } } @@ -906,6 +964,16 @@ public abstract class BraveActivity extends C mCrossPromotionalModalDialogFragment.show(getSupportFragmentManager(), "CrossPromotionalModalDialogFragment"); } + public void showDormantUsersEngagementDialog(String notificationType) { + DormantUsersEngagementDialogFragment dormantUsersEngagementDialogFragment = + new DormantUsersEngagementDialogFragment(); + dormantUsersEngagementDialogFragment.setCancelable(false); + dormantUsersEngagementDialogFragment.setNotificationType(notificationType); + dormantUsersEngagementDialogFragment.show( + getSupportFragmentManager(), "DormantUsersEngagementDialogFragment"); + setDormantUsersPrefs(); + } + static public ChromeTabbedActivity getChromeTabbedActivity() { for (Activity ref : ApplicationStatus.getRunningActivities()) { if (!(ref instanceof ChromeTabbedActivity)) continue; diff --git a/android/java/org/chromium/chrome/browser/notifications/retention/RetentionNotificationPublisher.java b/android/java/org/chromium/chrome/browser/notifications/retention/RetentionNotificationPublisher.java index 2a8555d212a..8169cb5df39 100644 --- a/android/java/org/chromium/chrome/browser/notifications/retention/RetentionNotificationPublisher.java +++ b/android/java/org/chromium/chrome/browser/notifications/retention/RetentionNotificationPublisher.java @@ -23,13 +23,13 @@ import org.chromium.chrome.browser.app.BraveActivity; import org.chromium.chrome.browser.brave_stats.BraveStatsUtil; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.notifications.BraveSetDefaultBrowserNotificationService; +import org.chromium.chrome.browser.notifications.retention.RetentionNotificationUtil; import org.chromium.chrome.browser.onboarding.OnboardingPrefManager; import org.chromium.chrome.browser.preferences.BravePref; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.embedder_support.util.UrlUtilities; -import org.chromium.components.user_prefs.UserPrefs; public class RetentionNotificationPublisher extends BroadcastReceiver { private static final String NOTIFICATION_CHANNEL_NAME = "brave"; @@ -69,6 +69,20 @@ public class RetentionNotificationPublisher extends BroadcastReceiver { case RetentionNotificationUtil.DAY_35: braveActivity.openRewardsPanel(); break; + case RetentionNotificationUtil.DORMANT_USERS_DAY_14: + case RetentionNotificationUtil.DORMANT_USERS_DAY_25: + case RetentionNotificationUtil.DORMANT_USERS_DAY_40: + if (System.currentTimeMillis() + > OnboardingPrefManager.getInstance().getDormantUsersNotificationTime( + notificationType)) { + braveActivity.showDormantUsersEngagementDialog(notificationType); + } else { + RetentionNotificationUtil.scheduleNotificationWithTime(context, + notificationType, + OnboardingPrefManager.getInstance().getDormantUsersNotificationTime( + notificationType)); + } + break; } } else { backgroundNotificationAction(context, intent); @@ -106,6 +120,20 @@ public class RetentionNotificationPublisher extends BroadcastReceiver { createNotification(context, intent); } break; + case RetentionNotificationUtil.DORMANT_USERS_DAY_14: + case RetentionNotificationUtil.DORMANT_USERS_DAY_25: + case RetentionNotificationUtil.DORMANT_USERS_DAY_40: + if (System.currentTimeMillis() + > OnboardingPrefManager.getInstance().getDormantUsersNotificationTime( + notificationType)) { + createNotification(context, intent); + } else { + RetentionNotificationUtil.scheduleNotificationWithTime(context, + notificationType, + OnboardingPrefManager.getInstance().getDormantUsersNotificationTime( + notificationType)); + } + break; } } } diff --git a/android/java/org/chromium/chrome/browser/notifications/retention/RetentionNotificationUtil.java b/android/java/org/chromium/chrome/browser/notifications/retention/RetentionNotificationUtil.java index b4bc75b77c0..cafc8566413 100644 --- a/android/java/org/chromium/chrome/browser/notifications/retention/RetentionNotificationUtil.java +++ b/android/java/org/chromium/chrome/browser/notifications/retention/RetentionNotificationUtil.java @@ -50,6 +50,10 @@ public class RetentionNotificationUtil { public static final String DEFAULT_BROWSER_2 = "default_browser_2"; public static final String DEFAULT_BROWSER_3 = "default_browser_3"; + public static final String DORMANT_USERS_DAY_14 = "dormant_users_days_14"; + public static final String DORMANT_USERS_DAY_25 = "dormant_users_days_25"; + public static final String DORMANT_USERS_DAY_40 = "dormant_users_days_40"; + private static Map mNotificationMap = new HashMap() { { put(HOUR_3, @@ -69,6 +73,21 @@ public class RetentionNotificationUtil { put(DEFAULT_BROWSER_1, new RetentionNotification(17, 48 * 60, BraveChannelDefinitions.ChannelId.BRAVE_BROWSER, BRAVE_BROWSER)); put(DEFAULT_BROWSER_2, new RetentionNotification(18, 6 * 24 * 60, BraveChannelDefinitions.ChannelId.BRAVE_BROWSER, BRAVE_BROWSER)); put(DEFAULT_BROWSER_3, new RetentionNotification(19, 20 * 24 * 60, BraveChannelDefinitions.ChannelId.BRAVE_BROWSER, BRAVE_BROWSER)); + put(DORMANT_USERS_DAY_14, + new RetentionNotification(20, 14 * 24 * 60, + BraveChannelDefinitions.ChannelId.BRAVE_BROWSER, + ContextUtils.getApplicationContext().getResources().getString( + R.string.dormant_users_engagement_notification_text_1))); + put(DORMANT_USERS_DAY_25, + new RetentionNotification(21, 25 * 24 * 60, + BraveChannelDefinitions.ChannelId.BRAVE_BROWSER, + ContextUtils.getApplicationContext().getResources().getString( + R.string.dormant_users_engagement_notification_text_2))); + put(DORMANT_USERS_DAY_40, + new RetentionNotification(22, 40 * 24 * 60, + BraveChannelDefinitions.ChannelId.BRAVE_BROWSER, + ContextUtils.getApplicationContext().getResources().getString( + R.string.dormant_users_engagement_notification_text_3))); } }; @@ -144,6 +163,15 @@ public class RetentionNotificationUtil { case DEFAULT_BROWSER_2: case DEFAULT_BROWSER_3: return context.getResources().getString(R.string.set_brave_as_your); + case DORMANT_USERS_DAY_14: + return context.getResources().getString( + R.string.dormant_users_engagement_notification_body_1); + case DORMANT_USERS_DAY_25: + return context.getResources().getString( + R.string.dormant_users_engagement_notification_body_2); + case DORMANT_USERS_DAY_40: + return context.getResources().getString( + R.string.dormant_users_engagement_notification_body_3); } return ""; } @@ -175,6 +203,19 @@ public class RetentionNotificationUtil { alarmManager.set(AlarmManager.RTC_WAKEUP, date.getTime(), pendingIntent); } + public static void scheduleNotificationWithTime( + Context context, String notificationType, long timeInMilliseconds) { + RetentionNotification retentionNotification = getNotificationObject(notificationType); + Intent notificationIntent = new Intent(context, RetentionNotificationPublisher.class); + notificationIntent.putExtra(NOTIFICATION_TYPE, notificationType); + PendingIntent pendingIntent = + PendingIntent.getBroadcast(context, retentionNotification.getNotificationId(), + notificationIntent, 0 | IntentUtils.getPendingIntentMutabilityFlag(true)); + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + assert alarmManager != null; + alarmManager.set(AlarmManager.RTC_WAKEUP, timeInMilliseconds, pendingIntent); + } + public static void scheduleNotificationForEverySunday(Context context, String notificationType) { RetentionNotification retentionNotification = getNotificationObject(notificationType); Calendar currentDate = Calendar.getInstance(); diff --git a/android/java/org/chromium/chrome/browser/onboarding/OnboardingPrefManager.java b/android/java/org/chromium/chrome/browser/onboarding/OnboardingPrefManager.java index da49170cff9..e32e368f647 100644 --- a/android/java/org/chromium/chrome/browser/onboarding/OnboardingPrefManager.java +++ b/android/java/org/chromium/chrome/browser/onboarding/OnboardingPrefManager.java @@ -51,6 +51,7 @@ public class OnboardingPrefManager { public static final String FROM_NOTIFICATION = "from_notification"; public static final String FROM_STATS = "from_stats"; public static final String ONE_TIME_NOTIFICATION = "one_time_notification"; + public static final String DORMANT_USERS_NOTIFICATION = "dormant_users_notification"; public static final String ADS_TRACKERS_NOTIFICATION = "ads_trackers_notification"; public static final String DATA_SAVED_NOTIFICATION = "data_saved_notification"; public static final String TIME_SAVED_NOTIFICATION = "time_saved_notification"; @@ -307,6 +308,27 @@ public class OnboardingPrefManager { sharedPreferencesEditor.apply(); } + public boolean isDormantUsersNotificationsStarted() { + return mSharedPreferences.getBoolean(DORMANT_USERS_NOTIFICATION, false); + } + + public void setDormantUsersNotificationsStarted(boolean isDormantUsersNotificationsStarted) { + SharedPreferences.Editor sharedPreferencesEditor = mSharedPreferences.edit(); + sharedPreferencesEditor.putBoolean( + DORMANT_USERS_NOTIFICATION, isDormantUsersNotificationsStarted); + sharedPreferencesEditor.apply(); + } + + public long getDormantUsersNotificationTime(String notificationType) { + return mSharedPreferences.getLong(notificationType, 0); + } + + public void setDormantUsersNotificationTime(String notificationType, long timeInMilliseconds) { + SharedPreferences.Editor sharedPreferencesEditor = mSharedPreferences.edit(); + sharedPreferencesEditor.putLong(notificationType, timeInMilliseconds); + sharedPreferencesEditor.apply(); + } + public boolean isAdsTrackersNotificationStarted() { return mSharedPreferences.getBoolean(ADS_TRACKERS_NOTIFICATION, false); } diff --git a/android/java/res/drawable/ic_brave_battery.xml b/android/java/res/drawable/ic_brave_battery.xml new file mode 100644 index 00000000000..cdd9916e32e --- /dev/null +++ b/android/java/res/drawable/ic_brave_battery.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/java/res/drawable/ic_brave_mobiledata.xml b/android/java/res/drawable/ic_brave_mobiledata.xml new file mode 100644 index 00000000000..3804d075e23 --- /dev/null +++ b/android/java/res/drawable/ic_brave_mobiledata.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/java/res/drawable/ic_rocket.xml b/android/java/res/drawable/ic_rocket.xml new file mode 100644 index 00000000000..0fb58470ee8 --- /dev/null +++ b/android/java/res/drawable/ic_rocket.xml @@ -0,0 +1,355 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/java/res/layout/fragment_dormant_users_engagement_dialog.xml b/android/java/res/layout/fragment_dormant_users_engagement_dialog.xml new file mode 100644 index 00000000000..a7c87410a16 --- /dev/null +++ b/android/java/res/layout/fragment_dormant_users_engagement_dialog.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + +