diff --git a/android/java/org/chromium/chrome/browser/app/BraveActivity.java b/android/java/org/chromium/chrome/browser/app/BraveActivity.java index b0fdcb72534..c0b2ba5887c 100644 --- a/android/java/org/chromium/chrome/browser/app/BraveActivity.java +++ b/android/java/org/chromium/chrome/browser/app/BraveActivity.java @@ -24,6 +24,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; @@ -811,6 +812,17 @@ public abstract class BraveActivity super.onActivityResult(requestCode, resultCode, data); } + @Override + public void onRequestPermissionsResult( + int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + if (requestCode == BraveStatsUtil.SHARE_STATS_WRITE_EXTERNAL_STORAGE_PERM + && grantResults.length != 0 + && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + BraveStatsUtil.shareStats(R.layout.brave_stats_share_layout); + } + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + /** * Disable background ads on Android. Issue #8641. */ 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 676840ba44f..cb816510e40 100644 --- a/android/java/org/chromium/chrome/browser/brave_stats/BraveStatsUtil.java +++ b/android/java/org/chromium/chrome/browser/brave_stats/BraveStatsUtil.java @@ -5,12 +5,16 @@ package org.chromium.chrome.browser.brave_stats; +import android.Manifest; +import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.graphics.Bitmap; import android.graphics.Canvas; import android.net.Uri; +import android.os.Build; import android.provider.MediaStore; import android.util.Pair; import android.view.LayoutInflater; @@ -18,6 +22,7 @@ import android.view.View; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; import org.chromium.base.ContextUtils; import org.chromium.base.Log; @@ -42,6 +47,7 @@ import java.util.Locale; public class BraveStatsUtil { public static final short MILLISECONDS_PER_ITEM = 50; + public static final int SHARE_STATS_WRITE_EXTERNAL_STORAGE_PERM = 3867; /* * Gets string view of specific time in seconds for Brave stats */ @@ -200,6 +206,24 @@ public class BraveStatsUtil { return canvasBitmap; } + public static boolean hasWritePermission(Activity activity) { + if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) + == PackageManager.PERMISSION_GRANTED) { + return true; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + activity.requestPermissions(new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, + SHARE_STATS_WRITE_EXTERNAL_STORAGE_PERM); + } + + return false; + } + + public static void shareStats(int layout) { + View shareStatsLayout = getLayout(layout); + updateBraveShareStatsLayoutAndShare(shareStatsLayout); + } + private static List> getStatsPairs() { List> statsPair = new ArrayList<>(); Profile mProfile = Profile.getLastUsedRegularProfile(); diff --git a/android/java/org/chromium/chrome/browser/shields/BraveShieldsHandler.java b/android/java/org/chromium/chrome/browser/shields/BraveShieldsHandler.java index dce70593454..4fb47a26928 100644 --- a/android/java/org/chromium/chrome/browser/shields/BraveShieldsHandler.java +++ b/android/java/org/chromium/chrome/browser/shields/BraveShieldsHandler.java @@ -5,6 +5,7 @@ package org.chromium.chrome.browser.shields; +import android.Manifest; import android.animation.Animator; import android.animation.Animator.AnimatorListener; import android.animation.AnimatorListenerAdapter; @@ -12,6 +13,7 @@ import android.animation.AnimatorSet; import android.app.Activity; import android.content.Context; import android.content.ContextWrapper; +import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; @@ -55,6 +57,8 @@ import android.widget.RadioGroup; import android.widget.Switch; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; import androidx.core.widget.TextViewCompat; import org.chromium.base.Log; @@ -63,6 +67,7 @@ import org.chromium.base.task.AsyncTask; import org.chromium.chrome.R; import org.chromium.chrome.browser.BraveRewardsHelper; import org.chromium.chrome.browser.BraveRewardsNativeWorker; +import org.chromium.chrome.browser.app.BraveActivity; import org.chromium.chrome.browser.brave_stats.BraveStatsUtil; import org.chromium.chrome.browser.night_mode.GlobalNightModeStateProviderHolder; import org.chromium.chrome.browser.onboarding.OnboardingPrefManager; @@ -421,8 +426,9 @@ public class BraveShieldsHandler implements BraveRewardsHelper.LargeIconReadyCal @Override public void onClick(View v) { mMainLayout.setVisibility(View.GONE); - View shareStatsLayout = BraveStatsUtil.getLayout(R.layout.brave_stats_share_layout); - BraveStatsUtil.updateBraveShareStatsLayoutAndShare(shareStatsLayout); + if (BraveStatsUtil.hasWritePermission(BraveActivity.getBraveActivity())) { + BraveStatsUtil.shareStats(R.layout.brave_stats_share_layout); + } } }); @@ -458,6 +464,11 @@ public class BraveShieldsHandler implements BraveRewardsHelper.LargeIconReadyCal setupMainSwitchClick(mShieldMainSwitch); } + private void shareStats() { + View shareStatsLayout = BraveStatsUtil.getLayout(R.layout.brave_stats_share_layout); + BraveStatsUtil.updateBraveShareStatsLayoutAndShare(shareStatsLayout); + } + private void setToggleView(boolean shouldShow) { if (shouldShow) { mSecondaryLayout.setVisibility(View.VISIBLE); diff --git a/android/java/org/chromium/chrome/browser/shields/BraveShieldsUtils.java b/android/java/org/chromium/chrome/browser/shields/BraveShieldsUtils.java index 919324635a7..a1673a2d928 100644 --- a/android/java/org/chromium/chrome/browser/shields/BraveShieldsUtils.java +++ b/android/java/org/chromium/chrome/browser/shields/BraveShieldsUtils.java @@ -69,6 +69,8 @@ public class BraveShieldsUtils { public static final int BRAVE_BLOCKED_TIER8 = 500000; public static final int BRAVE_BLOCKED_TIER9 = 1000000; + public static final int BRAVE_BLOCKED_SHOW_DIFF = 20; + public static boolean isTooltipShown; public interface BraveShieldsCallback { 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 0121c831752..2a452dc0aaf 100644 --- a/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayout.java +++ b/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayout.java @@ -466,62 +466,71 @@ public abstract class BraveToolbarLayout extends ToolbarLayout 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); - } + + // show after BraveShieldsUtils.BRAVE_BLOCKED_SHOW_DIFF (20) blocked stuff above the TIER + // threshold + if (!BraveShieldsUtils.hasShieldsTooltipShown( + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER1) + && (totalBlocked >= BraveShieldsUtils.BRAVE_BLOCKED_TIER1 + + BraveShieldsUtils.BRAVE_BLOCKED_SHOW_DIFF + && 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 + + BraveShieldsUtils.BRAVE_BLOCKED_SHOW_DIFF + && 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 + + BraveShieldsUtils.BRAVE_BLOCKED_SHOW_DIFF + && 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 + + BraveShieldsUtils.BRAVE_BLOCKED_SHOW_DIFF + && 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 + + BraveShieldsUtils.BRAVE_BLOCKED_SHOW_DIFF + && 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 + + BraveShieldsUtils.BRAVE_BLOCKED_SHOW_DIFF + && 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 + + BraveShieldsUtils.BRAVE_BLOCKED_SHOW_DIFF + && 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 + + BraveShieldsUtils.BRAVE_BLOCKED_SHOW_DIFF + && 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 + + BraveShieldsUtils.BRAVE_BLOCKED_SHOW_DIFF)) { + showTooltip(ShieldsTooltipEnum.BRAVE_SHARE_STATS_TIER9_TOOLTIP, + BraveShieldsUtils.PREF_SHARE_SHIELDS_TOOLTIP_TIER9); } } @@ -603,9 +612,9 @@ public abstract class BraveToolbarLayout extends ToolbarLayout @Override public void onClick(View view) { dismissShieldsTooltip(); - View shareStatsLayout = - BraveStatsUtil.getLayout(R.layout.brave_stats_share_layout); - BraveStatsUtil.updateBraveShareStatsLayoutAndShare(shareStatsLayout); + if (BraveStatsUtil.hasWritePermission(BraveActivity.getBraveActivity())) { + BraveStatsUtil.shareStats(R.layout.brave_stats_share_layout); + } } }); }