* For #514 & #5742: Updates "launch links in private tab" functionality * Fixes commentsmaster
parent
4a0917ba32
commit
371e2ac3d8
|
@ -123,6 +123,55 @@
|
||||||
android:resource="@mipmap/ic_launcher" />
|
android:resource="@mipmap/ic_launcher" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<!-- Launch in private mode alias -->
|
||||||
|
<activity-alias
|
||||||
|
android:name="org.mozilla.fenix.alias.IntentReceiverActivity"
|
||||||
|
android:label="@string/app_name_private"
|
||||||
|
android:icon="@mipmap/ic_launcher_private"
|
||||||
|
android:roundIcon="@mipmap/ic_launcher_private_round"
|
||||||
|
android:targetActivity=".IntentReceiverActivity">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
|
||||||
|
<data android:scheme="http" />
|
||||||
|
<data android:scheme="https" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
|
||||||
|
<data android:scheme="http" />
|
||||||
|
<data android:scheme="https" />
|
||||||
|
<data android:mimeType="text/html" />
|
||||||
|
<data android:mimeType="text/plain" />
|
||||||
|
<data android:mimeType="application/xhtml+xml" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.SEND" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<data android:mimeType="text/plain" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.ASSIST" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.android.systemui.action_assist_icon"
|
||||||
|
android:resource="@mipmap/ic_launcher_private" />
|
||||||
|
<meta-data
|
||||||
|
android:name="org.mozilla.fenix.LAUNCH_PRIVATE_LINK"
|
||||||
|
android:value="true" />
|
||||||
|
</activity-alias>
|
||||||
|
|
||||||
<activity android:name=".widget.VoiceSearchActivity" />
|
<activity android:name=".widget.VoiceSearchActivity" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
|
|
|
@ -29,6 +29,7 @@ import mozilla.components.service.fxa.sync.SyncReason
|
||||||
import mozilla.components.support.base.feature.BackHandler
|
import mozilla.components.support.base.feature.BackHandler
|
||||||
import mozilla.components.support.ktx.kotlin.isUrl
|
import mozilla.components.support.ktx.kotlin.isUrl
|
||||||
import mozilla.components.support.ktx.kotlin.toNormalizedUrl
|
import mozilla.components.support.ktx.kotlin.toNormalizedUrl
|
||||||
|
import mozilla.components.support.utils.Browsers
|
||||||
import mozilla.components.support.utils.SafeIntent
|
import mozilla.components.support.utils.SafeIntent
|
||||||
import mozilla.components.support.utils.toSafeIntent
|
import mozilla.components.support.utils.toSafeIntent
|
||||||
import org.mozilla.fenix.browser.UriOpenedObserver
|
import org.mozilla.fenix.browser.UriOpenedObserver
|
||||||
|
@ -57,6 +58,7 @@ import org.mozilla.fenix.settings.SettingsFragmentDirections
|
||||||
import org.mozilla.fenix.settings.TrackingProtectionFragmentDirections
|
import org.mozilla.fenix.settings.TrackingProtectionFragmentDirections
|
||||||
import org.mozilla.fenix.theme.DefaultThemeManager
|
import org.mozilla.fenix.theme.DefaultThemeManager
|
||||||
import org.mozilla.fenix.theme.ThemeManager
|
import org.mozilla.fenix.theme.ThemeManager
|
||||||
|
import java.lang.ref.WeakReference
|
||||||
|
|
||||||
@SuppressWarnings("TooManyFunctions", "LargeClass")
|
@SuppressWarnings("TooManyFunctions", "LargeClass")
|
||||||
open class HomeActivity : AppCompatActivity() {
|
open class HomeActivity : AppCompatActivity() {
|
||||||
|
@ -107,6 +109,9 @@ open class HomeActivity : AppCompatActivity() {
|
||||||
@CallSuper
|
@CallSuper
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
|
|
||||||
|
unsetOpenLinksInAPrivateTab()
|
||||||
|
|
||||||
lifecycleScope.launch {
|
lifecycleScope.launch {
|
||||||
with(components.backgroundServices) {
|
with(components.backgroundServices) {
|
||||||
// Make sure accountManager is initialized.
|
// Make sure accountManager is initialized.
|
||||||
|
@ -120,6 +125,21 @@ open class HomeActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun unsetOpenLinksInAPrivateTab() {
|
||||||
|
// Toggle off the open_link_in_private_tab pref if we are no longer set as the default browser
|
||||||
|
// We do this on a separate thread to alleviate performance issues
|
||||||
|
val weakReferenceContext = WeakReference(this)
|
||||||
|
lifecycleScope.launch {
|
||||||
|
val context = weakReferenceContext.get() ?: return@launch
|
||||||
|
if (!Browsers.all(context).isDefaultBrowser) {
|
||||||
|
context.settings().preferences
|
||||||
|
.edit()
|
||||||
|
.putBoolean(context.getString(R.string.pref_key_open_links_in_a_private_tab), false)
|
||||||
|
.apply()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles intents received when the activity is open.
|
* Handles intents received when the activity is open.
|
||||||
*/
|
*/
|
||||||
|
@ -251,8 +271,8 @@ open class HomeActivity : AppCompatActivity() {
|
||||||
AboutFragmentDirections.actionAboutFragmentToBrowserFragment(customTabSessionId)
|
AboutFragmentDirections.actionAboutFragmentToBrowserFragment(customTabSessionId)
|
||||||
BrowserDirection.FromTrackingProtection ->
|
BrowserDirection.FromTrackingProtection ->
|
||||||
TrackingProtectionFragmentDirections.actionTrackingProtectionFragmentToBrowserFragment(
|
TrackingProtectionFragmentDirections.actionTrackingProtectionFragmentToBrowserFragment(
|
||||||
customTabSessionId
|
customTabSessionId
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun load(
|
private fun load(
|
||||||
|
|
|
@ -6,11 +6,13 @@ package org.mozilla.fenix
|
||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.content.pm.PackageManager
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.annotation.VisibleForTesting
|
import androidx.annotation.VisibleForTesting
|
||||||
import kotlinx.coroutines.MainScope
|
import kotlinx.coroutines.MainScope
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import mozilla.components.feature.intent.processing.TabIntentProcessor
|
import mozilla.components.feature.intent.processing.TabIntentProcessor
|
||||||
|
import mozilla.components.support.utils.Browsers
|
||||||
import org.mozilla.fenix.customtabs.AuthCustomTabActivity
|
import org.mozilla.fenix.customtabs.AuthCustomTabActivity
|
||||||
import org.mozilla.fenix.customtabs.AuthCustomTabActivity.Companion.EXTRA_AUTH_CUSTOM_TAB
|
import org.mozilla.fenix.customtabs.AuthCustomTabActivity.Companion.EXTRA_AUTH_CUSTOM_TAB
|
||||||
import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity
|
import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity
|
||||||
|
@ -37,7 +39,22 @@ class IntentReceiverActivity : Activity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun processIntent(intent: Intent) {
|
suspend fun processIntent(intent: Intent) {
|
||||||
val tabIntentProcessor = if (settings().launchLinksInPrivateTab) {
|
val didLaunchPrivateLink = packageManager
|
||||||
|
?.getActivityInfo(componentName, PackageManager.GET_META_DATA)
|
||||||
|
?.metaData
|
||||||
|
?.getBoolean(LAUNCH_PRIVATE_LINK) ?: false
|
||||||
|
|
||||||
|
/* If LAUNCH_PRIVATE_LINK is set AND we're the default browser they must have pressed "always."
|
||||||
|
This is because LAUNCH_PRIVATE_LINK is only accessible through the "launch browser intent" menu
|
||||||
|
Which only appears if the user doesn't have a default set. */
|
||||||
|
if (didLaunchPrivateLink && Browsers.all(this).isDefaultBrowser) {
|
||||||
|
this.settings().openLinksInAPrivateTab = true
|
||||||
|
} else if (!Browsers.all(this).isDefaultBrowser) {
|
||||||
|
/* If the user has unset us as the default browser, unset alwaysOpenInPrivateMode */
|
||||||
|
this.settings().openLinksInAPrivateTab = false
|
||||||
|
}
|
||||||
|
|
||||||
|
val tabIntentProcessor = if (settings().openLinksInAPrivateTab || didLaunchPrivateLink) {
|
||||||
components.intentProcessors.privateIntentProcessor
|
components.intentProcessors.privateIntentProcessor
|
||||||
} else {
|
} else {
|
||||||
components.intentProcessors.intentProcessor
|
components.intentProcessors.intentProcessor
|
||||||
|
@ -105,6 +122,9 @@ class IntentReceiverActivity : Activity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
// This constant must match the metadata from the private activity-alias
|
||||||
|
const val LAUNCH_PRIVATE_LINK = "org.mozilla.fenix.LAUNCH_PRIVATE_LINK"
|
||||||
|
|
||||||
const val ACTION_OPEN_TAB = "org.mozilla.fenix.OPEN_TAB"
|
const val ACTION_OPEN_TAB = "org.mozilla.fenix.OPEN_TAB"
|
||||||
const val ACTION_OPEN_PRIVATE_TAB = "org.mozilla.fenix.OPEN_PRIVATE_TAB"
|
const val ACTION_OPEN_PRIVATE_TAB = "org.mozilla.fenix.OPEN_PRIVATE_TAB"
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,105 @@
|
||||||
|
/* 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.mozilla.fenix.settings
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.SharedPreferences
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Build.VERSION.SDK_INT
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.provider.Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.preference.CheckBoxPreference
|
||||||
|
import androidx.preference.Preference
|
||||||
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
|
import mozilla.components.support.utils.Browsers
|
||||||
|
import org.mozilla.fenix.R
|
||||||
|
import org.mozilla.fenix.ext.components
|
||||||
|
import org.mozilla.fenix.ext.getPreferenceKey
|
||||||
|
import org.mozilla.fenix.ext.settings
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lets the user control their default browser preferences
|
||||||
|
*/
|
||||||
|
class DefaultBrowserSettingsFragment : PreferenceFragmentCompat() {
|
||||||
|
|
||||||
|
private val preferenceChangeListener =
|
||||||
|
SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key ->
|
||||||
|
when (key) {
|
||||||
|
getPreferenceKey(R.string.pref_key_telemetry) -> {
|
||||||
|
if (sharedPreferences.getBoolean(key, requireContext().settings().isTelemetryEnabled)) {
|
||||||
|
context?.components?.analytics?.metrics?.start()
|
||||||
|
} else {
|
||||||
|
context?.components?.analytics?.metrics?.stop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
context?.let {
|
||||||
|
preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(preferenceChangeListener)
|
||||||
|
}
|
||||||
|
|
||||||
|
val makeDefaultBrowserKey = getPreferenceKey(R.string.pref_key_make_default_browser)
|
||||||
|
val preferenceMakeDefaultBrowser = findPreference<Preference>(makeDefaultBrowserKey)
|
||||||
|
|
||||||
|
preferenceMakeDefaultBrowser?.onPreferenceClickListener =
|
||||||
|
getClickListenerForMakeDefaultBrowser()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
(activity as AppCompatActivity).title = getString(R.string.preferences_set_as_default_browser)
|
||||||
|
(activity as AppCompatActivity).supportActionBar?.show()
|
||||||
|
|
||||||
|
updatePreferences()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
context?.let {
|
||||||
|
preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener)
|
||||||
|
}
|
||||||
|
super.onDestroy()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||||
|
setPreferencesFromResource(R.xml.default_browser_preferences, rootKey)
|
||||||
|
updatePreferences()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updatePreferences() {
|
||||||
|
findPreference<DefaultBrowserPreference>(getPreferenceKey(R.string.pref_key_make_default_browser))
|
||||||
|
?.updateSwitch()
|
||||||
|
|
||||||
|
findPreference<CheckBoxPreference>(getPreferenceKey(R.string.pref_key_open_links_in_a_private_tab))?.apply {
|
||||||
|
isEnabled = Browsers.all(requireContext()).isDefaultBrowser
|
||||||
|
isChecked = context.settings().openLinksInAPrivateTab
|
||||||
|
onPreferenceChangeListener = SharedPreferenceUpdater()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getClickListenerForMakeDefaultBrowser(): Preference.OnPreferenceClickListener {
|
||||||
|
return if (SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
|
Preference.OnPreferenceClickListener {
|
||||||
|
val intent = Intent(
|
||||||
|
ACTION_MANAGE_DEFAULT_APPS_SETTINGS
|
||||||
|
)
|
||||||
|
startActivity(intent)
|
||||||
|
true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
defaultClickListener
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val defaultClickListener =
|
||||||
|
Preference.OnPreferenceClickListener { preference ->
|
||||||
|
Toast.makeText(context, "${preference.title} Clicked", Toast.LENGTH_SHORT).show()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,8 +12,6 @@ import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Build.VERSION.SDK_INT
|
import android.os.Build.VERSION.SDK_INT
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.provider.Settings
|
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.navigation.Navigation
|
import androidx.navigation.Navigation
|
||||||
|
@ -22,7 +20,6 @@ import androidx.preference.Preference
|
||||||
import androidx.preference.Preference.OnPreferenceClickListener
|
import androidx.preference.Preference.OnPreferenceClickListener
|
||||||
import androidx.preference.PreferenceCategory
|
import androidx.preference.PreferenceCategory
|
||||||
import androidx.preference.PreferenceFragmentCompat
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
import androidx.preference.SwitchPreference
|
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import mozilla.components.concept.sync.AccountObserver
|
import mozilla.components.concept.sync.AccountObserver
|
||||||
import mozilla.components.concept.sync.AuthType
|
import mozilla.components.concept.sync.AuthType
|
||||||
|
@ -44,7 +41,6 @@ import org.mozilla.fenix.R.string.pref_key_delete_browsing_data
|
||||||
import org.mozilla.fenix.R.string.pref_key_delete_browsing_data_on_quit_preference
|
import org.mozilla.fenix.R.string.pref_key_delete_browsing_data_on_quit_preference
|
||||||
import org.mozilla.fenix.R.string.pref_key_help
|
import org.mozilla.fenix.R.string.pref_key_help
|
||||||
import org.mozilla.fenix.R.string.pref_key_language
|
import org.mozilla.fenix.R.string.pref_key_language
|
||||||
import org.mozilla.fenix.R.string.pref_key_launch_links_in_private_tab
|
|
||||||
import org.mozilla.fenix.R.string.pref_key_leakcanary
|
import org.mozilla.fenix.R.string.pref_key_leakcanary
|
||||||
import org.mozilla.fenix.R.string.pref_key_make_default_browser
|
import org.mozilla.fenix.R.string.pref_key_make_default_browser
|
||||||
import org.mozilla.fenix.R.string.pref_key_privacy_link
|
import org.mozilla.fenix.R.string.pref_key_privacy_link
|
||||||
|
@ -100,7 +96,7 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver {
|
||||||
preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(preferenceChangeListener)
|
preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(preferenceChangeListener)
|
||||||
|
|
||||||
if (SDK_INT <= Build.VERSION_CODES.M) {
|
if (SDK_INT <= Build.VERSION_CODES.M) {
|
||||||
findPreference<DefaultBrowserPreference>(getPreferenceKey(R.string.pref_key_make_default_browser))?.apply {
|
findPreference<DefaultBrowserPreference>(getPreferenceKey(pref_key_make_default_browser))?.apply {
|
||||||
isVisible = false
|
isVisible = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -115,9 +111,6 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver {
|
||||||
|
|
||||||
(activity as AppCompatActivity).title = getString(R.string.settings_title)
|
(activity as AppCompatActivity).title = getString(R.string.settings_title)
|
||||||
(activity as AppCompatActivity).supportActionBar?.show()
|
(activity as AppCompatActivity).supportActionBar?.show()
|
||||||
val defaultBrowserPreference =
|
|
||||||
findPreference<DefaultBrowserPreference>(getPreferenceKey(R.string.pref_key_make_default_browser))
|
|
||||||
defaultBrowserPreference?.updateSwitch()
|
|
||||||
|
|
||||||
val trackingProtectionPreference =
|
val trackingProtectionPreference =
|
||||||
findPreference<Preference>(getPreferenceKey(R.string.pref_key_tracking_protection_settings))
|
findPreference<Preference>(getPreferenceKey(R.string.pref_key_tracking_protection_settings))
|
||||||
|
@ -166,6 +159,9 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver {
|
||||||
// TODO #220
|
// TODO #220
|
||||||
ItsNotBrokenSnack(context!!).showSnackbar(issueNumber = "220")
|
ItsNotBrokenSnack(context!!).showSnackbar(issueNumber = "220")
|
||||||
}
|
}
|
||||||
|
resources.getString(pref_key_make_default_browser) -> {
|
||||||
|
navigateToDefaultBrowserFragment()
|
||||||
|
}
|
||||||
resources.getString(pref_key_data_choices) -> {
|
resources.getString(pref_key_data_choices) -> {
|
||||||
navigateToDataChoices()
|
navigateToDataChoices()
|
||||||
}
|
}
|
||||||
|
@ -239,25 +235,11 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupPreferences() {
|
private fun setupPreferences() {
|
||||||
val makeDefaultBrowserKey = getPreferenceKey(pref_key_make_default_browser)
|
|
||||||
val leakKey = getPreferenceKey(pref_key_leakcanary)
|
val leakKey = getPreferenceKey(pref_key_leakcanary)
|
||||||
val debuggingKey = getPreferenceKey(pref_key_remote_debugging)
|
val debuggingKey = getPreferenceKey(pref_key_remote_debugging)
|
||||||
val preferenceLaunchLinksPrivateTabKey = getPreferenceKey(
|
|
||||||
pref_key_launch_links_in_private_tab
|
|
||||||
)
|
|
||||||
|
|
||||||
val preferenceMakeDefaultBrowser = findPreference<Preference>(makeDefaultBrowserKey)
|
|
||||||
val preferenceLeakCanary = findPreference<Preference>(leakKey)
|
val preferenceLeakCanary = findPreference<Preference>(leakKey)
|
||||||
val preferenceRemoteDebugging = findPreference<Preference>(debuggingKey)
|
val preferenceRemoteDebugging = findPreference<Preference>(debuggingKey)
|
||||||
val preferenceLaunchLinksInPrivateTab = findPreference<SwitchPreference>(preferenceLaunchLinksPrivateTabKey)
|
|
||||||
|
|
||||||
preferenceLaunchLinksInPrivateTab?.setOnPreferenceClickListener {
|
|
||||||
requireContext().settings().launchLinksInPrivateTab = !requireContext().settings().launchLinksInPrivateTab
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
preferenceMakeDefaultBrowser?.onPreferenceClickListener =
|
|
||||||
getClickListenerForMakeDefaultBrowser()
|
|
||||||
|
|
||||||
if (!Config.channel.isReleased) {
|
if (!Config.channel.isReleased) {
|
||||||
preferenceLeakCanary?.setOnPreferenceChangeListener { _, newValue ->
|
preferenceLeakCanary?.setOnPreferenceChangeListener { _, newValue ->
|
||||||
|
@ -274,25 +256,6 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val defaultClickListener = OnPreferenceClickListener { preference ->
|
|
||||||
Toast.makeText(context, "${preference.title} Clicked", Toast.LENGTH_SHORT).show()
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getClickListenerForMakeDefaultBrowser(): OnPreferenceClickListener {
|
|
||||||
return if (SDK_INT >= Build.VERSION_CODES.N) {
|
|
||||||
OnPreferenceClickListener {
|
|
||||||
val intent = Intent(
|
|
||||||
Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS
|
|
||||||
)
|
|
||||||
startActivity(intent)
|
|
||||||
true
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
defaultClickListener
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun navigateToSearchEngineSettings() {
|
private fun navigateToSearchEngineSettings() {
|
||||||
val directions = SettingsFragmentDirections.actionSettingsFragmentToSearchEngineFragment()
|
val directions = SettingsFragmentDirections.actionSettingsFragmentToSearchEngineFragment()
|
||||||
Navigation.findNavController(view!!).navigate(directions)
|
Navigation.findNavController(view!!).navigate(directions)
|
||||||
|
@ -319,6 +282,11 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver {
|
||||||
Navigation.findNavController(view!!).navigate(directions)
|
Navigation.findNavController(view!!).navigate(directions)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun navigateToDefaultBrowserFragment() {
|
||||||
|
val directions = SettingsFragmentDirections.actionSettingsFragmentToDefaultBrowserFragment()
|
||||||
|
Navigation.findNavController(view!!).navigate(directions)
|
||||||
|
}
|
||||||
|
|
||||||
private fun navigateToDataChoices() {
|
private fun navigateToDataChoices() {
|
||||||
val directions = SettingsFragmentDirections.actionSettingsFragmentToDataChoicesFragment()
|
val directions = SettingsFragmentDirections.actionSettingsFragmentToDataChoicesFragment()
|
||||||
Navigation.findNavController(view!!).navigate(directions)
|
Navigation.findNavController(view!!).navigate(directions)
|
||||||
|
|
|
@ -95,8 +95,8 @@ class Settings private constructor(
|
||||||
default = false
|
default = false
|
||||||
)
|
)
|
||||||
|
|
||||||
var launchLinksInPrivateTab by booleanPreference(
|
var openLinksInAPrivateTab by booleanPreference(
|
||||||
appContext.getPreferenceKey(R.string.pref_key_launch_links_in_private_tab),
|
appContext.getPreferenceKey(R.string.pref_key_open_links_in_a_private_tab),
|
||||||
default = false
|
default = false
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
<?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/. -->
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?android:selectableItemBackground"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:minHeight="?android:attr/listPreferredItemHeight"
|
||||||
|
android:paddingStart="8dp"
|
||||||
|
android:paddingEnd="?android:attr/scrollbarSize">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@android:id/widget_frame"
|
||||||
|
android:layout_width="48dp"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:orientation="vertical"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@android:id/title"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textColor="@color/state_list_text_color"
|
||||||
|
android:textSize="16sp"
|
||||||
|
app:layout_constraintBottom_toTopOf="@android:id/summary"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toEndOf="@android:id/widget_frame"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintVertical_chainStyle="packed"
|
||||||
|
tools:text="Delete browsing data category" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@android:id/summary"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textColor="@color/secondary_state_list_text_color"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toEndOf="@android:id/widget_frame"
|
||||||
|
app:layout_constraintTop_toBottomOf="@android:id/title"
|
||||||
|
app:layout_constraintVertical_chainStyle="packed"
|
||||||
|
tools:text="Delete browsing data summary" />
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -12,7 +12,7 @@
|
||||||
android:focusable="true"
|
android:focusable="true"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:minHeight="?android:attr/listPreferredItemHeight"
|
android:minHeight="?android:attr/listPreferredItemHeight"
|
||||||
android:paddingStart="64dp"
|
android:paddingStart="8dp"
|
||||||
android:paddingEnd="?android:attr/scrollbarSize">
|
android:paddingEnd="?android:attr/scrollbarSize">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
|
|
@ -26,20 +26,20 @@
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintBottom_toBottomOf="parent">
|
app:layout_constraintBottom_toBottomOf="parent">
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
<org.mozilla.fenix.settings.deletebrowsingdata.DeleteBrowsingDataItem
|
||||||
|
android:id="@+id/open_tabs_item"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical">
|
android:layout_marginTop="8dp"
|
||||||
<org.mozilla.fenix.settings.deletebrowsingdata.DeleteBrowsingDataItem
|
android:layout_marginBottom="8dp"
|
||||||
android:id="@+id/open_tabs_item"
|
android:background="?android:attr/selectableItemBackground"
|
||||||
android:layout_width="match_parent"
|
android:clickable="true"
|
||||||
android:layout_height="wrap_content"
|
android:focusable="true"
|
||||||
android:layout_marginTop="8dp"
|
app:deleteBrowsingDataItemTitle="@string/preferences_delete_browsing_data_tabs_title"
|
||||||
android:layout_marginBottom="8dp"
|
app:deleteBrowsingDataItemSubtitle="@string/preferences_delete_browsing_data_tabs_subtitle" />
|
||||||
android:background="?android:attr/selectableItemBackground"
|
|
||||||
android:clickable="true"
|
|
||||||
android:focusable="true"
|
|
||||||
app:deleteBrowsingDataItemTitle="@string/preferences_delete_browsing_data_tabs_title"
|
|
||||||
app:deleteBrowsingDataItemSubtitle="@string/preferences_delete_browsing_data_tabs_subtitle" />
|
|
||||||
<org.mozilla.fenix.settings.deletebrowsingdata.DeleteBrowsingDataItem
|
<org.mozilla.fenix.settings.deletebrowsingdata.DeleteBrowsingDataItem
|
||||||
android:id="@+id/browsing_data_item"
|
android:id="@+id/browsing_data_item"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|
|
@ -361,6 +361,9 @@
|
||||||
<action
|
<action
|
||||||
android:id="@+id/action_settingsFragment_to_deleteBrowsingDataOnQuitFragment"
|
android:id="@+id/action_settingsFragment_to_deleteBrowsingDataOnQuitFragment"
|
||||||
app:destination="@id/deleteBrowsingDataOnQuitFragment" />
|
app:destination="@id/deleteBrowsingDataOnQuitFragment" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_settingsFragment_to_defaultBrowserFragment"
|
||||||
|
app:destination="@id/defaultBrowserFragment" />
|
||||||
</fragment>
|
</fragment>
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/dataChoicesFragment"
|
android:id="@+id/dataChoicesFragment"
|
||||||
|
@ -585,4 +588,8 @@
|
||||||
android:id="@+id/addNewDeviceFragment"
|
android:id="@+id/addNewDeviceFragment"
|
||||||
android:name="org.mozilla.fenix.share.AddNewDeviceFragment"
|
android:name="org.mozilla.fenix.share.AddNewDeviceFragment"
|
||||||
android:label="AddNewDeviceFragment" />
|
android:label="AddNewDeviceFragment" />
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/defaultBrowserFragment"
|
||||||
|
android:name="org.mozilla.fenix.settings.DefaultBrowserSettingsFragment"
|
||||||
|
android:label="DefaultBrowserFragment" />
|
||||||
</navigation>
|
</navigation>
|
||||||
|
|
|
@ -100,7 +100,7 @@
|
||||||
<string name="pref_key_tracking_protection_onboarding" translatable="false">pref_key_tracking_protection_onboarding</string>
|
<string name="pref_key_tracking_protection_onboarding" translatable="false">pref_key_tracking_protection_onboarding</string>
|
||||||
|
|
||||||
<!-- Privacy Settings -->
|
<!-- Privacy Settings -->
|
||||||
<string name="pref_key_launch_links_in_private_tab" translatable="false">pref_key_launch_links_in_private_tab</string>
|
<string name="pref_key_open_links_in_a_private_tab" translatable="false">pref_key_open_links_in_a_private_tab</string>
|
||||||
|
|
||||||
<!-- Quick Action Sheet -->
|
<!-- Quick Action Sheet -->
|
||||||
<string name="pref_key_bounce_quick_action" translatable="false">pref_key_bounce_quick_action</string>
|
<string name="pref_key_bounce_quick_action" translatable="false">pref_key_bounce_quick_action</string>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||||
<resources>
|
<resources>
|
||||||
<!-- App name for private browsing mode, only the "(Private)" portion should be localized. -->
|
<!-- App name for private browsing mode, only the "(Private)" portion should be localized. -->
|
||||||
<string name="app_name_private">Firefox Preview (Private)</string>
|
<string name="app_name_private">Private Firefox Preview</string>
|
||||||
|
|
||||||
<!-- Home Fragment -->
|
<!-- Home Fragment -->
|
||||||
<!-- Content description (not visible, for screen readers etc.): "Three dot" menu button. -->
|
<!-- Content description (not visible, for screen readers etc.): "Three dot" menu button. -->
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?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/. -->
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
<org.mozilla.fenix.settings.DefaultBrowserPreference
|
||||||
|
android:key="@string/pref_key_make_default_browser"
|
||||||
|
android:title="@string/preferences_set_as_default_browser"
|
||||||
|
app:iconSpaceReserved="false" />
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:layout="@layout/checkbox_left_preference"
|
||||||
|
android:key="@string/pref_key_open_links_in_a_private_tab"
|
||||||
|
android:title="@string/preferences_open_links_in_a_private_tab" />
|
||||||
|
</PreferenceScreen>
|
|
@ -46,7 +46,8 @@
|
||||||
android:key="@string/pref_key_accessibility"
|
android:key="@string/pref_key_accessibility"
|
||||||
android:title="@string/preferences_accessibility" />
|
android:title="@string/preferences_accessibility" />
|
||||||
|
|
||||||
<org.mozilla.fenix.settings.DefaultBrowserPreference
|
<androidx.preference.Preference
|
||||||
|
android:icon="@drawable/ic_internet"
|
||||||
android:key="@string/pref_key_make_default_browser"
|
android:key="@string/pref_key_make_default_browser"
|
||||||
android:title="@string/preferences_set_as_default_browser" />
|
android:title="@string/preferences_set_as_default_browser" />
|
||||||
</androidx.preference.PreferenceCategory>
|
</androidx.preference.PreferenceCategory>
|
||||||
|
@ -58,10 +59,6 @@
|
||||||
android:icon="@drawable/ic_tracking_protection_enabled"
|
android:icon="@drawable/ic_tracking_protection_enabled"
|
||||||
android:key="@string/pref_key_tracking_protection_settings"
|
android:key="@string/pref_key_tracking_protection_settings"
|
||||||
android:title="@string/preference_enhanced_tracking_protection" />
|
android:title="@string/preference_enhanced_tracking_protection" />
|
||||||
<androidx.preference.SwitchPreference
|
|
||||||
android:defaultValue="false"
|
|
||||||
android:key="@string/pref_key_launch_links_in_private_tab"
|
|
||||||
android:title="@string/preferences_open_links_in_a_private_tab" />
|
|
||||||
<androidx.preference.Preference
|
<androidx.preference.Preference
|
||||||
android:icon="@drawable/ic_private_browsing"
|
android:icon="@drawable/ic_private_browsing"
|
||||||
android:key="@string/pref_key_add_private_browsing_shortcut"
|
android:key="@string/pref_key_add_private_browsing_shortcut"
|
||||||
|
|
|
@ -29,7 +29,7 @@ class IntentReceiverActivityTest {
|
||||||
@Test
|
@Test
|
||||||
fun `process intent with launchLinksInPrivateTab set to true`() {
|
fun `process intent with launchLinksInPrivateTab set to true`() {
|
||||||
runBlockingTest {
|
runBlockingTest {
|
||||||
testContext.settings().launchLinksInPrivateTab = true
|
testContext.settings().openLinksInAPrivateTab = true
|
||||||
|
|
||||||
val intent = Intent()
|
val intent = Intent()
|
||||||
`when`(testContext.components.intentProcessors.privateIntentProcessor.process(intent)).thenReturn(true)
|
`when`(testContext.components.intentProcessors.privateIntentProcessor.process(intent)).thenReturn(true)
|
||||||
|
@ -46,7 +46,7 @@ class IntentReceiverActivityTest {
|
||||||
@Test
|
@Test
|
||||||
fun `process intent with launchLinksInPrivateTab set to false`() {
|
fun `process intent with launchLinksInPrivateTab set to false`() {
|
||||||
runBlockingTest {
|
runBlockingTest {
|
||||||
testContext.settings().launchLinksInPrivateTab = false
|
testContext.settings().openLinksInAPrivateTab = false
|
||||||
|
|
||||||
val intent = Intent()
|
val intent = Intent()
|
||||||
`when`(testContext.components.intentProcessors.intentProcessor.process(intent)).thenReturn(true)
|
`when`(testContext.components.intentProcessors.intentProcessor.process(intent)).thenReturn(true)
|
||||||
|
|
|
@ -58,16 +58,16 @@ class SettingsTest {
|
||||||
fun launchLinksInPrivateTab() {
|
fun launchLinksInPrivateTab() {
|
||||||
// When just created
|
// When just created
|
||||||
// Then
|
// Then
|
||||||
assertFalse(settings.launchLinksInPrivateTab)
|
assertFalse(settings.openLinksInAPrivateTab)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
settings.launchLinksInPrivateTab = true
|
settings.openLinksInAPrivateTab = true
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
assertTrue(settings.launchLinksInPrivateTab)
|
assertTrue(settings.openLinksInAPrivateTab)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
settings.launchLinksInPrivateTab = false
|
settings.openLinksInAPrivateTab = false
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
assertFalse(settings.usePrivateMode)
|
assertFalse(settings.usePrivateMode)
|
||||||
|
|
Loading…
Reference in New Issue