Skip to content

Commit c5443ff

Browse files
authored
Merge pull request #8508 from brave/stats-social-sharing
Stats social sharing
2 parents 79aeb63 + a6b66a0 commit c5443ff

20 files changed

+547
-39
lines changed

android/brave_java_resources.gni

+8
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ brave_java_resources = [
9090
"java/res/drawable-hdpi/search_engine_startpage.png",
9191
"java/res/drawable-hdpi/settings_desktop_mode.png",
9292
"java/res/drawable-hdpi/settings_play_yt_video_in_browser.png",
93+
"java/res/drawable-hdpi/share_activity_background.png",
9394
"java/res/drawable-hdpi/share_icon.png",
9495
"java/res/drawable-hdpi/shortcut_incognito.png",
9596
"java/res/drawable-hdpi/slide_down.png",
@@ -182,6 +183,7 @@ brave_java_resources = [
182183
"java/res/drawable-mdpi/search_engine_startpage.png",
183184
"java/res/drawable-mdpi/settings_desktop_mode.png",
184185
"java/res/drawable-mdpi/settings_play_yt_video_in_browser.png",
186+
"java/res/drawable-mdpi/share_activity_background.png",
185187
"java/res/drawable-mdpi/share_icon.png",
186188
"java/res/drawable-mdpi/shortcut_incognito.png",
187189
"java/res/drawable-mdpi/slide_down.png",
@@ -325,6 +327,7 @@ brave_java_resources = [
325327
"java/res/drawable-xhdpi/search_engine_startpage.png",
326328
"java/res/drawable-xhdpi/settings_desktop_mode.png",
327329
"java/res/drawable-xhdpi/settings_play_yt_video_in_browser.png",
330+
"java/res/drawable-xhdpi/share_activity_background.png",
328331
"java/res/drawable-xhdpi/share_icon.png",
329332
"java/res/drawable-xhdpi/shortcut_incognito.png",
330333
"java/res/drawable-xhdpi/slide_down.png",
@@ -418,6 +421,7 @@ brave_java_resources = [
418421
"java/res/drawable-xxhdpi/search_engine_startpage.png",
419422
"java/res/drawable-xxhdpi/settings_desktop_mode.png",
420423
"java/res/drawable-xxhdpi/settings_play_yt_video_in_browser.png",
424+
"java/res/drawable-xxhdpi/share_activity_background.png",
421425
"java/res/drawable-xxhdpi/share_icon.png",
422426
"java/res/drawable-xxhdpi/shortcut_incognito.png",
423427
"java/res/drawable-xxhdpi/slide_down.png",
@@ -504,6 +508,7 @@ brave_java_resources = [
504508
"java/res/drawable-xxxhdpi/rewards_settings.png",
505509
"java/res/drawable-xxxhdpi/settings_desktop_mode.png",
506510
"java/res/drawable-xxxhdpi/settings_play_yt_video_in_browser.png",
511+
"java/res/drawable-xxxhdpi/share_activity_background.png",
507512
"java/res/drawable-xxxhdpi/share_icon.png",
508513
"java/res/drawable-xxxhdpi/shortcut_incognito.png",
509514
"java/res/drawable-xxxhdpi/slide_down.png",
@@ -596,6 +601,8 @@ brave_java_resources = [
596601
"java/res/drawable/ic_phone.xml",
597602
"java/res/drawable/ic_setbraveasdefault.xml",
598603
"java/res/drawable/ic_setbraveasdefault_dark.xml",
604+
"java/res/drawable/ic_share.xml",
605+
"java/res/drawable/ic_share_white.xml",
599606
"java/res/drawable/ic_shield_done_filled.xml",
600607
"java/res/drawable/ic_shield_done_filled_20dp.xml",
601608
"java/res/drawable/ic_sort.xml",
@@ -693,6 +700,7 @@ brave_java_resources = [
693700
"java/res/layout/brave_stats_bottom_sheet.xml",
694701
"java/res/layout/brave_stats_layout.xml",
695702
"java/res/layout/brave_stats_pager_layout.xml",
703+
"java/res/layout/brave_stats_share_layout.xml",
696704
"java/res/layout/brave_sync_add_laptop.xml",
697705
"java/res/layout/brave_sync_add_mobile.xml",
698706
"java/res/layout/brave_sync_device.xml",

android/java/org/chromium/chrome/browser/brave_stats/BraveStatsUtil.java

+112-9
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,39 @@
55

66
package org.chromium.chrome.browser.brave_stats;
77

8+
import android.content.Context;
9+
import android.content.Intent;
10+
import android.content.pm.ResolveInfo;
11+
import android.graphics.Bitmap;
12+
import android.graphics.Canvas;
13+
import android.net.Uri;
14+
import android.provider.MediaStore;
815
import android.util.Pair;
16+
import android.view.LayoutInflater;
917
import android.view.View;
1018
import android.widget.TextView;
1119

20+
import androidx.appcompat.app.AppCompatActivity;
21+
22+
import org.chromium.base.ContextUtils;
23+
import org.chromium.base.Log;
24+
import org.chromium.base.ThreadUtils;
25+
import org.chromium.base.task.AsyncTask;
1226
import org.chromium.chrome.R;
1327
import org.chromium.chrome.browser.app.BraveActivity;
1428
import org.chromium.chrome.browser.brave_stats.BraveStatsBottomSheetDialogFragment;
29+
import org.chromium.chrome.browser.local_database.DatabaseHelper;
1530
import org.chromium.chrome.browser.preferences.BravePref;
1631
import org.chromium.chrome.browser.preferences.BravePrefServiceBridge;
1732
import org.chromium.chrome.browser.profiles.Profile;
33+
import org.chromium.chrome.browser.shields.BraveShieldsUtils;
1834

35+
import java.io.ByteArrayOutputStream;
1936
import java.text.SimpleDateFormat;
37+
import java.util.ArrayList;
2038
import java.util.Calendar;
2139
import java.util.Date;
40+
import java.util.List;
2241
import java.util.Locale;
2342

2443
public class BraveStatsUtil {
@@ -95,7 +114,6 @@ public static String getCalculatedDate(String dateFormat, int days) {
95114
}
96115

97116
public static void updateBraveStatsLayout(View view) {
98-
Profile mProfile = Profile.getLastUsedRegularProfile();
99117
TextView mAdsBlockedCountTextView =
100118
(TextView) view.findViewById(R.id.brave_stats_text_ads_count);
101119
TextView mDataSavedValueTextView =
@@ -109,24 +127,109 @@ public static void updateBraveStatsLayout(View view) {
109127
TextView mEstTimeSavedCountTextTextView =
110128
(TextView) view.findViewById(R.id.brave_stats_text_time_count_text);
111129

130+
List<Pair<String, String>> statsPairs = getStatsPairs();
131+
132+
mAdsBlockedCountTextView.setText(statsPairs.get(0).first);
133+
mDataSavedValueTextView.setText(statsPairs.get(1).first);
134+
mEstTimeSavedCountTextView.setText(statsPairs.get(2).first);
135+
mAdsBlockedCountTextTextView.setText(statsPairs.get(0).second);
136+
mDataSavedValueTextTextView.setText(statsPairs.get(1).second);
137+
mEstTimeSavedCountTextTextView.setText(statsPairs.get(2).second);
138+
}
139+
140+
public static void updateBraveShareStatsLayoutAndShare(View view) {
141+
TextView mAdsBlockedCountTextView = (TextView) view.findViewById(R.id.stats_trackers_no);
142+
TextView mDataSavedValueTextView = (TextView) view.findViewById(R.id.stats_saved_data_no);
143+
TextView mEstTimeSavedCountTextView = (TextView) view.findViewById(R.id.stats_timed_no);
144+
145+
List<Pair<String, String>> statsPairs = getStatsPairs();
146+
String trackersString =
147+
String.format("%s %s", statsPairs.get(0).first, statsPairs.get(0).second);
148+
String dataSavedString =
149+
String.format("%s %s", statsPairs.get(1).first, statsPairs.get(1).second);
150+
String timeSavedString =
151+
String.format("%s %s", statsPairs.get(2).first, statsPairs.get(2).second);
152+
153+
mAdsBlockedCountTextView.setText(trackersString);
154+
mDataSavedValueTextView.setText(dataSavedString);
155+
mEstTimeSavedCountTextView.setText(timeSavedString);
156+
shareStatsAction(view);
157+
}
158+
159+
public static void shareStatsAction(View view) {
160+
Context context = ContextUtils.getApplicationContext();
161+
Bitmap bmp = convertToBitmap(view);
162+
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
163+
bmp.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
164+
String path = MediaStore.Images.Media.insertImage(
165+
context.getContentResolver(), bmp, "tempimage", null);
166+
Uri uri = Uri.parse(path);
167+
168+
Intent sendIntent = new Intent();
169+
sendIntent.setAction(Intent.ACTION_SEND);
170+
sendIntent.putExtra(Intent.EXTRA_TEXT,
171+
context.getResources().getString(R.string.brave_stats_share_text));
172+
sendIntent.putExtra(Intent.EXTRA_STREAM, uri);
173+
sendIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
174+
sendIntent.setType("image/text");
175+
176+
Intent shareIntent = Intent.createChooser(sendIntent, " ");
177+
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
178+
context.startActivity(shareIntent);
179+
}
180+
181+
public static View getLayout(int layoutId) {
182+
Context context = ContextUtils.getApplicationContext();
183+
LayoutInflater inflater =
184+
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
185+
View layout = inflater.inflate(layoutId, null);
186+
187+
return layout;
188+
}
189+
190+
private static Bitmap convertToBitmap(View view) {
191+
view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
192+
int totalHeight = view.getMeasuredHeight();
193+
int totalWidth = view.getMeasuredWidth();
194+
195+
Bitmap canvasBitmap = Bitmap.createBitmap(totalWidth, totalHeight, Bitmap.Config.ARGB_8888);
196+
Canvas canvas = new Canvas(canvasBitmap);
197+
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
198+
view.draw(canvas);
199+
200+
return canvasBitmap;
201+
}
202+
203+
private static List<Pair<String, String>> getStatsPairs() {
204+
List<Pair<String, String>> statsPair = new ArrayList<>();
205+
Profile mProfile = Profile.getLastUsedRegularProfile();
112206
long trackersBlockedCount =
113207
BravePrefServiceBridge.getInstance().getTrackersBlockedCount(mProfile);
114208
long adsBlockedCount = BravePrefServiceBridge.getInstance().getAdsBlockedCount(mProfile);
209+
long adsTrackersBlockedCount = trackersBlockedCount + adsBlockedCount;
115210
long dataSaved = BravePrefServiceBridge.getInstance().getDataSaved(mProfile);
116211
long estimatedMillisecondsSaved =
117212
(trackersBlockedCount + adsBlockedCount) * MILLISECONDS_PER_ITEM;
118213

119214
Pair<String, String> adsTrackersPair =
120-
getBraveStatsStringFormNumberPair(adsBlockedCount, false);
215+
getBraveStatsStringFormNumberPair(adsTrackersBlockedCount, false);
121216
Pair<String, String> dataSavedPair = getBraveStatsStringFormNumberPair(dataSaved, true);
122217
Pair<String, String> timeSavedPair =
123218
getBraveStatsStringFromTime(estimatedMillisecondsSaved / 1000);
219+
statsPair.add(adsTrackersPair);
220+
statsPair.add(dataSavedPair);
221+
statsPair.add(timeSavedPair);
222+
223+
return statsPair;
224+
}
225+
226+
public static Pair<String, String> getAdsTrackersBlocked() {
227+
Profile mProfile = Profile.getLastUsedRegularProfile();
228+
long trackersBlockedCount =
229+
BravePrefServiceBridge.getInstance().getTrackersBlockedCount(mProfile);
230+
long adsBlockedCount = BravePrefServiceBridge.getInstance().getAdsBlockedCount(mProfile);
231+
long adsTrackersBlockedCount = trackersBlockedCount + adsBlockedCount;
124232

125-
mAdsBlockedCountTextView.setText(adsTrackersPair.first);
126-
mDataSavedValueTextView.setText(dataSavedPair.first);
127-
mEstTimeSavedCountTextView.setText(timeSavedPair.first);
128-
mAdsBlockedCountTextTextView.setText(adsTrackersPair.second);
129-
mDataSavedValueTextTextView.setText(dataSavedPair.second);
130-
mEstTimeSavedCountTextTextView.setText(timeSavedPair.second);
233+
return getBraveStatsStringFormNumberPair(adsTrackersBlockedCount, false);
131234
}
132-
}
235+
}

android/java/org/chromium/chrome/browser/shields/BraveShieldsHandler.java

+27-16
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,24 @@
1313
import android.content.Context;
1414
import android.content.ContextWrapper;
1515
import android.graphics.Bitmap;
16+
import android.graphics.Canvas;
1617
import android.graphics.Color;
1718
import android.graphics.Point;
1819
import android.graphics.Rect;
1920
import android.graphics.Typeface;
21+
import android.graphics.drawable.BitmapDrawable;
2022
import android.graphics.drawable.ColorDrawable;
2123
import android.graphics.drawable.Drawable;
24+
import android.net.Uri;
2225
import android.os.Build;
26+
import android.provider.MediaStore;
2327
import android.text.SpannableString;
2428
import android.text.Spanned;
2529
import android.text.method.LinkMovementMethod;
2630
import android.text.style.ClickableSpan;
2731
import android.text.style.ImageSpan;
2832
import android.text.style.StyleSpan;
33+
import android.util.TypedValue;
2934
import android.view.ContextThemeWrapper;
3035
import android.view.Gravity;
3136
import android.view.LayoutInflater;
@@ -39,6 +44,7 @@
3944
import android.widget.Button;
4045
import android.widget.CompoundButton;
4146
import android.widget.CompoundButton.OnCheckedChangeListener;
47+
import android.widget.FrameLayout;
4248
import android.widget.ImageView;
4349
import android.widget.LinearLayout;
4450
import android.widget.ListPopupWindow;
@@ -49,6 +55,8 @@
4955
import android.widget.Switch;
5056
import android.widget.TextView;
5157

58+
import androidx.core.widget.TextViewCompat;
59+
5260
import org.chromium.base.Log;
5361
import org.chromium.base.SysUtils;
5462
import org.chromium.base.task.AsyncTask;
@@ -65,6 +73,9 @@
6573
import org.chromium.chrome.browser.tab.Tab;
6674
import org.chromium.chrome.browser.util.ConfigurationUtils;
6775

76+
import java.io.ByteArrayOutputStream;
77+
import java.io.File;
78+
import java.io.IOException;
6879
import java.util.Collections;
6980
import java.util.HashMap;
7081
import java.util.Map;
@@ -278,11 +289,8 @@ public PopupWindow showPopupMenu(View anchorView) {
278289
}
279290

280291
Rect bgPadding = new Rect();
281-
popupWindow.getBackground().getPadding(bgPadding);
282-
283292
int popupWidth = wrapper.getResources().getDimensionPixelSize(R.dimen.menu_width)
284293
+ bgPadding.left + bgPadding.right;
285-
286294
popupWindow.setWidth(popupWidth);
287295

288296
return popupWindow;
@@ -310,7 +318,7 @@ public int getAdsBlockedCount(int tabId) {
310318
return blockersInfo.mAdsBlocked;
311319
}
312320

313-
public int getTackersBlockedCount(int tabId) {
321+
public int getTrackersBlockedCount(int tabId) {
314322
if (!mTabsStat.containsKey(tabId)) {
315323
return 0;
316324
}
@@ -397,23 +405,26 @@ private void setUpMainLayout() {
397405

398406
Switch mShieldMainSwitch = mMainLayout.findViewById(R.id.site_switch);
399407

400-
ClickableSpan mClickableSpan = new ClickableSpan() {
408+
ImageView helpImage = (ImageView) mMainLayout.findViewById(R.id.help);
409+
ImageView shareImage = (ImageView) mMainLayout.findViewById(R.id.share);
410+
411+
helpImage.setOnClickListener(new View.OnClickListener() {
401412
@Override
402-
public void onClick(View widget) {
413+
public void onClick(View v) {
403414
mMainLayout.setVisibility(View.GONE);
404415
mAboutLayout.setVisibility(View.VISIBLE);
405416
setUpAboutLayout();
406417
}
407-
};
418+
});
408419

409-
TextView mSiteBlockText = mMainLayout.findViewById(R.id.site_block_text);
410-
mSiteBlockText.setMovementMethod(LinkMovementMethod.getInstance());
411-
String mBlockText = mContext.getResources().getString(R.string.ads_and_other_things_blocked) + " ";
412-
SpannableString mSpannableString = new SpannableString(mBlockText);
413-
ImageSpan mImageSpan = new ImageSpan(mContext, R.drawable.ic_help);
414-
mSpannableString.setSpan(mImageSpan, mBlockText.length() - 1, mBlockText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
415-
mSpannableString.setSpan(mClickableSpan, mSpannableString.getSpanStart(mImageSpan), mSpannableString.getSpanEnd(mImageSpan), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
416-
mSiteBlockText.setText(mSpannableString);
420+
shareImage.setOnClickListener(new View.OnClickListener() {
421+
@Override
422+
public void onClick(View v) {
423+
mMainLayout.setVisibility(View.GONE);
424+
View shareStatsLayout = BraveStatsUtil.getLayout(R.layout.brave_stats_share_layout);
425+
BraveStatsUtil.updateBraveShareStatsLayoutAndShare(shareStatsLayout);
426+
}
427+
});
417428

418429
mToggleIcon.setColorFilter(mContext.getResources().getColor(R.color.shield_toggle_button_tint));
419430
mToggleLayout.setOnClickListener(new View.OnClickListener() {
@@ -928,4 +939,4 @@ public void onClick(View view) {
928939
hideBraveShieldsMenu();
929940
}
930941
};
931-
}
942+
}

android/java/org/chromium/chrome/browser/shields/BraveShieldsUtils.java

+25-1
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,36 @@ public class BraveShieldsUtils {
3939
"shields_ads_tracker_blocked_tooltip";
4040
public static final String PREF_SHIELDS_HTTPS_UPGRADE_TOOLTIP =
4141
"shields_https_upgrade_tooltip";
42+
public static final String PREF_SHARE_SHIELDS_TOOLTIP = "share_shields_tooltip";
43+
public static final String PREF_ADS_TRACKERS_BLOCKED_NO = "ads_trackers_blocked_no";
44+
public static final String PREF_DATA_SAVED_NO = "data_saved_no";
45+
public static final String PREF_TIME_SAVED_NO = "time_saved_no";
46+
47+
public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER1 = "share_shields_tooltip_tier1";
48+
public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER2 = "share_shields_tooltip_tier2";
49+
public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER3 = "share_shields_tooltip_tier3";
50+
public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER4 = "share_shields_tooltip_tier4";
51+
public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER5 = "share_shields_tooltip_tier5";
52+
public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER6 = "share_shields_tooltip_tier6";
53+
public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER7 = "share_shields_tooltip_tier7";
54+
public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER8 = "share_shields_tooltip_tier8";
55+
public static final String PREF_SHARE_SHIELDS_TOOLTIP_TIER9 = "share_shields_tooltip_tier9";
4256

4357
public static final List<String> videoSitesList =
4458
Arrays.asList("youtube.com", "vimeo.com", "twitch.tv");
4559
public static final List<String> videoSitesListJp =
4660
Arrays.asList("nicovideo.jp", "tiktok.com", "instagram.com");
4761

62+
public static final int BRAVE_BLOCKED_TIER1 = 1000;
63+
public static final int BRAVE_BLOCKED_TIER2 = 5000;
64+
public static final int BRAVE_BLOCKED_TIER3 = 10000;
65+
public static final int BRAVE_BLOCKED_TIER4 = 25000;
66+
public static final int BRAVE_BLOCKED_TIER5 = 75000;
67+
public static final int BRAVE_BLOCKED_TIER6 = 100000;
68+
public static final int BRAVE_BLOCKED_TIER7 = 250000;
69+
public static final int BRAVE_BLOCKED_TIER8 = 500000;
70+
public static final int BRAVE_BLOCKED_TIER9 = 1000000;
71+
4872
public static boolean isTooltipShown;
4973

5074
public interface BraveShieldsCallback {
@@ -134,4 +158,4 @@ private static void sendBraveShieldsFeedback(String domain) {
134158
if (urlConnection != null) urlConnection.disconnect();
135159
}
136160
}
137-
}
161+
}

0 commit comments

Comments
 (0)