Skip to content

Commit 65ddf91

Browse files
authored
Merge pull request #6171 from brave/cross_promotional_modal_dp
Cross promotional modal dp
2 parents deaa4e8 + 6ae5815 commit 65ddf91

File tree

12 files changed

+228
-1
lines changed

12 files changed

+228
-1
lines changed

android/brave_java_resources.gni

+6
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ brave_java_resources = [
171171
"java/res/drawable-hdpi/bat_unverified.png",
172172
"java/res/drawable-hdpi/share_icon.png",
173173
"java/res/drawable-hdpi/omnibox_https_valid.png",
174+
"java/res/drawable-hdpi/ic_cross_modal.png",
174175
"java/res/drawable-mdpi/check.png",
175176
"java/res/drawable-mdpi/btn_bookmark.png",
176177
"java/res/drawable-mdpi/arrow_forward.png",
@@ -276,6 +277,7 @@ brave_java_resources = [
276277
"java/res/drawable-mdpi/bat_unverified.png",
277278
"java/res/drawable-mdpi/share_icon.png",
278279
"java/res/drawable-mdpi/omnibox_https_valid.png",
280+
"java/res/drawable-mdpi/ic_cross_modal.png",
279281
"java/res/drawable-nodpi/will_christiansen_glacier_peak.jpg",
280282
"java/res/drawable-nodpi/loader16.png",
281283
"java/res/drawable-nodpi/loader11.png",
@@ -426,6 +428,7 @@ brave_java_resources = [
426428
"java/res/drawable-xhdpi/bat_unverified.png",
427429
"java/res/drawable-xhdpi/share_icon.png",
428430
"java/res/drawable-xhdpi/omnibox_https_valid.png",
431+
"java/res/drawable-xhdpi/ic_cross_modal.png",
429432
"java/res/drawable-xxhdpi/check.png",
430433
"java/res/drawable-xxhdpi/btn_bookmark.png",
431434
"java/res/drawable-xxhdpi/arrow_forward.png",
@@ -532,6 +535,7 @@ brave_java_resources = [
532535
"java/res/drawable-xxhdpi/bat_unverified.png",
533536
"java/res/drawable-xxhdpi/share_icon.png",
534537
"java/res/drawable-xxhdpi/omnibox_https_valid.png",
538+
"java/res/drawable-xxhdpi/ic_cross_modal.png",
535539
"java/res/drawable-xxxhdpi/check.png",
536540
"java/res/drawable-xxxhdpi/btn_bookmark.png",
537541
"java/res/drawable-xxxhdpi/arrow_forward.png",
@@ -624,6 +628,7 @@ brave_java_resources = [
624628
"java/res/drawable-xxxhdpi/bat_unverified.png",
625629
"java/res/drawable-xxxhdpi/share_icon.png",
626630
"java/res/drawable-xxxhdpi/omnibox_https_valid.png",
631+
"java/res/drawable-xxxhdpi/ic_cross_modal.png",
627632
"java/res/layout/brave_shields_ads_tracking_switcher.xml",
628633
"java/res/layout/web_notification_icon_frame_brave.xml",
629634
"java/res/layout/brave_sync_layout.xml",
@@ -684,6 +689,7 @@ brave_java_resources = [
684689
"java/res/layout/menu_separator.xml",
685690
"java/res/layout/brave_rewards_panel_grant.xml",
686691
"java/res/layout/brave_sync_add_laptop.xml",
692+
"java/res/layout/fragment_cross_promotional_modal_dialog.xml",
687693
"java/res/layout-land/brave_rewards_site_banner.xml",
688694
"java/res/layout-land/verify_wallet_activity.xml",
689695
"java/res/menu/new_tab_menu.xml",

android/brave_java_sources.gni

+2-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ brave_java_sources = [
141141
"../../brave/android/java/org/chromium/chrome/browser/rate/RateFeedbackUtils.java",
142142
"../../brave/android/java/org/chromium/chrome/browser/shields/BraveShieldsMenuObserver.java",
143143
"../../brave/android/java/org/chromium/chrome/browser/shields/BraveShieldsHandler.java",
144-
"../../brave/android/java/org/chromium/chrome/browser/shields/BraveShieldsUtils.java"
144+
"../../brave/android/java/org/chromium/chrome/browser/shields/BraveShieldsUtils.java",
145+
"../../brave/android/java/org/chromium/chrome/browser/CrossPromotionalModalDialogFragment.java"
145146
]
146147

147148
if (brave_rewards_enabled || enable_brave_referrals) {

android/java/org/chromium/chrome/browser/BraveActivity.java

+22
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import org.chromium.chrome.browser.util.PackageUtils;
6767
import org.chromium.chrome.browser.onboarding.OnboardingPrefManager;
6868
import org.chromium.chrome.browser.onboarding.OnboardingActivity;
69+
import org.chromium.chrome.browser.CrossPromotionalModalDialogFragment;
6970

7071
import java.util.Calendar;
7172
import java.util.Date;
@@ -88,6 +89,7 @@ public abstract class BraveActivity<C extends ChromeActivityComponent> extends C
8889
public static final String OPEN_URL = "open_url";
8990

9091
private static final int DAYS_4 = 4;
92+
private static final int DAYS_12 = 12;
9193

9294
/**
9395
* Settings for sending local notification reminders.
@@ -240,6 +242,20 @@ public void finishNativeInitialization() {
240242
OnboardingPrefManager.getInstance().showOnboarding(this);
241243
OnboardingPrefManager.getInstance().setOnboardingShownForSkip(true);
242244
}
245+
246+
if (PackageUtils.isFirstInstall(this)
247+
&& SharedPreferencesManager.getInstance().readInt(BravePreferenceKeys.BRAVE_APP_OPEN_COUNT) == 1) {
248+
Calendar calender = Calendar.getInstance();
249+
calender.setTime(new Date());
250+
calender.add(Calendar.DATE, DAYS_12);
251+
OnboardingPrefManager.getInstance().setNextCrossPromoModalDate(
252+
calender.getTimeInMillis());
253+
}
254+
255+
if (OnboardingPrefManager.getInstance().showCrossPromoModal()) {
256+
showCrossPromotionalDialog();
257+
OnboardingPrefManager.getInstance().setCrossPromoModalShown(true);
258+
}
243259
}
244260

245261
private void createNotificationChannel() {
@@ -396,6 +412,12 @@ private void showBraveRateDialog() {
396412
mRateDialogFragment.show(getSupportFragmentManager(), "RateDialogFragment");
397413
}
398414

415+
private void showCrossPromotionalDialog() {
416+
CrossPromotionalModalDialogFragment mCrossPromotionalModalDialogFragment = new CrossPromotionalModalDialogFragment();
417+
mCrossPromotionalModalDialogFragment.setCancelable(false);
418+
mCrossPromotionalModalDialogFragment.show(getSupportFragmentManager(), "CrossPromotionalModalDialogFragment");
419+
}
420+
399421
private native void nativeRestartStatsUpdater();
400422

401423
static public ChromeTabbedActivity getChromeTabbedActivity() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/**
2+
* Copyright (c) 2020 The Brave Authors. All rights reserved.
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
8+
package org.chromium.chrome.browser;
9+
10+
import android.content.DialogInterface;
11+
import android.content.res.Configuration;
12+
import android.os.Bundle;
13+
import android.util.DisplayMetrics;
14+
import android.view.LayoutInflater;
15+
import android.view.View;
16+
import android.view.ViewGroup;
17+
import android.view.WindowManager;
18+
import android.widget.Button;
19+
import android.widget.TextView;
20+
import android.widget.LinearLayout;
21+
import android.text.SpannableString;
22+
import android.text.Spanned;
23+
import android.text.style.ForegroundColorSpan;
24+
25+
import androidx.fragment.app.DialogFragment;
26+
27+
import org.chromium.chrome.R;
28+
29+
import org.chromium.ui.base.DeviceFormFactor;
30+
import org.chromium.chrome.browser.util.ConfigurationUtils;
31+
import org.chromium.chrome.browser.BraveRewardsHelper;
32+
33+
public class CrossPromotionalModalDialogFragment extends DialogFragment implements View.OnClickListener {
34+
35+
private static final String BRAVE_URL = "brave.com";
36+
37+
@Override
38+
public void onConfigurationChanged(Configuration newConfig) {
39+
super.onConfigurationChanged(newConfig);
40+
setDialogParams();
41+
}
42+
43+
@Override
44+
public void onResume() {
45+
super.onResume();
46+
getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() {
47+
@Override
48+
public boolean onKey(android.content.DialogInterface dialog,
49+
int keyCode, android.view.KeyEvent event) {
50+
if ((keyCode == android.view.KeyEvent.KEYCODE_BACK)) {
51+
dismiss();
52+
return true;
53+
} else return false;
54+
}
55+
});
56+
setDialogParams();
57+
}
58+
59+
@Override
60+
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
61+
return inflater.inflate(R.layout.fragment_cross_promotional_modal_dialog, container, false);
62+
}
63+
64+
@Override
65+
public void onViewCreated(View view, Bundle savedInstanceState) {
66+
Button mDoneButton = view.findViewById(R.id.btn_done);
67+
mDoneButton.setOnClickListener(this);
68+
69+
String mPromoText = getResources().getString(R.string.download_brave);
70+
int indexOfSpan = mPromoText.indexOf(BRAVE_URL);
71+
72+
TextView mCrossPromoText = view.findViewById(R.id.cross_modal_text);
73+
74+
Spanned textToSpan = BraveRewardsHelper.spannedFromHtmlString(mPromoText);
75+
SpannableString ss = new SpannableString(textToSpan.toString());
76+
77+
ForegroundColorSpan foregroundSpan =
78+
new ForegroundColorSpan(getResources().getColor(R.color.shield_back_button_tint));
79+
ss.setSpan(foregroundSpan, indexOfSpan,
80+
(indexOfSpan + BRAVE_URL.length()), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
81+
mCrossPromoText.setText(ss);
82+
}
83+
84+
@Override
85+
public void onClick(View view) {
86+
dismiss();
87+
}
88+
89+
private void setDialogParams() {
90+
DisplayMetrics displayMetrics = new DisplayMetrics();
91+
getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
92+
int mDeviceHeight = displayMetrics.heightPixels;
93+
int mDeviceWidth = displayMetrics.widthPixels;
94+
95+
WindowManager.LayoutParams params = getDialog().getWindow().getAttributes();
96+
boolean isTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(getActivity());
97+
boolean isLandscape = ConfigurationUtils.isLandscape(getActivity());
98+
if (isTablet) {
99+
params.width = (int) (0.5 * mDeviceWidth);
100+
} else {
101+
if (isLandscape) {
102+
params.width = (int) (0.5 * mDeviceWidth);
103+
} else {
104+
params.width = (int) (0.9 * mDeviceWidth);
105+
}
106+
}
107+
params.height = LinearLayout.LayoutParams.WRAP_CONTENT;
108+
getDialog().getWindow().setAttributes(params);
109+
}
110+
}

android/java/org/chromium/chrome/browser/onboarding/OnboardingPrefManager.java

+29
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030
*/
3131
public class OnboardingPrefManager {
3232
private static final String PREF_ONBOARDING = "onboarding";
33+
private static final String PREF_CROSS_PROMO_MODAL = "cross_promo_modal";
3334
private static final String PREF_NEXT_ONBOARDING_DATE = "next_onboarding_date";
35+
private static final String PREF_NEXT_CROSS_PROMO_MODAL_DATE = "next_cross_promo_modal_date";
3436
private static final String PREF_ONBOARDING_FOR_SKIP = "onboarding_for_skip";
3537
private static final String PREF_ONBOARDING_SKIP_COUNT = "onboarding_skip_count";
3638
private static final String PREF_SEARCH_ENGINE_ONBOARDING = "search_engine_onboarding";
@@ -159,6 +161,33 @@ public void onboardingNotification(Context context) {
159161
}
160162
}
161163

164+
private long getNextCrossPromoModalDate() {
165+
return mSharedPreferences.getLong(PREF_NEXT_CROSS_PROMO_MODAL_DATE, 0);
166+
}
167+
168+
public void setNextCrossPromoModalDate(long nextDate) {
169+
SharedPreferences.Editor sharedPreferencesEditor = mSharedPreferences.edit();
170+
sharedPreferencesEditor.putLong(PREF_NEXT_CROSS_PROMO_MODAL_DATE, nextDate);
171+
sharedPreferencesEditor.apply();
172+
}
173+
174+
public void setCrossPromoModalShown(boolean isShown) {
175+
SharedPreferences.Editor sharedPreferencesEditor = mSharedPreferences.edit();
176+
sharedPreferencesEditor.putBoolean(PREF_CROSS_PROMO_MODAL, isShown);
177+
sharedPreferencesEditor.apply();
178+
}
179+
180+
private boolean hasCrossPromoModalShown() {
181+
return mSharedPreferences.getBoolean(PREF_CROSS_PROMO_MODAL, false);
182+
}
183+
184+
public boolean showCrossPromoModal() {
185+
boolean shouldShow = !hasCrossPromoModalShown()
186+
&& (getNextCrossPromoModalDate() > 0
187+
&& System.currentTimeMillis() > getNextCrossPromoModalDate());
188+
return shouldShow;
189+
}
190+
162191
public static Map<String, SearchEngineEnum> searchEngineMap =
163192
new HashMap<String, SearchEngineEnum>() {
164193
{
Loading
Loading
Loading
Loading
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<!-- Copyright (c) 2020 The Brave Authors. All rights reserved.
3+
This Source Code Form is subject to the terms of the Mozilla Public
4+
License, v. 2.0. If a copy of the MPL was not distributed with this file,
5+
You can obtain one at http://mozilla.org/MPL/2.0/.
6+
-->
7+
8+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
9+
android:layout_width="match_parent"
10+
android:layout_height="wrap_content"
11+
android:padding="32dp"
12+
android:orientation="vertical">
13+
14+
<TextView
15+
android:layout_width="match_parent"
16+
android:layout_height="wrap_content"
17+
android:gravity="center_horizontal"
18+
android:text="@string/brave_works_everywhere"
19+
android:textSize="20sp"
20+
android:layout_marginBottom="24dp"
21+
android:textColor="@color/shield_text_color"
22+
android:textStyle="bold" />
23+
24+
<ImageView
25+
android:layout_width="wrap_content"
26+
android:layout_height="wrap_content"
27+
android:layout_marginBottom="16dp"
28+
android:src="@drawable/ic_cross_modal"
29+
android:contentDescription="@null"/>
30+
31+
<TextView
32+
android:id="@+id/cross_modal_text"
33+
android:layout_width="match_parent"
34+
android:layout_height="wrap_content"
35+
android:gravity="center_horizontal"
36+
android:textSize="16sp"
37+
android:text="@string/download_brave"
38+
android:layout_marginBottom="32dp"
39+
android:textColor="@color/shield_text_color"/>
40+
41+
<Button
42+
android:id="@+id/btn_done"
43+
android:layout_width="wrap_content"
44+
android:layout_height="wrap_content"
45+
android:layout_gravity="center_horizontal"
46+
android:background="@drawable/orange_rounded_button"
47+
android:text="@string/brave_sync_btn_done"
48+
android:textAllCaps="false"
49+
android:textColor="@android:color/white"
50+
android:textSize="16sp"
51+
style="?android:attr/borderlessButtonStyle"/>
52+
53+
</LinearLayout>

browser/ui/android/strings/android_brave_strings.grd

+6
Original file line numberDiff line numberDiff line change
@@ -1166,6 +1166,12 @@ until they verify, or until 90 days have passed.
11661166
<message name="IDS_NICE" desc="Shields tootltip title">
11671167
Nice!
11681168
</message>
1169+
<message name="IDS_BRAVE_WORKS_EVERYWHERE" desc="Cross promotional modal title text">
1170+
Brave works everywhere
1171+
</message>
1172+
<message name="IDS_DOWNLOAD_BRAVE" desc="Cross promotional modal text">
1173+
Download Brave at brave.com on your laptop or tablet for a faster and more private web
1174+
</message>
11691175
</messages>
11701176
</release>
11711177
</grit>

0 commit comments

Comments
 (0)