From 2b8e1d670fa3c67895192fddd34fbc98dd4ef888 Mon Sep 17 00:00:00 2001 From: Deep Date: Tue, 26 May 2020 15:08:26 -0400 Subject: [PATCH 01/29] Add UI for onboardingv2 Add resources for onboardingv2 --- android/brave_java_sources.gni | 2 + ...OnboardingBottomSheetViewPagerAdapter.java | 104 ++++++++++++++++ .../onboarding/OnboardingPrefManager.java | 9 +- .../OnboradingBottomSheetDialogFragment.java | 116 ++++++++++++++++++ .../java/res/drawable/default_indicator.xml | 12 ++ .../java/res/drawable/indicator_selector.xml | 8 ++ .../java/res/drawable/selected_indicator.xml | 12 ++ .../res/layout/onboarding_bottom_sheet.xml | 48 ++++++++ .../res/layout/onboarding_pager_layout.xml | 55 +++++++++ android/java/res/values/brave_colors.xml | 2 + .../android/strings/android_brave_strings.grd | 27 ++++ 11 files changed, 394 insertions(+), 1 deletion(-) create mode 100644 android/java/org/chromium/chrome/browser/onboarding/OnboardingBottomSheetViewPagerAdapter.java create mode 100644 android/java/org/chromium/chrome/browser/onboarding/OnboradingBottomSheetDialogFragment.java create mode 100644 android/java/res/drawable/default_indicator.xml create mode 100644 android/java/res/drawable/indicator_selector.xml create mode 100644 android/java/res/drawable/selected_indicator.xml create mode 100644 android/java/res/layout/onboarding_bottom_sheet.xml create mode 100644 android/java/res/layout/onboarding_pager_layout.xml diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index 64f6e343bf96..3cc60d10c8db 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -78,6 +78,8 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/onboarding/SearchEngineOnboardingFragment.java", "../../brave/android/java/org/chromium/chrome/browser/onboarding/TroubleshootingOnboardingFragment.java", "../../brave/android/java/org/chromium/chrome/browser/onboarding/SearchActivity.java", + "../../brave/android/java/org/chromium/chrome/browser/onboarding/OnboardingBottomSheetViewPagerAdapter.java", + "../../brave/android/java/org/chromium/chrome/browser/onboarding/OnboradingBottomSheetDialogFragment.java", "../../brave/android/java/org/chromium/chrome/browser/partnercustomizations/BravePartnerBrowserCustomizations.java", "../../brave/android/java/org/chromium/chrome/browser/partnercustomizations/CloseBraveManager.java", "../../brave/android/java/org/chromium/chrome/browser/preferences/BravePreferenceKeys.java", diff --git a/android/java/org/chromium/chrome/browser/onboarding/OnboardingBottomSheetViewPagerAdapter.java b/android/java/org/chromium/chrome/browser/onboarding/OnboardingBottomSheetViewPagerAdapter.java new file mode 100644 index 000000000000..c5608770f3b1 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/onboarding/OnboardingBottomSheetViewPagerAdapter.java @@ -0,0 +1,104 @@ +/** + * Copyright (c) 2019 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.onboarding; + +import android.content.Context; +import android.support.v4.view.PagerAdapter; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import android.widget.Button; +import android.view.LayoutInflater; + +import org.chromium.chrome.R; + +import org.chromium.base.ContextUtils; +import org.chromium.chrome.browser.ntp_background_images.util.NewTabPageListener; +import org.chromium.chrome.browser.onboarding.OnboardingPrefManager; + +import java.util.List; +import java.util.Arrays; + +public class OnboardingBottomSheetViewPagerAdapter extends PagerAdapter { + private int mOnboardingType; + private NewTabPageListener mNewTabPageListener; + + private static final Context mContext = ContextUtils.getApplicationContext(); + private static final List mHeaders = Arrays.asList( + mContext.getResources().getString(R.string.privacy_protection), + mContext.getResources().getString(R.string.save_data_and_battery), + mContext.getResources().getString(R.string.websites_load_faster), + mContext.getResources().getString(R.string.get_weekly_updates) + ); + private static final List mTexts = Arrays.asList( + mContext.getResources().getString(R.string.privacy_protection_text), + mContext.getResources().getString(R.string.save_data_and_battery_text), + mContext.getResources().getString(R.string.websites_load_faster_text), + mContext.getResources().getString(R.string.get_weekly_updates_text) + ); + + public OnboardingBottomSheetViewPagerAdapter(int onboardingType, NewTabPageListener newTabPageListener) { + this.mOnboardingType = onboardingType; + this.mNewTabPageListener = newTabPageListener; + } + + @Override + public int getCount() { + if (mOnboardingType != OnboardingPrefManager.ONBOARDING_INVALID_OPTION) { + return 1; + } + return mHeaders.size(); + } + + @Override + public boolean isViewFromObject(View view, Object viewObject) { + return viewObject == view; + } + + @Override + public Object instantiateItem(final ViewGroup container, int position) { + LayoutInflater inflater = LayoutInflater.from(mContext); + ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.onboarding_pager_layout, + container, false); + + switch (mOnboardingType) { + case OnboardingPrefManager.ONBOARDING_ADS: + position = 0; + break; + case OnboardingPrefManager.ONBOARDING_DATA_SAVED: + position = 1; + break; + case OnboardingPrefManager.ONBOARDING_TIME: + position = 2; + break; + } + + TextView mHeader = layout.findViewById(R.id.onboarding_header); + mHeader.setText(mHeaders.get(position)); + + TextView mText = layout.findViewById(R.id.onboarding_text); + mText.setText(mTexts.get(position)); + + Button mAction = layout.findViewById(R.id.btn_turn_on_privacy_stats); + mAction.setText(mContext.getResources().getString(R.string.turn_on_privacy_stats)); + mAction.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + + container.addView(layout); + return layout; + } + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + container.removeView((View)object); + } +} diff --git a/android/java/org/chromium/chrome/browser/onboarding/OnboardingPrefManager.java b/android/java/org/chromium/chrome/browser/onboarding/OnboardingPrefManager.java index de095576b64f..ed7557be5eeb 100644 --- a/android/java/org/chromium/chrome/browser/onboarding/OnboardingPrefManager.java +++ b/android/java/org/chromium/chrome/browser/onboarding/OnboardingPrefManager.java @@ -26,7 +26,7 @@ import java.util.Map; /** - * Provides information regarding onboarding enabled states. + * Provides information regarding onboarding. */ public class OnboardingPrefManager { private static final String PREF_ONBOARDING = "onboarding"; @@ -48,6 +48,13 @@ public class OnboardingPrefManager { public static final int EXISTING_USER_REWARDS_OFF_ONBOARDING = 1; public static final int EXISTING_USER_REWARDS_ON_ONBOARDING = 2; + public static final String ONBOARDING_TYPE = "onboarding_type"; + + public static final int ONBOARDING_INVALID_OPTION = -1; + public static final int ONBOARDING_ADS = 1; + public static final int ONBOARDING_DATA_SAVED = 2; + public static final int ONBOARDING_TIME = 3; + private static boolean isOnboardingNotificationShown; public static boolean isNotification; diff --git a/android/java/org/chromium/chrome/browser/onboarding/OnboradingBottomSheetDialogFragment.java b/android/java/org/chromium/chrome/browser/onboarding/OnboradingBottomSheetDialogFragment.java new file mode 100644 index 000000000000..3a200f018bcc --- /dev/null +++ b/android/java/org/chromium/chrome/browser/onboarding/OnboradingBottomSheetDialogFragment.java @@ -0,0 +1,116 @@ +/* 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.onboarding; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.support.design.widget.TabLayout; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.widget.ImageView; +import android.widget.FrameLayout; +import android.content.res.Configuration; + +import android.support.design.widget.BottomSheetDialogFragment; +import android.support.design.widget.BottomSheetDialog; +import android.support.design.widget.BottomSheetBehavior; +import android.view.ViewTreeObserver; + +import org.chromium.chrome.R; + +import org.chromium.chrome.browser.util.ConfigurationUtils; +import org.chromium.ui.base.DeviceFormFactor; +import org.chromium.chrome.browser.ntp_background_images.util.NewTabPageListener; +import org.chromium.chrome.browser.onboarding.OnboardingBottomSheetViewPagerAdapter; + +import static org.chromium.ui.base.ViewUtils.dpToPx; + +public class OnboradingBottomSheetDialogFragment extends BottomSheetDialogFragment { + private int mOnboardingType; + private NewTabPageListener mNewTabPageListener; + + public static OnboradingBottomSheetDialogFragment newInstance() { + return new OnboradingBottomSheetDialogFragment(); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + mOnboardingType = getArguments() != null ? + getArguments().getInt(OnboardingPrefManager.ONBOARDING_TYPE , OnboardingPrefManager.ONBOARDING_INVALID_OPTION) : + OnboardingPrefManager.ONBOARDING_INVALID_OPTION; + + return inflater.inflate(R.layout.onboarding_bottom_sheet, container, false); + } + + @Override + public void onPause() { + // newTabPageListener.updateInteractableFlag(true); + super.onPause(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + boolean isTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(getActivity()); + if (isTablet || (!isTablet && newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)) { + getDialog().getWindow().setLayout(dpToPx(getActivity(), 400), -1); + } else { + getDialog().getWindow().setLayout(-1, -1); + } + } + + @Override + public void onResume() { + super.onResume(); + boolean isTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(getActivity()); + if (isTablet || (!isTablet && ConfigurationUtils.isLandscape(getActivity()))) { + getDialog().getWindow().setLayout(dpToPx(getActivity(), 400), -1); + } else { + getDialog().getWindow().setLayout(-1, -1); + } + } + + public void setNewTabPageListener(NewTabPageListener newTabPageListener) { + this.mNewTabPageListener = newTabPageListener; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + BottomSheetDialog dialog = (BottomSheetDialog) getDialog(); + FrameLayout bottomSheet = (FrameLayout) dialog.findViewById(android.support.design.R.id.design_bottom_sheet); + BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet); + behavior.setState(BottomSheetBehavior.STATE_EXPANDED); + } + }); + + ViewPager pager = (ViewPager) view.findViewById(R.id.viewpager); + OnboardingBottomSheetViewPagerAdapter adapter = new OnboardingBottomSheetViewPagerAdapter(onboardingType, newTabPageListener); + pager.setAdapter(adapter); + + TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tab_layout); + tabLayout.setupWithViewPager(pager, true); + + ImageView btnClose = view.findViewById(R.id.onboarding_bottom_sheet_close); + btnClose.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + } + }); + } +} diff --git a/android/java/res/drawable/default_indicator.xml b/android/java/res/drawable/default_indicator.xml new file mode 100644 index 000000000000..a332c8c73532 --- /dev/null +++ b/android/java/res/drawable/default_indicator.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/android/java/res/drawable/indicator_selector.xml b/android/java/res/drawable/indicator_selector.xml new file mode 100644 index 000000000000..5468599c376e --- /dev/null +++ b/android/java/res/drawable/indicator_selector.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/android/java/res/drawable/selected_indicator.xml b/android/java/res/drawable/selected_indicator.xml new file mode 100644 index 000000000000..d4213bf055f2 --- /dev/null +++ b/android/java/res/drawable/selected_indicator.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/android/java/res/layout/onboarding_bottom_sheet.xml b/android/java/res/layout/onboarding_bottom_sheet.xml new file mode 100644 index 000000000000..7bedc779ec6d --- /dev/null +++ b/android/java/res/layout/onboarding_bottom_sheet.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/java/res/layout/onboarding_pager_layout.xml b/android/java/res/layout/onboarding_pager_layout.xml new file mode 100644 index 000000000000..ada7ea8ad230 --- /dev/null +++ b/android/java/res/layout/onboarding_pager_layout.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + +