diff --git a/app/src/main/java/org/mozilla/fenix/BrowsingModeManager.kt b/app/src/main/java/org/mozilla/fenix/BrowsingModeManager.kt index eeab14c28..2dfe620a7 100644 --- a/app/src/main/java/org/mozilla/fenix/BrowsingModeManager.kt +++ b/app/src/main/java/org/mozilla/fenix/BrowsingModeManager.kt @@ -6,54 +6,45 @@ package org.mozilla.fenix import org.mozilla.fenix.utils.Settings +/** + * Enum that represents whether or not private browsing is active. + */ +enum class BrowsingMode { + Normal, Private; + + /** + * Returns true if the [BrowsingMode] is [Private] + */ + val isPrivate get() = this == Private + + companion object { + + /** + * Convert a boolean into a [BrowsingMode]. + * True corresponds to [Private] and false corresponds to [Normal]. + */ + fun fromBoolean(isPrivate: Boolean) = if (isPrivate) Private else Normal + } +} + interface BrowsingModeManager { - enum class Mode { - Normal, Private; - - fun isPrivate(): Boolean = this == Private - } - - val isPrivate: Boolean - var mode: Mode -} - -interface BrowserModeStorage { - fun setMode(mode: BrowsingModeManager.Mode) - fun currentMode(): BrowsingModeManager.Mode -} - -fun Settings.createBrowserModeStorage(): BrowserModeStorage = object : BrowserModeStorage { - override fun currentMode(): BrowsingModeManager.Mode { - return if (this@createBrowserModeStorage.usePrivateMode) { - BrowsingModeManager.Mode.Private - } else { - BrowsingModeManager.Mode.Normal - } - } - - override fun setMode(mode: BrowsingModeManager.Mode) { - this@createBrowserModeStorage.setPrivateMode(mode == BrowsingModeManager.Mode.Private) - } + var mode: BrowsingMode } class DefaultBrowsingModeManager( - private val storage: BrowserModeStorage, - private val modeDidChange: (BrowsingModeManager.Mode) -> Unit + private val settings: Settings, + private val modeDidChange: (BrowsingMode) -> Unit ) : BrowsingModeManager { - override val isPrivate: Boolean - get() = mode == BrowsingModeManager.Mode.Private - - override var mode: BrowsingModeManager.Mode - get() = storage.currentMode() + override var mode: BrowsingMode + get() = BrowsingMode.fromBoolean(settings.usePrivateMode) set(value) { - storage.setMode(value) - modeDidChange(mode) + settings.setPrivateMode(value.isPrivate) + modeDidChange(value) } } class CustomTabBrowsingModeManager : BrowsingModeManager { - override val isPrivate = false - override var mode: BrowsingModeManager.Mode - get() = BrowsingModeManager.Mode.Normal - set(_) { return } + override var mode + get() = BrowsingMode.Normal + set(_) { /* no-op */ } } diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 400db2995..18f622fd8 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -76,7 +76,8 @@ open class HomeActivity : AppCompatActivity(), ShareFragment.TabsSharedCallback super.onCreate(savedInstanceState) components.publicSuffixList.prefetch() - setupThemeAndBrowsingMode() + browsingModeManager = createBrowsingModeManager() + themeManager = createThemeManager(browsingModeManager.mode) setContentView(R.layout.activity_home) @@ -101,18 +102,6 @@ open class HomeActivity : AppCompatActivity(), ShareFragment.TabsSharedCallback handleOpenedFromExternalSourceIfNecessary(intent) } - private fun setupThemeAndBrowsingMode() { - browsingModeManager = createBrowsingModeManager() - themeManager = createThemeManager( - when (browsingModeManager.isPrivate) { - true -> ThemeManager.Theme.Private - false -> ThemeManager.Theme.Normal - } - ) - setTheme(themeManager.currentTheme) - ThemeManager.applyStatusBarTheme(window, themeManager, this) - } - private fun setupToolbarAndNavigation() { // Add ids to this that we don't want to have a toolbar back button val appBarConfiguration = AppBarConfiguration.Builder().build() @@ -288,13 +277,12 @@ open class HomeActivity : AppCompatActivity(), ShareFragment.TabsSharedCallback engine: SearchEngine?, forceSearch: Boolean ) { - val isPrivate = this.browsingModeManager.isPrivate + val mode = browsingModeManager.mode val loadUrlUseCase = if (newTab) { - if (isPrivate) { - components.useCases.tabsUseCases.addPrivateTab - } else { - components.useCases.tabsUseCases.addTab + when (mode) { + BrowsingMode.Private -> components.useCases.tabsUseCases.addPrivateTab + BrowsingMode.Normal -> components.useCases.tabsUseCases.addTab } } else components.useCases.sessionUseCases.loadUrl @@ -305,7 +293,7 @@ open class HomeActivity : AppCompatActivity(), ShareFragment.TabsSharedCallback searchTerms, Session.Source.USER_ENTERED, true, - isPrivate, + mode.isPrivate, searchEngine = engine ) } else components.useCases.searchUseCases.defaultSearch.invoke(searchTerms, engine) @@ -331,10 +319,9 @@ open class HomeActivity : AppCompatActivity(), ShareFragment.TabsSharedCallback } fun updateThemeForSession(session: Session) { - if (session.private && !themeManager.currentTheme.isPrivate()) { - browsingModeManager.mode = BrowsingModeManager.Mode.Private - } else if (!session.private && themeManager.currentTheme.isPrivate()) { - browsingModeManager.mode = BrowsingModeManager.Mode.Normal + val sessionMode = BrowsingMode.fromBoolean(session.private) + if (sessionMode != browsingModeManager.mode) { + browsingModeManager.mode = sessionMode } } @@ -342,26 +329,24 @@ open class HomeActivity : AppCompatActivity(), ShareFragment.TabsSharedCallback return if (isCustomTab) { CustomTabBrowsingModeManager() } else { - DefaultBrowsingModeManager(Settings.getInstance(this).createBrowserModeStorage()) { - themeManager.setTheme( - when (it.isPrivate()) { - true -> ThemeManager.Theme.Private - false -> ThemeManager.Theme.Normal - } - ) + DefaultBrowsingModeManager(Settings.getInstance(this)) { mode -> + themeManager.currentTheme = mode } } } - private fun createThemeManager(currentTheme: ThemeManager.Theme): ThemeManager { - return if (isCustomTab) { + private fun createThemeManager(currentTheme: BrowsingMode): ThemeManager { + val themeManager = if (isCustomTab) { CustomTabThemeManager() } else { DefaultThemeManager(currentTheme) { - setTheme(it) + themeManager.setActivityTheme(this) recreate() } } + themeManager.setActivityTheme(this) + themeManager.applyStatusBarTheme(this) + return themeManager } private fun subscribeToSessions(): SessionManager.Observer { diff --git a/app/src/main/java/org/mozilla/fenix/ThemeManager.kt b/app/src/main/java/org/mozilla/fenix/ThemeManager.kt index ec9172e89..1afc9b19d 100644 --- a/app/src/main/java/org/mozilla/fenix/ThemeManager.kt +++ b/app/src/main/java/org/mozilla/fenix/ThemeManager.kt @@ -13,17 +13,50 @@ import android.os.Build.VERSION.SDK_INT import android.util.TypedValue import android.view.View import android.view.Window -import androidx.core.content.ContextCompat +import androidx.annotation.StyleRes +import org.mozilla.fenix.ext.getColorFromAttr -interface ThemeManager { - enum class Theme { - Normal, Private; +abstract class ThemeManager { - fun isPrivate(): Boolean = this == Private + abstract var currentTheme: BrowsingMode + + /** + * 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 } - val currentTheme: Theme - fun setTheme(theme: Theme) + /** + * Handles status bar theme change since the window does not dynamically recreate + */ + fun applyStatusBarTheme(activity: Activity) = applyStatusBarTheme(activity.window, activity) + fun applyStatusBarTheme(window: Window, context: Context) { + when (currentTheme) { + BrowsingMode.Normal -> { + when (context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { + Configuration.UI_MODE_NIGHT_UNDEFINED, // We assume light here per Android doc's recommendation + Configuration.UI_MODE_NIGHT_NO -> { + updateLightSystemBars(window, context) + } + Configuration.UI_MODE_NIGHT_YES -> { + clearLightSystemBars(window) + updateNavigationBar(window, context) + } + } + } + BrowsingMode.Private -> { + clearLightSystemBars(window) + updateNavigationBar(window, context) + } + } + } + + fun setActivityTheme(activity: Activity) { + activity.setTheme(currentThemeResource) + } companion object { fun resolveAttribute(attribute: Int, context: Context): Int { @@ -34,53 +67,12 @@ interface ThemeManager { return typedValue.resourceId } - // Handles status bar theme change since the window does not dynamically recreate - fun applyStatusBarTheme( - window: Window, - themeManager: ThemeManager, - context: Context - ) { - when (themeManager.currentTheme) { - ThemeManager.Theme.Normal -> { - when (context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { - Configuration.UI_MODE_NIGHT_NO -> { - updateLightSystemBars(window, context) - } - Configuration.UI_MODE_NIGHT_YES -> { - window.decorView.systemUiVisibility = - window.decorView.systemUiVisibility and - View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() and - View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR.inv() - updateNavigationBar(window, context) - } - Configuration.UI_MODE_NIGHT_UNDEFINED -> { - // We assume light here per Android doc's recommendation - updateLightSystemBars(window, context) - } - } - } - ThemeManager.Theme.Private -> { - window.decorView.systemUiVisibility = window.decorView.systemUiVisibility and - View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() and - View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR.inv() - updateNavigationBar(window, context) - } - } - } - - private fun updateLightSystemBars( - window: Window, - context: Context - ) { + private fun updateLightSystemBars(window: Window, context: Context) { if (SDK_INT >= Build.VERSION_CODES.M) { - window.statusBarColor = ContextCompat - .getColor( - context, resolveAttribute(android.R.attr.statusBarColor, context) - ) + window.statusBarColor = context.getColorFromAttr(android.R.attr.statusBarColor) window.decorView.systemUiVisibility = - window.decorView.systemUiVisibility or - View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR + window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR } else { window.statusBarColor = Color.BLACK } @@ -88,54 +80,40 @@ interface ThemeManager { if (SDK_INT >= Build.VERSION_CODES.O) { // API level can display handle light navigation bar color window.decorView.systemUiVisibility = - window.decorView.systemUiVisibility or - View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR + window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR updateNavigationBar(window, context) } } - private fun updateNavigationBar( - window: Window, - context: Context - ) { - window.navigationBarColor = ContextCompat - .getColor( - context, resolveAttribute(R.attr.foundation, context) - ) + private fun clearLightSystemBars(window: Window) { + if (SDK_INT >= Build.VERSION_CODES.M) { + window.decorView.systemUiVisibility = window.decorView.systemUiVisibility and + View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() and + View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR.inv() + } + } + + private fun updateNavigationBar(window: Window, context: Context) { + window.navigationBarColor = context.getColorFromAttr(R.attr.foundation) } } } -val ThemeManager.currentThemeResource: Int - get() = when (currentTheme) { - ThemeManager.Theme.Normal -> R.style.NormalTheme - ThemeManager.Theme.Private -> R.style.PrivateTheme - } - -fun Activity.setTheme(theme: ThemeManager.Theme) { - val themeCode = when (theme) { - ThemeManager.Theme.Normal -> R.style.NormalTheme - ThemeManager.Theme.Private -> R.style.PrivateTheme - } - - setTheme(themeCode) -} - class DefaultThemeManager( - private var _currentTheme: ThemeManager.Theme, - private val onThemeChanged: (ThemeManager.Theme) -> Unit -) : ThemeManager { - override val currentTheme: ThemeManager.Theme - get() = _currentTheme - - override fun setTheme(theme: ThemeManager.Theme) { - if (theme == _currentTheme) return - _currentTheme = theme - onThemeChanged(theme) - } + currentTheme: BrowsingMode, + private val onThemeChanged: (BrowsingMode) -> Unit +) : ThemeManager() { + override var currentTheme: BrowsingMode = currentTheme + set(value) { + if (currentTheme != value) { + field = value + onThemeChanged(value) + } + } } -class CustomTabThemeManager : ThemeManager { - override val currentTheme = ThemeManager.Theme.Normal - override fun setTheme(theme: ThemeManager.Theme) { /* noop */ } +class CustomTabThemeManager : ThemeManager() { + override var currentTheme + get() = BrowsingMode.Normal + set(_) { /* noop */ } } diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt index 948ab60b6..2bae219ff 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -115,7 +115,7 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler, SessionManager.Obs val view = inflater.inflate(R.layout.fragment_browser, container, false) val activity = activity as HomeActivity - ThemeManager.applyStatusBarTheme(activity.window, activity.themeManager, activity) + activity.themeManager.applyStatusBarTheme(activity) val appLink = requireComponents.useCases.appLinksUseCases.appLinkRedirect browserStore = StoreProvider.get(this) { @@ -151,6 +151,7 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler, SessionManager.Obs val browserToolbarController = DefaultBrowserToolbarController( context!!, findNavController(), + (activity as HomeActivity).browsingModeManager, findInPageLauncher = { findInPageIntegration.withFeature { it.launch() } }, nestedScrollQuickActionView = nestedScrollQuickAction, engineView = engineView, @@ -302,12 +303,8 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler, SessionManager.Obs } else { activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER activity?.exitImmersiveModeIfNeeded() - (activity as HomeActivity).let { activity: HomeActivity -> - ThemeManager.applyStatusBarTheme( - activity.window, - activity.themeManager, - activity - ) + (activity as? HomeActivity)?.let { activity -> + activity.themeManager.applyStatusBarTheme(activity) } toolbar.visibility = View.VISIBLE nestedScrollQuickAction.visibility = View.VISIBLE diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 61b78d2a7..a078516be 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -18,7 +18,6 @@ import androidx.navigation.fragment.findNavController import androidx.transition.TransitionInflater import com.google.android.material.snackbar.Snackbar import kotlinx.android.synthetic.main.component_search.* -import kotlinx.android.synthetic.main.fragment_browser.* import kotlinx.android.synthetic.main.fragment_browser.view.* import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main @@ -148,7 +147,7 @@ class BrowserFragment : BaseBrowserFragment(), BackHandler { view = view ) - if ((activity as HomeActivity).browsingModeManager.isPrivate) { + if ((activity as HomeActivity).browsingModeManager.mode.isPrivate) { // We need to update styles for private mode programmatically for now: // https://github.com/mozilla-mobile/android-components/issues/3400 themeReaderViewControlsForPrivateMode(view.readerViewControlsBar) diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt index 757f673c6..a074dc98c 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt @@ -14,8 +14,8 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ObsoleteCoroutinesApi import mozilla.components.browser.session.Session import mozilla.components.concept.engine.EngineView +import org.mozilla.fenix.BrowsingMode import org.mozilla.fenix.BrowsingModeManager -import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.browser.BrowserFragment import org.mozilla.fenix.browser.BrowserFragmentDirections @@ -38,6 +38,7 @@ interface BrowserToolbarController { class DefaultBrowserToolbarController( private val context: Context, private val navController: NavController, + private val browsingModeManager: BrowsingModeManager, private val findInPageLauncher: () -> Unit, private val nestedScrollQuickActionView: NestedScrollView, private val engineView: EngineView, @@ -91,11 +92,15 @@ class DefaultBrowserToolbarController( navController.nav(R.id.browserFragment, directions) } } - ToolbarMenu.Item.NewPrivateTab -> { - val directions = BrowserFragmentDirections - .actionBrowserFragmentToSearchFragment(null) + ToolbarMenu.Item.NewTab -> { + val directions = BrowserFragmentDirections.actionBrowserFragmentToSearchFragment(null) navController.nav(R.id.browserFragment, directions) - (context as HomeActivity).browsingModeManager.mode = BrowsingModeManager.Mode.Private + browsingModeManager.mode = BrowsingMode.Normal + } + ToolbarMenu.Item.NewPrivateTab -> { + val directions = BrowserFragmentDirections.actionBrowserFragmentToSearchFragment(null) + navController.nav(R.id.browserFragment, directions) + browsingModeManager.mode = BrowsingMode.Private } ToolbarMenu.Item.FindInPage -> { bottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED @@ -111,13 +116,6 @@ class DefaultBrowserToolbarController( ToolbarMenu.Item.Help -> { context.components.useCases.tabsUseCases.addTab.invoke(getSupportUrl()) } - ToolbarMenu.Item.NewTab -> { - val directions = BrowserFragmentDirections - .actionBrowserFragmentToSearchFragment(null) - navController.nav(R.id.browserFragment, directions) - (context as HomeActivity).browsingModeManager.mode = - BrowsingModeManager.Mode.Normal - } ToolbarMenu.Item.SaveToCollection -> { context.components.analytics.metrics .track(Event.CollectionSaveButtonPressed(TELEMETRY_BROWSER_IDENTIFIER)) diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt index 6988f60da..dd7a74d5f 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -11,6 +11,7 @@ import mozilla.components.browser.menu.item.BrowserMenuHighlightableItem import mozilla.components.browser.menu.item.BrowserMenuImageText import mozilla.components.browser.menu.item.BrowserMenuItemToolbar import mozilla.components.browser.menu.item.BrowserMenuSwitch +import org.mozilla.fenix.BrowsingMode import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.ThemeManager @@ -178,7 +179,7 @@ class DefaultToolbarMenu( } ) - if ((context.asActivity() as? HomeActivity)?.browsingModeManager?.isPrivate == false) { + if ((context.asActivity() as? HomeActivity)?.browsingModeManager?.mode == BrowsingMode.Normal) { items.add( BrowserMenuImageText( context.getString(R.string.browser_menu_save_to_collection), diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index f1425e5b5..054de0848 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -51,11 +51,10 @@ import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.START import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.TOP import org.jetbrains.anko.constraint.layout.applyConstraintSet import org.mozilla.fenix.BrowserDirection -import org.mozilla.fenix.BrowsingModeManager +import org.mozilla.fenix.BrowsingMode import org.mozilla.fenix.FenixViewModelProvider import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R -import org.mozilla.fenix.ThemeManager import org.mozilla.fenix.collections.CreateCollectionViewModel import org.mozilla.fenix.collections.SaveCollectionStep import org.mozilla.fenix.components.FenixSnackbar @@ -88,8 +87,11 @@ import kotlin.math.roundToInt @SuppressWarnings("TooManyFunctions", "LargeClass") class HomeFragment : Fragment(), AccountObserver { + private val bus = ActionBusFactory.get(this) + private val browsingModeManager get() = (activity as HomeActivity).browsingModeManager + private val singleSessionObserver = object : Session.Observer { override fun onTitleChanged(session: Session, title: String) { if (deleteAllSessionsJob == null) emitSessionChanges() @@ -195,7 +197,7 @@ class HomeFragment : Fragment(), AccountObserver { ActionBusFactory.get(this).logMergedObservables() val activity = activity as HomeActivity - ThemeManager.applyStatusBarTheme(activity.window, activity.themeManager, activity) + activity.themeManager.applyStatusBarTheme(activity) postponeEnterTransition() sessionControlComponent.view.viewTreeObserver.addOnPreDrawListener(preDrawListener) @@ -251,30 +253,22 @@ class HomeFragment : Fragment(), AccountObserver { requireComponents.analytics.metrics.track(Event.SearchBarTapped(Event.SearchBarTapped.Source.HOME)) } - val isPrivate = (activity as HomeActivity).browsingModeManager.isPrivate + val isPrivate = browsingModeManager.mode.isPrivate privateBrowsingButton.contentDescription = contentDescriptionForPrivateBrowsingButton(isPrivate) privateBrowsingButton.setOnClickListener { invokePendingDeleteJobs() - val browsingModeManager = (activity as HomeActivity).browsingModeManager - val newMode = when (browsingModeManager.mode) { - BrowsingModeManager.Mode.Normal -> BrowsingModeManager.Mode.Private - BrowsingModeManager.Mode.Private -> BrowsingModeManager.Mode.Normal - } + val invertedMode = BrowsingMode.fromBoolean(!browsingModeManager.mode.isPrivate) if (onboarding.userHasBeenOnboarded()) { - val mode = - if (newMode == BrowsingModeManager.Mode.Private) Mode.Private else Mode.Normal getManagedEmitter().onNext( - SessionControlChange.ModeChange( - mode - ) + SessionControlChange.ModeChange(Mode.fromBrowsingMode(invertedMode)) ) } - browsingModeManager.mode = newMode + browsingModeManager.mode = invertedMode } // We need the shadow to be above the components. @@ -339,9 +333,7 @@ class HomeFragment : Fragment(), AccountObserver { private fun handleTabAction(action: TabAction) { Do exhaustive when (action) { is TabAction.SaveTabGroup -> { - if ((activity as HomeActivity).browsingModeManager.isPrivate) { - return - } + if ((activity as HomeActivity).browsingModeManager.mode.isPrivate) return invokePendingDeleteJobs() showCollectionCreationFragment(action.selectedTabSessionId) } @@ -671,9 +663,8 @@ class HomeFragment : Fragment(), AccountObserver { } private fun getListOfSessions(): List { - val isPrivate = (activity as HomeActivity).browsingModeManager.isPrivate - val notPendingDeletion: (Session) -> Boolean = - { it.id != pendingSessionDeletion?.sessionId } + val isPrivate = browsingModeManager.mode.isPrivate + val notPendingDeletion = { session: Session -> session.id != pendingSessionDeletion?.sessionId } return sessionManager.filteredSessions(isPrivate, notPendingDeletion) } @@ -730,10 +721,8 @@ class HomeFragment : Fragment(), AccountObserver { Mode.Onboarding(OnboardingState.SignedOutCanAutoSignIn(availableAccounts[0])) } } - } else if ((activity as HomeActivity).browsingModeManager.isPrivate) { - Mode.Private } else { - Mode.Normal + Mode.fromBrowsingMode(browsingModeManager.mode) } private fun emitAccountChanges() { diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt index 687a380a8..2d772b61f 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt @@ -14,16 +14,17 @@ import io.reactivex.Observer import kotlinx.android.parcel.Parcelize import mozilla.components.browser.session.Session import mozilla.components.service.fxa.sharing.ShareableAccount +import org.mozilla.fenix.BrowsingMode import org.mozilla.fenix.ext.components -import org.mozilla.fenix.mvi.ViewState -import org.mozilla.fenix.mvi.Change -import mozilla.components.feature.tab.collections.TabCollection as ACTabCollection -import mozilla.components.feature.tab.collections.Tab as ComponentTab import org.mozilla.fenix.mvi.Action import org.mozilla.fenix.mvi.ActionBusFactory +import org.mozilla.fenix.mvi.Change import org.mozilla.fenix.mvi.UIComponent import org.mozilla.fenix.mvi.UIComponentViewModelBase import org.mozilla.fenix.mvi.UIComponentViewModelProvider +import org.mozilla.fenix.mvi.ViewState +import mozilla.components.feature.tab.collections.Tab as ComponentTab +import mozilla.components.feature.tab.collections.TabCollection as ACTabCollection class SessionControlComponent( private val container: ViewGroup, @@ -83,6 +84,13 @@ sealed class Mode { object Normal : Mode() object Private : Mode() data class Onboarding(val state: OnboardingState) : Mode() + + companion object { + fun fromBrowsingMode(browsingMode: BrowsingMode) = when (browsingMode) { + BrowsingMode.Normal -> Normal + BrowsingMode.Private -> Private + } + } } data class SessionControlState( diff --git a/app/src/main/java/org/mozilla/fenix/library/LibraryPageFragment.kt b/app/src/main/java/org/mozilla/fenix/library/LibraryPageFragment.kt index 93625ba69..83be310c0 100644 --- a/app/src/main/java/org/mozilla/fenix/library/LibraryPageFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/LibraryPageFragment.kt @@ -6,7 +6,7 @@ package org.mozilla.fenix.library import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController -import org.mozilla.fenix.BrowsingModeManager +import org.mozilla.fenix.BrowsingMode import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.ext.components @@ -29,11 +29,7 @@ abstract class LibraryPageFragment : Fragment() { } } - (activity as HomeActivity).browsingModeManager.mode = if (private) { - BrowsingModeManager.Mode.Private - } else { - BrowsingModeManager.Mode.Normal - } + (activity as HomeActivity).browsingModeManager.mode = BrowsingMode.fromBoolean(private) (activity as HomeActivity).supportActionBar?.hide() } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt index 75c4041c2..4a65edfdf 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt @@ -9,7 +9,7 @@ import androidx.navigation.NavController import mozilla.components.concept.storage.BookmarkNode import mozilla.components.concept.storage.BookmarkNodeType import org.mozilla.fenix.BrowserDirection -import org.mozilla.fenix.BrowsingModeManager +import org.mozilla.fenix.BrowsingMode import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.components.FenixSnackbarPresenter @@ -125,8 +125,7 @@ class BookmarkFragmentInteractor( override fun openInNewTab(item: BookmarkNode) { require(item.type == BookmarkNodeType.ITEM) item.url?.let { url -> - activity?.browsingModeManager?.mode = - BrowsingModeManager.Mode.Normal + activity?.browsingModeManager?.mode = BrowsingMode.Normal activity?.openToBrowserAndLoad( searchTermOrURL = url, newTab = true, @@ -139,8 +138,7 @@ class BookmarkFragmentInteractor( override fun openInPrivateTab(item: BookmarkNode) { require(item.type == BookmarkNodeType.ITEM) item.url?.let { url -> - activity?.browsingModeManager?.mode = - BrowsingModeManager.Mode.Private + activity?.browsingModeManager?.mode = BrowsingMode.Private activity?.openToBrowserAndLoad( searchTermOrURL = url, newTab = true, diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt index 0a155be41..6e6853e9a 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt @@ -27,7 +27,7 @@ import kotlinx.coroutines.launch import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.support.base.feature.BackHandler import org.mozilla.fenix.BrowserDirection -import org.mozilla.fenix.BrowsingModeManager +import org.mozilla.fenix.BrowsingMode import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.components.Components @@ -194,7 +194,7 @@ class HistoryFragment : LibraryPageFragment(), BackHandler { } (activity as HomeActivity).apply { - browsingModeManager.mode = BrowsingModeManager.Mode.Private + browsingModeManager.mode = BrowsingMode.Private supportActionBar?.hide() } nav( diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt index 0d3951965..e136cb4fb 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt @@ -105,7 +105,7 @@ class SearchFragment : Fragment(), BackHandler { view.toolbar_component_wrapper, searchInteractor, historyStorageProvider(), - (activity as HomeActivity).browsingModeManager.isPrivate + (activity as HomeActivity).browsingModeManager.mode.isPrivate ) startPostponedEnterTransition() diff --git a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsSheetDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsSheetDialogFragment.kt index f798384a7..51ee7636b 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsSheetDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsSheetDialogFragment.kt @@ -36,7 +36,6 @@ import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.IntentReceiverActivity import org.mozilla.fenix.R import org.mozilla.fenix.browser.BrowserFragment -import org.mozilla.fenix.currentThemeResource import org.mozilla.fenix.exceptions.ExceptionDomains import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.requireComponents diff --git a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt index 116f5fb1f..6744e9006 100644 --- a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt @@ -22,6 +22,7 @@ import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.tabs.TabsUseCases import org.junit.Before import org.junit.Test +import org.mozilla.fenix.BrowsingMode import org.mozilla.fenix.BrowsingModeManager import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R @@ -33,7 +34,6 @@ import org.mozilla.fenix.components.Analytics import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.ext.components -import org.mozilla.fenix.ext.metrics import org.mozilla.fenix.ext.nav import org.mozilla.fenix.home.sessioncontrol.Tab import org.mozilla.fenix.home.sessioncontrol.TabCollection @@ -44,6 +44,7 @@ class DefaultBrowserToolbarControllerTest { private var context: HomeActivity = mockk(relaxed = true) private var analytics: Analytics = mockk(relaxed = true) + private val browsingModeManager: BrowsingModeManager = mockk(relaxed = true) private var navController: NavController = mockk(relaxed = true) private var findInPageLauncher: () -> Unit = mockk(relaxed = true) private val nestedScrollQuickActionView: NestedScrollView = mockk(relaxed = true) @@ -64,6 +65,7 @@ class DefaultBrowserToolbarControllerTest { controller = DefaultBrowserToolbarController( context = context, navController = navController, + browsingModeManager = browsingModeManager, findInPageLauncher = findInPageLauncher, nestedScrollQuickActionView = nestedScrollQuickActionView, engineView = engineView, @@ -213,11 +215,9 @@ class DefaultBrowserToolbarControllerTest { @Test fun handleToolbarNewPrivateTabPress() { - val browsingModeManager: BrowsingModeManager = mockk(relaxed = true) val item = ToolbarMenu.Item.NewPrivateTab - every { context.browsingModeManager } returns browsingModeManager - every { browsingModeManager.mode } returns BrowsingModeManager.Mode.Normal + every { browsingModeManager.mode } returns BrowsingMode.Normal controller.handleToolbarItemInteraction(item) @@ -227,7 +227,7 @@ class DefaultBrowserToolbarControllerTest { .actionBrowserFragmentToSearchFragment(null) navController.nav(R.id.browserFragment, directions) } - verify { browsingModeManager.mode = BrowsingModeManager.Mode.Private } + verify { browsingModeManager.mode = BrowsingMode.Private } } @Test @@ -281,11 +281,9 @@ class DefaultBrowserToolbarControllerTest { @Test fun handleToolbarNewTabPress() { - val browsingModeManager: BrowsingModeManager = mockk(relaxed = true) val item = ToolbarMenu.Item.NewTab - every { context.browsingModeManager } returns browsingModeManager - every { browsingModeManager.mode } returns BrowsingModeManager.Mode.Private + every { browsingModeManager.mode } returns BrowsingMode.Private controller.handleToolbarItemInteraction(item) @@ -295,7 +293,7 @@ class DefaultBrowserToolbarControllerTest { .actionBrowserFragmentToSearchFragment(null) navController.nav(R.id.browserFragment, directions) } - verify { browsingModeManager.mode = BrowsingModeManager.Mode.Normal } + verify { browsingModeManager.mode = BrowsingMode.Normal } } @Test