diff --git a/android/brave_java_resources.gni b/android/brave_java_resources.gni index 5e70082f72ff..d98bf31f14b9 100644 --- a/android/brave_java_resources.gni +++ b/android/brave_java_resources.gni @@ -90,6 +90,7 @@ brave_java_resources = [ "java/res/drawable-hdpi/search_engine_startpage.png", "java/res/drawable-hdpi/settings_desktop_mode.png", "java/res/drawable-hdpi/settings_play_yt_video_in_browser.png", + "java/res/drawable-hdpi/share_activity_background.png", "java/res/drawable-hdpi/share_icon.png", "java/res/drawable-hdpi/shortcut_incognito.png", "java/res/drawable-hdpi/slide_down.png", @@ -182,6 +183,7 @@ brave_java_resources = [ "java/res/drawable-mdpi/search_engine_startpage.png", "java/res/drawable-mdpi/settings_desktop_mode.png", "java/res/drawable-mdpi/settings_play_yt_video_in_browser.png", + "java/res/drawable-mdpi/share_activity_background.png", "java/res/drawable-mdpi/share_icon.png", "java/res/drawable-mdpi/shortcut_incognito.png", "java/res/drawable-mdpi/slide_down.png", @@ -325,6 +327,7 @@ brave_java_resources = [ "java/res/drawable-xhdpi/search_engine_startpage.png", "java/res/drawable-xhdpi/settings_desktop_mode.png", "java/res/drawable-xhdpi/settings_play_yt_video_in_browser.png", + "java/res/drawable-xhdpi/share_activity_background.png", "java/res/drawable-xhdpi/share_icon.png", "java/res/drawable-xhdpi/shortcut_incognito.png", "java/res/drawable-xhdpi/slide_down.png", @@ -418,6 +421,7 @@ brave_java_resources = [ "java/res/drawable-xxhdpi/search_engine_startpage.png", "java/res/drawable-xxhdpi/settings_desktop_mode.png", "java/res/drawable-xxhdpi/settings_play_yt_video_in_browser.png", + "java/res/drawable-xxhdpi/share_activity_background.png", "java/res/drawable-xxhdpi/share_icon.png", "java/res/drawable-xxhdpi/shortcut_incognito.png", "java/res/drawable-xxhdpi/slide_down.png", @@ -504,6 +508,7 @@ brave_java_resources = [ "java/res/drawable-xxxhdpi/rewards_settings.png", "java/res/drawable-xxxhdpi/settings_desktop_mode.png", "java/res/drawable-xxxhdpi/settings_play_yt_video_in_browser.png", + "java/res/drawable-xxxhdpi/share_activity_background.png", "java/res/drawable-xxxhdpi/share_icon.png", "java/res/drawable-xxxhdpi/shortcut_incognito.png", "java/res/drawable-xxxhdpi/slide_down.png", @@ -596,6 +601,8 @@ brave_java_resources = [ "java/res/drawable/ic_phone.xml", "java/res/drawable/ic_setbraveasdefault.xml", "java/res/drawable/ic_setbraveasdefault_dark.xml", + "java/res/drawable/ic_share.xml", + "java/res/drawable/ic_share_white.xml", "java/res/drawable/ic_shield_done_filled.xml", "java/res/drawable/ic_shield_done_filled_20dp.xml", "java/res/drawable/ic_sort.xml", @@ -693,6 +700,7 @@ brave_java_resources = [ "java/res/layout/brave_stats_bottom_sheet.xml", "java/res/layout/brave_stats_layout.xml", "java/res/layout/brave_stats_pager_layout.xml", + "java/res/layout/brave_stats_share_layout.xml", "java/res/layout/brave_sync_add_laptop.xml", "java/res/layout/brave_sync_add_mobile.xml", "java/res/layout/brave_sync_device.xml", diff --git a/android/java/org/chromium/chrome/browser/brave_stats/BraveStatsUtil.java b/android/java/org/chromium/chrome/browser/brave_stats/BraveStatsUtil.java index 19337ee49700..676840ba44f9 100644 --- a/android/java/org/chromium/chrome/browser/brave_stats/BraveStatsUtil.java +++ b/android/java/org/chromium/chrome/browser/brave_stats/BraveStatsUtil.java @@ -5,20 +5,39 @@ package org.chromium.chrome.browser.brave_stats; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ResolveInfo; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.net.Uri; +import android.provider.MediaStore; import android.util.Pair; +import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; + +import org.chromium.base.ContextUtils; +import org.chromium.base.Log; +import org.chromium.base.ThreadUtils; +import org.chromium.base.task.AsyncTask; import org.chromium.chrome.R; import org.chromium.chrome.browser.app.BraveActivity; import org.chromium.chrome.browser.brave_stats.BraveStatsBottomSheetDialogFragment; +import org.chromium.chrome.browser.local_database.DatabaseHelper; import org.chromium.chrome.browser.preferences.BravePref; import org.chromium.chrome.browser.preferences.BravePrefServiceBridge; import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.shields.BraveShieldsUtils; +import java.io.ByteArrayOutputStream; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.List; import java.util.Locale; public class BraveStatsUtil { @@ -95,7 +114,6 @@ public static String getCalculatedDate(String dateFormat, int days) { } public static void updateBraveStatsLayout(View view) { - Profile mProfile = Profile.getLastUsedRegularProfile(); TextView mAdsBlockedCountTextView = (TextView) view.findViewById(R.id.brave_stats_text_ads_count); TextView mDataSavedValueTextView = @@ -109,24 +127,109 @@ public static void updateBraveStatsLayout(View view) { TextView mEstTimeSavedCountTextTextView = (TextView) view.findViewById(R.id.brave_stats_text_time_count_text); + List> statsPairs = getStatsPairs(); + + mAdsBlockedCountTextView.setText(statsPairs.get(0).first); + mDataSavedValueTextView.setText(statsPairs.get(1).first); + mEstTimeSavedCountTextView.setText(statsPairs.get(2).first); + mAdsBlockedCountTextTextView.setText(statsPairs.get(0).second); + mDataSavedValueTextTextView.setText(statsPairs.get(1).second); + mEstTimeSavedCountTextTextView.setText(statsPairs.get(2).second); + } + + public static void updateBraveShareStatsLayoutAndShare(View view) { + TextView mAdsBlockedCountTextView = (TextView) view.findViewById(R.id.stats_trackers_no); + TextView mDataSavedValueTextView = (TextView) view.findViewById(R.id.stats_saved_data_no); + TextView mEstTimeSavedCountTextView = (TextView) view.findViewById(R.id.stats_timed_no); + + List> statsPairs = getStatsPairs(); + String trackersString = + String.format("%s %s", statsPairs.get(0).first, statsPairs.get(0).second); + String dataSavedString = + String.format("%s %s", statsPairs.get(1).first, statsPairs.get(1).second); + String timeSavedString = + String.format("%s %s", statsPairs.get(2).first, statsPairs.get(2).second); + + mAdsBlockedCountTextView.setText(trackersString); + mDataSavedValueTextView.setText(dataSavedString); + mEstTimeSavedCountTextView.setText(timeSavedString); + shareStatsAction(view); + } + + public static void shareStatsAction(View view) { + Context context = ContextUtils.getApplicationContext(); + Bitmap bmp = convertToBitmap(view); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + bmp.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); + String path = MediaStore.Images.Media.insertImage( + context.getContentResolver(), bmp, "tempimage", null); + Uri uri = Uri.parse(path); + + Intent sendIntent = new Intent(); + sendIntent.setAction(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, + context.getResources().getString(R.string.brave_stats_share_text)); + sendIntent.putExtra(Intent.EXTRA_STREAM, uri); + sendIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + sendIntent.setType("image/text"); + + Intent shareIntent = Intent.createChooser(sendIntent, " "); + shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(shareIntent); + } + + public static View getLayout(int layoutId) { + Context context = ContextUtils.getApplicationContext(); + LayoutInflater inflater = + (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View layout = inflater.inflate(layoutId, null); + + return layout; + } + + private static Bitmap convertToBitmap(View view) { + view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); + int totalHeight = view.getMeasuredHeight(); + int totalWidth = view.getMeasuredWidth(); + + Bitmap canvasBitmap = Bitmap.createBitmap(totalWidth, totalHeight, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(canvasBitmap); + view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); + view.draw(canvas); + + return canvasBitmap; + } + + private static List> getStatsPairs() { + List> statsPair = new ArrayList<>(); + Profile mProfile = Profile.getLastUsedRegularProfile(); long trackersBlockedCount = BravePrefServiceBridge.getInstance().getTrackersBlockedCount(mProfile); long adsBlockedCount = BravePrefServiceBridge.getInstance().getAdsBlockedCount(mProfile); + long adsTrackersBlockedCount = trackersBlockedCount + adsBlockedCount; long dataSaved = BravePrefServiceBridge.getInstance().getDataSaved(mProfile); long estimatedMillisecondsSaved = (trackersBlockedCount + adsBlockedCount) * MILLISECONDS_PER_ITEM; Pair adsTrackersPair = - getBraveStatsStringFormNumberPair(adsBlockedCount, false); + getBraveStatsStringFormNumberPair(adsTrackersBlockedCount, false); Pair dataSavedPair = getBraveStatsStringFormNumberPair(dataSaved, true); Pair timeSavedPair = getBraveStatsStringFromTime(estimatedMillisecondsSaved / 1000); + statsPair.add(adsTrackersPair); + statsPair.add(dataSavedPair); + statsPair.add(timeSavedPair); + + return statsPair; + } + + public static Pair getAdsTrackersBlocked() { + Profile mProfile = Profile.getLastUsedRegularProfile(); + long trackersBlockedCount = + BravePrefServiceBridge.getInstance().getTrackersBlockedCount(mProfile); + long adsBlockedCount = BravePrefServiceBridge.getInstance().getAdsBlockedCount(mProfile); + long adsTrackersBlockedCount = trackersBlockedCount + adsBlockedCount; - mAdsBlockedCountTextView.setText(adsTrackersPair.first); - mDataSavedValueTextView.setText(dataSavedPair.first); - mEstTimeSavedCountTextView.setText(timeSavedPair.first); - mAdsBlockedCountTextTextView.setText(adsTrackersPair.second); - mDataSavedValueTextTextView.setText(dataSavedPair.second); - mEstTimeSavedCountTextTextView.setText(timeSavedPair.second); + return getBraveStatsStringFormNumberPair(adsTrackersBlockedCount, false); } -} \ No newline at end of file +} diff --git a/android/java/org/chromium/chrome/browser/shields/BraveShieldsHandler.java b/android/java/org/chromium/chrome/browser/shields/BraveShieldsHandler.java index cd93a46b4c4c..dce705934548 100644 --- a/android/java/org/chromium/chrome/browser/shields/BraveShieldsHandler.java +++ b/android/java/org/chromium/chrome/browser/shields/BraveShieldsHandler.java @@ -13,19 +13,24 @@ import android.content.Context; import android.content.ContextWrapper; import android.graphics.Bitmap; +import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Typeface; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; +import android.net.Uri; import android.os.Build; +import android.provider.MediaStore; import android.text.SpannableString; import android.text.Spanned; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.text.style.ImageSpan; import android.text.style.StyleSpan; +import android.util.TypedValue; import android.view.ContextThemeWrapper; import android.view.Gravity; import android.view.LayoutInflater; @@ -39,6 +44,7 @@ import android.widget.Button; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; +import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListPopupWindow; @@ -49,6 +55,8 @@ import android.widget.Switch; import android.widget.TextView; +import androidx.core.widget.TextViewCompat; + import org.chromium.base.Log; import org.chromium.base.SysUtils; import org.chromium.base.task.AsyncTask; @@ -65,6 +73,9 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.util.ConfigurationUtils; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -278,11 +289,8 @@ public PopupWindow showPopupMenu(View anchorView) { } Rect bgPadding = new Rect(); - popupWindow.getBackground().getPadding(bgPadding); - int popupWidth = wrapper.getResources().getDimensionPixelSize(R.dimen.menu_width) + bgPadding.left + bgPadding.right; - popupWindow.setWidth(popupWidth); return popupWindow; @@ -310,7 +318,7 @@ public int getAdsBlockedCount(int tabId) { return blockersInfo.mAdsBlocked; } - public int getTackersBlockedCount(int tabId) { + public int getTrackersBlockedCount(int tabId) { if (!mTabsStat.containsKey(tabId)) { return 0; } @@ -397,23 +405,26 @@ private void setUpMainLayout() { Switch mShieldMainSwitch = mMainLayout.findViewById(R.id.site_switch); - ClickableSpan mClickableSpan = new ClickableSpan() { + ImageView helpImage = (ImageView) mMainLayout.findViewById(R.id.help); + ImageView shareImage = (ImageView) mMainLayout.findViewById(R.id.share); + + helpImage.setOnClickListener(new View.OnClickListener() { @Override - public void onClick(View widget) { + public void onClick(View v) { mMainLayout.setVisibility(View.GONE); mAboutLayout.setVisibility(View.VISIBLE); setUpAboutLayout(); } - }; + }); - TextView mSiteBlockText = mMainLayout.findViewById(R.id.site_block_text); - mSiteBlockText.setMovementMethod(LinkMovementMethod.getInstance()); - String mBlockText = mContext.getResources().getString(R.string.ads_and_other_things_blocked) + " "; - SpannableString mSpannableString = new SpannableString(mBlockText); - ImageSpan mImageSpan = new ImageSpan(mContext, R.drawable.ic_help); - mSpannableString.setSpan(mImageSpan, mBlockText.length() - 1, mBlockText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - mSpannableString.setSpan(mClickableSpan, mSpannableString.getSpanStart(mImageSpan), mSpannableString.getSpanEnd(mImageSpan), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - mSiteBlockText.setText(mSpannableString); + shareImage.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mMainLayout.setVisibility(View.GONE); + View shareStatsLayout = BraveStatsUtil.getLayout(R.layout.brave_stats_share_layout); + BraveStatsUtil.updateBraveShareStatsLayoutAndShare(shareStatsLayout); + } + }); mToggleIcon.setColorFilter(mContext.getResources().getColor(R.color.shield_toggle_button_tint)); mToggleLayout.setOnClickListener(new View.OnClickListener() { @@ -928,4 +939,4 @@ public void onClick(View view) { hideBraveShieldsMenu(); } }; -} \ No newline at end of file +} diff --git a/android/java/org/chromium/chrome/browser/shields/BraveShieldsUtils.java b/android/java/org/chromium/chrome/browser/shields/BraveShieldsUtils.java index d62a0571245e..919324635a7e 100644 --- a/android/java/org/chromium/chrome/browser/shields/BraveShieldsUtils.java +++ b/android/java/org/chromium/chrome/browser/shields/BraveShieldsUtils.java @@ -39,12 +39,36 @@ public class BraveShieldsUtils { "shields_ads_tracker_blocked_tooltip"; public static final String PREF_SHIELDS_HTTPS_UPGRADE_TOOLTIP = "shields_https_upgrade_tooltip"; + public static final String PREF_SHARE_SHIELDS_TOOLTIP = "share_shields_tooltip"; + public static final String PREF_ADS_TRACKERS_BLOCKED_NO = "ads_trackers_blocked_no"; + public static final String PREF_DATA_SAVED_NO = "data_saved_no"; + public static final String PREF_TIME_SAVED_NO = "time_saved_no"; + + public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER1 = "share_shields_tooltip_tier1"; + public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER2 = "share_shields_tooltip_tier2"; + public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER3 = "share_shields_tooltip_tier3"; + public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER4 = "share_shields_tooltip_tier4"; + public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER5 = "share_shields_tooltip_tier5"; + public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER6 = "share_shields_tooltip_tier6"; + public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER7 = "share_shields_tooltip_tier7"; + public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER8 = "share_shields_tooltip_tier8"; + public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER9 = "share_shields_tooltip_tier9"; public static final List videoSitesList = Arrays.asList("youtube.com", "vimeo.com", "twitch.tv"); public static final List videoSitesListJp = Arrays.asList("nicovideo.jp", "tiktok.com", "instagram.com"); + public static final int BRAVE_BLOCKED_TIER1 = 1000; + public static final int BRAVE_BLOCKED_TIER2 = 5000; + public static final int BRAVE_BLOCKED_TIER3 = 10000; + public static final int BRAVE_BLOCKED_TIER4 = 25000; + public static final int BRAVE_BLOCKED_TIER5 = 75000; + public static final int BRAVE_BLOCKED_TIER6 = 100000; + public static final int BRAVE_BLOCKED_TIER7 = 250000; + public static final int BRAVE_BLOCKED_TIER8 = 500000; + public static final int BRAVE_BLOCKED_TIER9 = 1000000; + public static boolean isTooltipShown; public interface BraveShieldsCallback { @@ -134,4 +158,4 @@ private static void sendBraveShieldsFeedback(String domain) { if (urlConnection != null) urlConnection.disconnect(); } } -} \ No newline at end of file +} diff --git a/android/java/org/chromium/chrome/browser/shields/ShieldsTooltipEnum.java b/android/java/org/chromium/chrome/browser/shields/ShieldsTooltipEnum.java index 12cf3bd3d470..093f0c1e6ad0 100644 --- a/android/java/org/chromium/chrome/browser/shields/ShieldsTooltipEnum.java +++ b/android/java/org/chromium/chrome/browser/shields/ShieldsTooltipEnum.java @@ -25,7 +25,43 @@ public enum ShieldsTooltipEnum { R.color.shields_tooltip_arrow_color_2, R.drawable.shields_tooltip_background_2), BAP_DEPRECATION_TOOLTIP(ShieldsTooltipEnumConstants.BAP_DEPRECATION_TOOLTIP, R.string.rewards_tooltip_title, R.string.rewards_tooltip_text, - R.color.rewards_tooltip_arrow_color, R.drawable.rewards_tooltip_background); + R.color.rewards_tooltip_arrow_color, R.drawable.rewards_tooltip_background), + BRAVE_SHARE_STATS_TIER1_TOOLTIP(ShieldsTooltipEnumConstants.BRAVE_SHARE_STATS_TIER1_TOOLTIP, + R.string.brave_stats_share_tooltip_tier1_title, + R.string.brave_stats_share_tooltip_special_text, R.color.shields_tooltip_arrow_color_2, + R.drawable.shields_tooltip_background_2), + BRAVE_SHARE_STATS_TIER2_TOOLTIP(ShieldsTooltipEnumConstants.BRAVE_SHARE_STATS_TIER2_TOOLTIP, + R.string.brave_stats_share_tooltip_tier2_title, + R.string.brave_stats_share_tooltip_exclusive_text, + R.color.shields_tooltip_arrow_color_2, R.drawable.shields_tooltip_background_2), + BRAVE_SHARE_STATS_TIER3_TOOLTIP(ShieldsTooltipEnumConstants.BRAVE_SHARE_STATS_TIER3_TOOLTIP, + R.string.brave_stats_share_tooltip_tier3_title, + R.string.brave_stats_share_tooltip_exclusive_text, + R.color.shields_tooltip_arrow_color_2, R.drawable.shields_tooltip_background_2), + BRAVE_SHARE_STATS_TIER4_TOOLTIP(ShieldsTooltipEnumConstants.BRAVE_SHARE_STATS_TIER4_TOOLTIP, + R.string.brave_stats_share_tooltip_tier4_title, + R.string.brave_stats_share_tooltip_exclusive_text, + R.color.shields_tooltip_arrow_color_2, R.drawable.shields_tooltip_background_2), + BRAVE_SHARE_STATS_TIER5_TOOLTIP(ShieldsTooltipEnumConstants.BRAVE_SHARE_STATS_TIER5_TOOLTIP, + R.string.brave_stats_share_tooltip_tier5_title, + R.string.brave_stats_share_tooltip_exclusive_text, + R.color.shields_tooltip_arrow_color_2, R.drawable.shields_tooltip_background_2), + BRAVE_SHARE_STATS_TIER6_TOOLTIP(ShieldsTooltipEnumConstants.BRAVE_SHARE_STATS_TIER6_TOOLTIP, + R.string.brave_stats_share_tooltip_tier6_title, + R.string.brave_stats_share_tooltip_pro_text, R.color.shields_tooltip_arrow_color_2, + R.drawable.shields_tooltip_background_2), + BRAVE_SHARE_STATS_TIER7_TOOLTIP(ShieldsTooltipEnumConstants.BRAVE_SHARE_STATS_TIER7_TOOLTIP, + R.string.brave_stats_share_tooltip_tier7_title, + R.string.brave_stats_share_tooltip_master_text, R.color.shields_tooltip_arrow_color_2, + R.drawable.shields_tooltip_background_2), + BRAVE_SHARE_STATS_TIER8_TOOLTIP(ShieldsTooltipEnumConstants.BRAVE_SHARE_STATS_TIER8_TOOLTIP, + R.string.brave_stats_share_tooltip_tier8_title, + R.string.brave_stats_share_tooltip_grandmaster_text, + R.color.shields_tooltip_arrow_color_2, R.drawable.shields_tooltip_background_2), + BRAVE_SHARE_STATS_TIER9_TOOLTIP(ShieldsTooltipEnumConstants.BRAVE_SHARE_STATS_TIER9_TOOLTIP, + R.string.brave_stats_share_tooltip_tier9_title, + R.string.brave_stats_share_tooltip_legendary_text, + R.color.shields_tooltip_arrow_color_2, R.drawable.shields_tooltip_background_2); private int id; private int title; @@ -67,5 +103,14 @@ interface ShieldsTooltipEnumConstants { static final int ADS_TRACKER_BLOCKED_TOOLTIP = 2; static final int HTTPS_UPGRADE_TOOLTIP = 3; static final int BAP_DEPRECATION_TOOLTIP = 4; + static final int BRAVE_SHARE_STATS_TIER1_TOOLTIP = 5; + static final int BRAVE_SHARE_STATS_TIER2_TOOLTIP = 6; + static final int BRAVE_SHARE_STATS_TIER3_TOOLTIP = 7; + static final int BRAVE_SHARE_STATS_TIER4_TOOLTIP = 8; + static final int BRAVE_SHARE_STATS_TIER5_TOOLTIP = 9; + static final int BRAVE_SHARE_STATS_TIER6_TOOLTIP = 10; + static final int BRAVE_SHARE_STATS_TIER7_TOOLTIP = 11; + static final int BRAVE_SHARE_STATS_TIER8_TOOLTIP = 12; + static final int BRAVE_SHARE_STATS_TIER9_TOOLTIP = 13; } } diff --git a/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayout.java b/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayout.java index 29135a955329..0121c831752f 100644 --- a/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayout.java +++ b/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayout.java @@ -120,6 +120,7 @@ import java.net.URL; import java.util.Calendar; import java.util.Date; +import java.util.EnumSet; import java.util.List; import java.util.Locale; @@ -422,7 +423,7 @@ public void didSelectTab(Tab tab, @TabSelectionType int type, int lastId) { private void checkForTooltip(Tab tab) { if (!BraveShieldsUtils.isTooltipShown) { if (!BraveShieldsUtils.hasShieldsTooltipShown(BraveShieldsUtils.PREF_SHIELDS_TOOLTIP) - && mBraveShieldsHandler.getTackersBlockedCount(tab.getId()) + && mBraveShieldsHandler.getTrackersBlockedCount(tab.getId()) + mBraveShieldsHandler.getAdsBlockedCount(tab.getId()) > 0) { showTooltip(ShieldsTooltipEnum.ONE_TIME_ADS_TRACKER_BLOCKED_TOOLTIP, @@ -434,7 +435,7 @@ && shouldShowVideoTooltip(tab.getUrlString())) { BraveShieldsUtils.PREF_SHIELDS_VIDEO_ADS_BLOCKED_TOOLTIP); } else if (!BraveShieldsUtils.hasShieldsTooltipShown( BraveShieldsUtils.PREF_SHIELDS_ADS_TRACKER_BLOCKED_TOOLTIP) - && mBraveShieldsHandler.getTackersBlockedCount(tab.getId()) + && mBraveShieldsHandler.getTrackersBlockedCount(tab.getId()) + mBraveShieldsHandler.getAdsBlockedCount(tab.getId()) > 10) { showTooltip(ShieldsTooltipEnum.ADS_TRACKER_BLOCKED_TOOLTIP, @@ -444,6 +445,82 @@ && shouldShowVideoTooltip(tab.getUrlString())) { && mBraveShieldsHandler.getHttpsUpgradeCount(tab.getId()) > 0) { showTooltip(ShieldsTooltipEnum.HTTPS_UPGRADE_TOOLTIP, BraveShieldsUtils.PREF_SHIELDS_HTTPS_UPGRADE_TOOLTIP); + } else if (!BraveShieldsUtils.hasShieldsTooltipShown( + BraveShieldsUtils.PREF_SHIELDS_HTTPS_UPGRADE_TOOLTIP) + && mBraveShieldsHandler.getHttpsUpgradeCount(tab.getId()) > 0) { + showTooltip(ShieldsTooltipEnum.HTTPS_UPGRADE_TOOLTIP, + BraveShieldsUtils.PREF_SHIELDS_HTTPS_UPGRADE_TOOLTIP); + } else { + int trackersPlusAdsBlocked = + mBraveShieldsHandler.getTrackersBlockedCount(tab.getId()) + + mBraveShieldsHandler.getAdsBlockedCount(tab.getId()); + chooseStatsShareTier(tab, trackersPlusAdsBlocked); + } + } + } + + private void chooseStatsShareTier(Tab tab, int trackersPlusAdsBlocked) { + String countryCode = Locale.getDefault().getCountry(); + // the tooltip for stats sharing is shown only for Japan + if (!countryCode.equals(JAPAN_COUNTRY_CODE)) { + return; + } + int totalBlocked = Integer.parseInt(BraveStatsUtil.getAdsTrackersBlocked().first); + // show after 20 blockers in the current session + if (trackersPlusAdsBlocked > 20) { + if (!BraveShieldsUtils.hasShieldsTooltipShown( + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER1) + && (totalBlocked >= BraveShieldsUtils.BRAVE_BLOCKED_TIER1 + && totalBlocked < BraveShieldsUtils.BRAVE_BLOCKED_TIER2)) { + showTooltip(ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER1_TOOLTIP, + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER1); + } else if (!BraveShieldsUtils.hasShieldsTooltipShown( + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER2) + && (totalBlocked >= BraveShieldsUtils.BRAVE_BLOCKED_TIER2 + && totalBlocked < BraveShieldsUtils.BRAVE_BLOCKED_TIER3)) { + showTooltip(ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER2_TOOLTIP, + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER2); + } else if (!BraveShieldsUtils.hasShieldsTooltipShown( + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER3) + && (totalBlocked >= BraveShieldsUtils.BRAVE_BLOCKED_TIER3 + && totalBlocked < BraveShieldsUtils.BRAVE_BLOCKED_TIER4)) { + showTooltip(ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER3_TOOLTIP, + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER3); + } else if (!BraveShieldsUtils.hasShieldsTooltipShown( + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER4) + && (totalBlocked >= BraveShieldsUtils.BRAVE_BLOCKED_TIER4 + && totalBlocked < BraveShieldsUtils.BRAVE_BLOCKED_TIER5)) { + showTooltip(ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER4_TOOLTIP, + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER4); + } else if (!BraveShieldsUtils.hasShieldsTooltipShown( + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER5) + && (totalBlocked >= BraveShieldsUtils.BRAVE_BLOCKED_TIER5 + && totalBlocked < BraveShieldsUtils.BRAVE_BLOCKED_TIER6)) { + showTooltip(ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER5_TOOLTIP, + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER5); + } else if (!BraveShieldsUtils.hasShieldsTooltipShown( + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER6) + && (totalBlocked >= BraveShieldsUtils.BRAVE_BLOCKED_TIER6 + && totalBlocked < BraveShieldsUtils.BRAVE_BLOCKED_TIER7)) { + showTooltip(ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER6_TOOLTIP, + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER6); + } else if (!BraveShieldsUtils.hasShieldsTooltipShown( + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER7) + && (totalBlocked >= BraveShieldsUtils.BRAVE_BLOCKED_TIER7 + && totalBlocked < BraveShieldsUtils.BRAVE_BLOCKED_TIER8)) { + showTooltip(ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER7_TOOLTIP, + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER7); + } else if (!BraveShieldsUtils.hasShieldsTooltipShown( + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER8) + && (totalBlocked >= BraveShieldsUtils.BRAVE_BLOCKED_TIER8 + && totalBlocked < BraveShieldsUtils.BRAVE_BLOCKED_TIER9)) { + showTooltip(ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER8_TOOLTIP, + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER8); + } else if (!BraveShieldsUtils.hasShieldsTooltipShown( + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER9) + && (totalBlocked >= BraveShieldsUtils.BRAVE_BLOCKED_TIER9)) { + showTooltip(ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER9_TOOLTIP, + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER9); } } } @@ -471,6 +548,18 @@ private boolean shouldShowVideoTooltip(String tabUrl) { } } + private EnumSet getStatsSharingEnums() { + return EnumSet.of(ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER1_TOOLTIP, + ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER2_TOOLTIP, + ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER3_TOOLTIP, + ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER4_TOOLTIP, + ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER5_TOOLTIP, + ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER6_TOOLTIP, + ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER7_TOOLTIP, + ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER8_TOOLTIP, + ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER9_TOOLTIP); + } + private void showTooltip(ShieldsTooltipEnum shieldsTooltipEnum, String tooltipPref) { mShieldsPopupWindowTooltip = new PopupWindowTooltip.Builder(getContext()) .anchorView(mBraveShieldsButton) @@ -496,6 +585,29 @@ public void onClick(View view) { showShieldsMenu(mBraveShieldsButton); } }); + } else if (getStatsSharingEnums().contains(shieldsTooltipEnum)) { + Button btnTooltip = mShieldsPopupWindowTooltip.findViewById(R.id.btn_tooltip); + + SpannableStringBuilder shareStringBuilder = new SpannableStringBuilder(); + shareStringBuilder + .append(getContext().getResources().getString( + R.string.brave_stats_share_button)) + .append(" "); + shareStringBuilder.setSpan(new ImageSpan(getContext(), R.drawable.ic_share_white), + shareStringBuilder.length() - 1, shareStringBuilder.length(), 0); + btnTooltip.setText(shareStringBuilder, TextView.BufferType.SPANNABLE); + + btnTooltip.setVisibility(View.VISIBLE); + + btnTooltip.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + dismissShieldsTooltip(); + View shareStatsLayout = + BraveStatsUtil.getLayout(R.layout.brave_stats_share_layout); + BraveStatsUtil.updateBraveShareStatsLayoutAndShare(shareStatsLayout); + } + }); } TextView tooltipTitle = mShieldsPopupWindowTooltip.findViewById(R.id.txt_tooltip_title); diff --git a/android/java/res/drawable-hdpi/share_activity_background.png b/android/java/res/drawable-hdpi/share_activity_background.png new file mode 100644 index 000000000000..dd144ebe7331 Binary files /dev/null and b/android/java/res/drawable-hdpi/share_activity_background.png differ diff --git a/android/java/res/drawable-mdpi/share_activity_background.png b/android/java/res/drawable-mdpi/share_activity_background.png new file mode 100644 index 000000000000..a0071f153bcd Binary files /dev/null and b/android/java/res/drawable-mdpi/share_activity_background.png differ diff --git a/android/java/res/drawable-xhdpi/share_activity_background.png b/android/java/res/drawable-xhdpi/share_activity_background.png new file mode 100644 index 000000000000..3f6681064382 Binary files /dev/null and b/android/java/res/drawable-xhdpi/share_activity_background.png differ diff --git a/android/java/res/drawable-xxhdpi/share_activity_background.png b/android/java/res/drawable-xxhdpi/share_activity_background.png new file mode 100644 index 000000000000..5a424e18cb91 Binary files /dev/null and b/android/java/res/drawable-xxhdpi/share_activity_background.png differ diff --git a/android/java/res/drawable-xxxhdpi/share_activity_background.png b/android/java/res/drawable-xxxhdpi/share_activity_background.png new file mode 100644 index 000000000000..eee3850a22de Binary files /dev/null and b/android/java/res/drawable-xxxhdpi/share_activity_background.png differ diff --git a/android/java/res/drawable/ic_help.xml b/android/java/res/drawable/ic_help.xml index 6455460b09b5..0821a53f4d70 100644 --- a/android/java/res/drawable/ic_help.xml +++ b/android/java/res/drawable/ic_help.xml @@ -1,5 +1,5 @@ - + diff --git a/android/java/res/drawable/ic_share.xml b/android/java/res/drawable/ic_share.xml new file mode 100644 index 000000000000..1d65dc040804 --- /dev/null +++ b/android/java/res/drawable/ic_share.xml @@ -0,0 +1,5 @@ + + + diff --git a/android/java/res/drawable/ic_share_white.xml b/android/java/res/drawable/ic_share_white.xml new file mode 100644 index 000000000000..b2810ef081f7 --- /dev/null +++ b/android/java/res/drawable/ic_share_white.xml @@ -0,0 +1,5 @@ + + + diff --git a/android/java/res/layout/brave_ads_custom_notification.xml b/android/java/res/layout/brave_ads_custom_notification.xml index 560cdc2052bf..531074d0f707 100644 --- a/android/java/res/layout/brave_ads_custom_notification.xml +++ b/android/java/res/layout/brave_ads_custom_notification.xml @@ -65,6 +65,7 @@ android:paddingEnd="2dp" android:paddingStart="13dp" android:layout_marginBottom="7dp" - android:textSize="11sp" /> + android:textSize="11sp" + tools:ignore="SmallSp" /> diff --git a/android/java/res/layout/brave_shields_main_layout.xml b/android/java/res/layout/brave_shields_main_layout.xml index a6337469f09e..dec437a5e8fb 100644 --- a/android/java/res/layout/brave_shields_main_layout.xml +++ b/android/java/res/layout/brave_shields_main_layout.xml @@ -7,6 +7,7 @@ @@ -111,30 +112,56 @@ android:id="@+id/site_block_layout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="center_horizontal" + android:gravity="center_vertical" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:layout_marginStart="16dp" + android:weightSum="4" android:orientation="horizontal"> + + + + - \ No newline at end of file + diff --git a/android/java/res/layout/brave_stats_share_layout.xml b/android/java/res/layout/brave_stats_share_layout.xml new file mode 100644 index 000000000000..34d9c3a5705a --- /dev/null +++ b/android/java/res/layout/brave_stats_share_layout.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/java/res/layout/brave_toolbar.xml b/android/java/res/layout/brave_toolbar.xml index 802973b7f6fd..a91c82ea017f 100644 --- a/android/java/res/layout/brave_toolbar.xml +++ b/android/java/res/layout/brave_toolbar.xml @@ -6,6 +6,7 @@ @@ -94,7 +95,8 @@ android:visibility="gone" android:textColor="#ffffff" android:background="@drawable/brave_rewards_circle" - android:textSize="9sp" /> + android:textSize="9sp" + tools:ignore="SmallSp" /> #335DB5FC #5DB5FC @android:color/white + #A1A5E6 + @android:color/white + @android:color/white + @color/onboarding_indicator_selected_color #DADCE8 #DADCE8 diff --git a/browser/ui/android/strings/android_brave_strings.grd b/browser/ui/android/strings/android_brave_strings.grd index e3ebfa3c4876..70c05afbf0cb 100644 --- a/browser/ui/android/strings/android_brave_strings.grd +++ b/browser/ui/android/strings/android_brave_strings.grd @@ -221,7 +221,7 @@ This file contains all "about" strings. It is set to NOT be translated, in tran This anonymous info only lets Brave estimate the overall usage of certain features. - Data\nSaved + Est. Data\nSaved Est. Time\nSaved @@ -1027,6 +1027,9 @@ until they verify, or until 90 days have passed. Allow all fingerprinting + Ads and other creepy things blocked + + Trackers, ads, and\nmore blocked @@ -1107,6 +1110,57 @@ until they verify, or until 90 days have passed. If available, Brave upgrades you to a secure connection automatically. + + Share the news + + + Every day I save data by browsing the web with Brave. + + + 1000 trackers & ads blocked! + + + 5000 trackers & ads blocked! + + + 10,000 trackers & ads blocked! + + + 25,000 trackers & ads blocked! + + + 75,000 trackers & ads blocked! + + + 100,000 trackers & ads blocked! + + + 250,000 trackers & ads blocked! + + + 500,000 trackers & ads blocked! + + + 1,000,000 trackers & ads blocked! + + + Congratulations, you're pretty special. + + + Congratulations. You’re part of an exclusive club. + + + Congratulations. You joined the pros. + + + Congratulations. You’ve become a master. + + + Congratulations. You’ve become a Grand Master. + + + Congratulations. You are legendary. + Brave works everywhere