Skip to content
Snippets Groups Projects
Commit f9aea110 authored by Dan Ballard's avatar Dan Ballard Committed by Richard Pospesel
Browse files

yec22 home fragment, theming, and timegate toggle

parent 8b67442c
Branches
Tags
No related merge requests found
Showing with 332 additions and 27 deletions
......@@ -10,11 +10,8 @@ import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.os.StrictMode
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import android.util.Log
import android.view.*
import android.widget.Button
import android.widget.LinearLayout
import android.widget.PopupWindow
......@@ -22,16 +19,10 @@ import androidx.annotation.VisibleForTesting
import androidx.appcompat.content.res.AppCompatResources
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.constraintlayout.widget.ConstraintSet.BOTTOM
import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID
import androidx.constraintlayout.widget.ConstraintSet.TOP
import androidx.constraintlayout.widget.ConstraintSet.*
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.ContextCompat
import androidx.core.view.children
import androidx.core.view.doOnLayout
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.core.view.*
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Observer
......@@ -66,15 +57,13 @@ import mozilla.components.service.glean.private.NoExtras
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import mozilla.components.support.ktx.android.content.res.resolveAttribute
import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged
import mozilla.components.support.locale.LocaleManager
import mozilla.components.ui.tabcounter.TabCounterMenu
import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.Config
import org.mozilla.fenix.*
import org.mozilla.fenix.GleanMetrics.Events
import org.mozilla.fenix.GleanMetrics.HomeScreen
import org.mozilla.fenix.GleanMetrics.StartOnHome
import org.mozilla.fenix.GleanMetrics.Wallpapers
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.browser.BrowserAnimator.Companion.getToolbarNavOptions
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
import org.mozilla.fenix.components.FenixSnackbar
......@@ -84,12 +73,7 @@ import org.mozilla.fenix.components.appstate.AppAction
import org.mozilla.fenix.components.toolbar.FenixTabCounterMenu
import org.mozilla.fenix.components.toolbar.ToolbarPosition
import org.mozilla.fenix.databinding.FragmentHomeBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.hideToolbar
import org.mozilla.fenix.ext.nav
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.runIfFragmentIsAttached
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.*
import org.mozilla.fenix.gleanplumb.DefaultMessageController
import org.mozilla.fenix.gleanplumb.MessagingFeature
import org.mozilla.fenix.home.mozonline.showPrivacyPopWindow
......@@ -110,6 +94,7 @@ import org.mozilla.fenix.home.topsites.DefaultTopSitesView
import org.mozilla.fenix.nimbus.FxNimbus
import org.mozilla.fenix.onboarding.FenixOnboarding
import org.mozilla.fenix.perf.MarkersFragmentLifecycleCallbacks
import org.mozilla.fenix.settings.advanced.getSelectedLocale
import org.mozilla.fenix.tabstray.TabsTrayAccessPoint
import org.mozilla.fenix.tor.bootstrap.TorQuickStart
import org.mozilla.fenix.utils.Settings.Companion.TOP_SITES_PROVIDER_MAX_THRESHOLD
......@@ -117,6 +102,8 @@ import org.mozilla.fenix.utils.ToolbarPopupWindow
import org.mozilla.fenix.utils.allowUndo
import org.mozilla.fenix.wallpapers.WallpaperManager
import java.lang.ref.WeakReference
import java.util.*
import kotlin.concurrent.schedule
import kotlin.math.min
@Suppress("TooManyFunctions", "LargeClass")
......@@ -229,6 +216,13 @@ class HomeFragment : Fragment() {
?.replace(" *([.,。।]) *".toRegex(), "$1\n")
?.trim()
binding.yecPoweredbyprivacy.text = localBinding
.yecPoweredbyprivacy
.text
?.replace(" *([.,。।]) *".toRegex(), "$1\n")
?.trim()
currentMode = CurrentMode(
requireContext(),
onboarding,
......@@ -411,6 +405,20 @@ class HomeFragment : Fragment() {
adjustHomeFragmentView(currentMode.getCurrentMode())
showSessionControlView()
binding.donateNowButton.setOnClickListener {
val country = LocaleManager.getSelectedLocale(requireContext()).country
var locale = LocaleManager.getSelectedLocale(requireContext()).language
if (country != "") {
locale = "${locale}-${country}"
}
val localeUrl = "https://www.torproject.org/pbp-${locale}-mobile"
activity.openToBrowserAndLoad(
searchTermOrURL = localeUrl,
newTab = true,
from = BrowserDirection.FromHome
)
}
// DO NOT MOVE ANYTHING BELOW THIS addMarker CALL!
requireComponents.core.engine.profiler?.addMarker(
MarkersFragmentLifecycleCallbacks.MARKER_NAME, profilerStartTime, "HomeFragment.onCreateView",
......@@ -424,8 +432,34 @@ class HomeFragment : Fragment() {
getMenuButton()?.dismissMenu()
displayWallpaperIfEnabled()
//view.donationmatch.setOnClickListener {
// activity.openToBrowserAndLoad(
// searchTermOrURL = "https://blog.torproject.org/friends-of-tor-match-2020",
// newTab = true,
// from = BrowserDirection.FromHome
// )
//}
binding.donateNowButton.setOnClickListener {
val country = LocaleManager.getSelectedLocale(requireContext()).country
var locale = LocaleManager.getSelectedLocale(requireContext()).language
if (country != "") {
locale = "${locale}-${country}"
}
val localeUrl = "https://www.torproject.org/pbp-${locale}-mobile"
(activity as HomeActivity).openToBrowserAndLoad(
searchTermOrURL = localeUrl,
newTab = true,
from = BrowserDirection.FromHome
)
}
}
//private fun dismissTip(tip: Tip) {
// sessionControlInteractor.onCloseTip(tip)
//}
/**
* Returns a [TopSitesConfig] which specifies how many top sites to display and whether or
* not frequently visited sites should be displayed.
......@@ -577,14 +611,97 @@ class HomeFragment : Fragment() {
}
}
}
val yec22launched = (activity as? HomeActivity)?.themeManager?.isYECActive ?: false
// Hide the onion pattern during Onboarding, too.
binding.onionPatternImage.apply {
visibility = if (onboarding.userHasBeenOnboarded()) {
visibility = if (onboarding.userHasBeenOnboarded() && !yec22launched) {
View.VISIBLE
} else {
View.GONE
}
}
// Hide tor browser header during onboarding and EOY event
binding.exploreprivately.apply {
visibility = if (onboarding.userHasBeenOnboarded() && !yec22launched) {
View.VISIBLE
} else {
View.GONE
}
}
// Hide EOY header text during onboarding and before event
binding.yecPoweredbyprivacy.apply {
visibility = if (onboarding.userHasBeenOnboarded() && yec22launched) {
View.VISIBLE
} else {
View.GONE
}
}
// Hide the EOY image during Onboarding, and before event
binding.yecActivistImage.apply {
visibility = if (onboarding.userHasBeenOnboarded() && yec22launched) {
View.VISIBLE
} else {
View.GONE
}
}
binding.yecResistanceImage.apply {
visibility = if (onboarding.userHasBeenOnboarded() && yec22launched) {
View.VISIBLE
} else {
View.GONE
}
}
binding.yecChangeImage.apply {
visibility = if (onboarding.userHasBeenOnboarded() && yec22launched) {
View.VISIBLE
} else {
View.GONE
}
}
binding.yecFreedomImage.apply {
visibility = if (onboarding.userHasBeenOnboarded() && yec22launched) {
View.VISIBLE
} else {
View.GONE
}
}
// Hide the EOY donate button during Onboarding, and before event
binding.donateNowButton.apply {
visibility = if (onboarding.userHasBeenOnboarded() && yec22launched) {
View.VISIBLE
} else {
View.GONE
}
}
// Hide EOY donation match text during onboarding and before event
binding.donationmatch.apply {
visibility = if (onboarding.userHasBeenOnboarded() && yec22launched) {
View.VISIBLE
} else {
View.GONE
}
}
// Hide the EOY image during Onboarding, and before event
binding.yecImageLayout.apply {
visibility = if (onboarding.userHasBeenOnboarded() && yec22launched) {
View.VISIBLE
} else {
View.GONE
}
}
binding.homeAppBar.apply {
visibility = View.VISIBLE
......@@ -932,8 +1049,12 @@ class HomeFragment : Fragment() {
override fun onResume() {
super.onResume()
if (browsingModeManager.mode == BrowsingMode.Private) {
if ((activity as? HomeActivity)?.themeManager?.isYECActive ?: false) {
activity?.window?.setBackgroundDrawableResource(R.color.tor_yec_home_background)
} else {
activity?.window?.setBackgroundDrawableResource(R.drawable.private_home_background_gradient)
}
}
// fenix#40176: Ensure the Home fragment is rendered correctly when we resume.
val mode = currentMode.getCurrentMode()
......
......@@ -23,18 +23,33 @@ import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity
import org.mozilla.fenix.home.HomeFragment
import java.util.*
abstract class ThemeManager {
// 1663979387091 // 2022 9 21 - testing
// 1665619200000 // 2022 10 13
private val yec2022LaunchDate = Date(1665619200000)
// 1672531200000 // 2023 01 01
private val yec2022EndDate = Date(1672531200000)
abstract var currentTheme: BrowsingMode
val isYECActive get() = Date().after(yec2022LaunchDate) && Date().before(yec2022EndDate)
/**
* Returns the style resource corresponding to the [currentTheme].
*/
@get:StyleRes
val currentThemeResource get() = when (currentTheme) {
BrowsingMode.Normal -> R.style.NormalTheme
BrowsingMode.Private -> R.style.PrivateTheme
BrowsingMode.Private -> {
if (isYECActive) {
R.style.PrivateEOYTheme
} else {
R.style.PrivateTheme
}
}
}
/**
......
app/src/main/res/drawable/ic_yec22_bg_combined_android_3x.png

147 KiB

<?xml version="1.0" encoding="utf-8"?>
<!-- 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/. -->
<!-- Used for rounding the corners of a button -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#C0FF00" />
<corners android:radius="10dp" />
</shape>
File added
File added
File added
File added
......@@ -102,6 +102,144 @@
android:lineSpacingMultiplier="1.1"
app:layout_scrollFlags="scroll" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/yec_poweredbyprivacy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginStart="35dp"
android:layout_marginEnd="35dp"
android:clickable="false"
android:focusable="false"
android:fontFamily="@font/spacemono_bold"
android:importantForAccessibility="no"
android:text="@string/yec2022_powered_by_privacy"
android:lineSpacingMultiplier="0.8"
android:textColor="#C0FF00"
android:textSize="28sp"
app:layout_scrollFlags="scroll" />
<RelativeLayout
android:id="@+id/yec_image_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="22dp"
android:layout_marginStart="35dp"
android:layout_marginEnd="35dp"
android:gravity="center"
android:orientation="vertical" >
<ImageView
android:id="@+id/yec_activist_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="fitCenter"
android:paddingTop="10dp"
android:adjustViewBounds="true"
app:layout_scrollFlags="scroll"
app:srcCompat="@drawable/ic_yec22_bg_combined_android_3x"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/yec_resistance_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:paddingStart="80dp"
android:clickable="false"
android:focusable="false"
android:fontFamily="@font/spacegrotesk_semibold"
android:importantForAccessibility="no"
android:rotation="-2.25"
android:text="@string/yec2022_resistance"
android:textColor="#FF8AFF"
android:textSize="33sp"
app:layout_scrollFlags="scroll" />
<TextView
android:id="@+id/yec_change_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:paddingStart="80dp"
android:layout_alignLeft="@+id/yec_resistance_image"
android:layout_below="@+id/yec_resistance_image"
android:layout_marginTop="-10dp"
android:clickable="false"
android:focusable="false"
android:fontFamily="@font/spacegrotesk_light"
android:importantForAccessibility="no"
android:rotation="-2.25"
android:text="@string/yec2022_change"
android:textColor="#C0FF00"
android:textSize="33sp"
app:layout_scrollFlags="scroll" />
<TextView
android:id="@+id/yec_freedom_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:paddingStart="80dp"
android:layout_alignLeft="@+id/yec_resistance_image"
android:layout_below="@+id/yec_change_image"
android:layout_marginTop="-10dp"
android:clickable="false"
android:focusable="false"
android:fontFamily="@font/spacegrotesk_semibold"
android:importantForAccessibility="no"
android:rotation="-2.25"
android:text="@string/yec2022_freedom"
android:textColor="#FF8AFF"
android:textSize="33sp"
app:layout_scrollFlags="scroll" />
</RelativeLayout>
<Button
android:id="@+id/donate_now_button"
style="@style/TorDonateYecButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="35dp"
android:layout_marginRight="35dp"
android:layout_marginTop="22dp"
android:background="@drawable/tor_yec_donate_rounded_corners"
android:text="@string/tor_onboarding_donate_button"
android:textAllCaps="false"
android:textColor="#000000"
android:textSize="18sp"
android:textStyle="bold"
android:visibility="visible"
tools:ignore="ButtonStyleXmlDetector" />
<TextView
android:id="@+id/donationmatch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="22dp"
android:paddingStart="35dp"
android:paddingEnd="35dp"
android:clickable="false"
android:focusable="false"
android:fontFamily="@font/spacemono_bold"
android:importantForAccessibility="no"
android:lineSpacingMultiplier="1.1"
android:text="@string/yec2022_donation_matching"
android:textColor="#FAF5DF"
android:textSize="18sp"
android:gravity="center"
android:visibility="visible"
app:layout_scrollFlags="scroll" />
</LinearLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.recyclerview.widget.RecyclerView
......
......@@ -273,7 +273,7 @@
<color name="sync_disconnected_background_private_theme">#5B5846</color>
<color name="onboarding_illustration_deselected_private_theme">#99FBFBFE</color>
<color name="prompt_login_edit_text_cursor_color_private_theme">@color/photonViolet50</color>
<color name="tor_yec_home_background">#0E0625</color>
<!-- Normal theme colors for light mode -->
<color name="accent_normal_theme">@color/photonInk20</color>
<color name="accent_high_contrast_normal_theme">@color/photonInk20</color>
......
......@@ -330,6 +330,11 @@
<style name="PrivateTheme" parent="PrivateThemeBase" />
<style name="PrivateEOYTheme" parent="PrivateThemeBase" >
<item name="android:windowBackground">@color/tor_yec_home_background</item>
<item name="homeBackground">@color/tor_yec_home_background</item>
</style>
<!-- Fade animation for theme switching -->
<style name="WindowAnimationTransition">
<item name="android:windowEnterAnimation">@anim/fade_in</item>
......@@ -368,6 +373,21 @@
<item name="android:textColor">#000000</item>
</style>
<style name="TorDonateYecButton" parent="NeutralButton">
<item name="android:background">@drawable/tor_yec_donate_rounded_corners</item>
<item name="backgroundTint">#C0FF00</item>
<item name="android:textColor">#000000</item>
<item name="android:fontFamily">@font/spacemono_bold</item>
<item name="fontFamily">@font/spacemono_bold</item>
</style>
<style name="TorDonateYecButtonText" parent="Base.TextAppearance.MaterialComponents.Badge">
<item name="android:textStyle">bold</item>
<item name="android:textColor">#000000</item>
</style>
<style name="DestructiveButton" parent="NeutralButton">
<item name="iconTint">@color/fx_mobile_text_color_warning</item>
<item name="android:textColor">@color/fx_mobile_text_color_warning</item>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment