Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
The Tor Project
Applications
fenix
Commits
87f547bd
Commit
87f547bd
authored
Sep 10, 2020
by
Matthew Finkel
Browse files
Bug 40028: Integrate Tor Controller into HomeFragment
parent
cf96812e
Changes
6
Hide whitespace changes
Inline
Side-by-side
app/src/main/java/org/mozilla/fenix/FenixApplication.kt
View file @
87f547bd
...
...
@@ -53,6 +53,7 @@ import org.mozilla.fenix.push.WebPushEngineIntegration
import
org.mozilla.fenix.session.PerformanceActivityLifecycleCallbacks
import
org.mozilla.fenix.session.VisibilityLifecycleCallback
import
org.mozilla.fenix.utils.BrowsersCache
import
org.torproject.android.service.util.Prefs
/**
*The main application class for Fenix. Records data to measure initialization performance.
...
...
@@ -95,6 +96,11 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
setupInMainProcessOnly
()
}
override
fun
onTerminate
()
{
super
.
onTerminate
()
components
.
torController
.
stop
()
}
protected
open
fun
initializeGlean
()
{
val
telemetryEnabled
=
settings
().
isTelemetryEnabled
...
...
@@ -143,6 +149,9 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
if
(!
megazordSetup
.
isCompleted
)
{
runBlocking
{
megazordSetup
.
await
();
}
}
// Give TAS the base Context
Prefs
.
setContext
(
applicationContext
)
}
setupLeakCanary
()
...
...
@@ -161,6 +170,7 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
initVisualCompletenessQueueAndQueueTasks
()
components
.
appStartupTelemetry
.
onFenixApplicationOnCreate
()
components
.
torController
.
start
()
}
private
fun
restoreDownloads
()
{
...
...
app/src/main/java/org/mozilla/fenix/HomeActivity.kt
View file @
87f547bd
...
...
@@ -4,10 +4,9 @@
package
org.mozilla.fenix
import
android.
content.BroadcastReceiver
import
android.
app.PendingIntent
import
android.content.Context
import
android.content.Intent
import
android.content.IntentFilter
import
android.content.res.Configuration
import
android.os.Build
import
android.os.Bundle
...
...
@@ -25,7 +24,6 @@ import androidx.annotation.VisibleForTesting.PROTECTED
import
androidx.appcompat.app.ActionBar
import
androidx.appcompat.widget.Toolbar
import
androidx.lifecycle.lifecycleScope
import
androidx.localbroadcastmanager.content.LocalBroadcastManager
import
androidx.navigation.NavDestination
import
androidx.navigation.NavDirections
import
androidx.navigation.fragment.NavHostFragment
...
...
@@ -105,9 +103,6 @@ import org.mozilla.fenix.tabtray.TabTrayDialogFragmentDirections
import
org.mozilla.fenix.theme.DefaultThemeManager
import
org.mozilla.fenix.theme.ThemeManager
import
org.mozilla.fenix.utils.BrowsersCache
import
org.torproject.android.service.TorService
import
org.torproject.android.service.TorServiceConstants
import
org.torproject.android.service.util.Prefs
import
java.lang.ref.WeakReference
/**
...
...
@@ -155,9 +150,6 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
private
lateinit
var
navigationToolbar
:
Toolbar
final
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
// Give Orbot the base Context
Prefs
.
setContext
(
applicationContext
)
StrictModeManager
.
changeStrictModePolicies
(
supportFragmentManager
)
// There is disk read violations on some devices such as samsung and pixel for android 9/10
StrictMode
.
allowThreadDiskReads
().
resetPoliciesAfter
{
...
...
@@ -361,6 +353,10 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
)
privateNotificationObserver
?.
stop
()
components
.
torController
.
stopTor
()
// Explicitly change our internal state because the status broadcast from tor-android-service may
// arrive after we unregister the broadcast listener when the app is exiting.
components
.
torController
.
setTorStopped
()
}
override
fun
onConfigurationChanged
(
newConfig
:
Configuration
)
{
...
...
app/src/main/java/org/mozilla/fenix/components/Components.kt
View file @
87f547bd
...
...
@@ -19,6 +19,7 @@ import mozilla.components.support.migration.state.MigrationStore
import
org.mozilla.fenix.BuildConfig
import
org.mozilla.fenix.HomeActivity
import
org.mozilla.fenix.components.metrics.AppStartupTelemetry
import
org.mozilla.fenix.tor.TorController
import
org.mozilla.fenix.utils.ClipboardHandler
import
org.mozilla.fenix.utils.Mockable
import
org.mozilla.fenix.utils.Settings
...
...
@@ -121,4 +122,6 @@ class Components(private val context: Context) {
FenixReviewSettings
(
settings
)
)
}
val
torController
by
lazy
{
TorController
(
context
)
}
}
app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
View file @
87f547bd
...
...
@@ -72,6 +72,7 @@ import mozilla.components.lib.state.ext.consumeFrom
import
mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import
mozilla.components.support.ktx.android.util.dpToPx
import
org.mozilla.fenix.BrowserDirection
import
org.mozilla.fenix.BuildConfig
import
org.mozilla.fenix.FeatureFlags
import
org.mozilla.fenix.HomeActivity
import
org.mozilla.fenix.R
...
...
@@ -104,6 +105,8 @@ import org.mozilla.fenix.home.sessioncontrol.viewholders.topsites.DefaultTopSite
import
org.mozilla.fenix.onboarding.FenixOnboarding
import
org.mozilla.fenix.settings.SupportUtils
import
org.mozilla.fenix.settings.deletebrowsingdata.deleteAndQuit
import
org.mozilla.fenix.tor.TorEvents
import
org.mozilla.fenix.tor.bootstrap.TorQuickStart
import
org.mozilla.fenix.theme.ThemeManager
import
org.mozilla.fenix.utils.FragmentPreDrawManager
import
org.mozilla.fenix.utils.ToolbarPopupWindow
...
...
@@ -164,6 +167,7 @@ class HomeFragment : Fragment() {
private
lateinit
var
currentMode
:
CurrentMode
private
val
topSitesFeature
=
ViewBoundFeatureWrapper
<
TopSitesFeature
>()
private
val
torQuickStart
by
lazy
{
TorQuickStart
(
requireContext
())
}
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
super
.
onCreate
(
savedInstanceState
)
...
...
@@ -189,6 +193,9 @@ class HomeFragment : Fragment() {
currentMode
=
CurrentMode
(
view
.
context
,
onboarding
,
torQuickStart
,
!
BuildConfig
.
DISABLE_TOR
,
components
.
torController
,
browsingModeManager
,
::
dispatchModeChanges
)
...
...
@@ -242,7 +249,10 @@ class HomeFragment : Fragment() {
registerCollectionStorageObserver
=
::
registerCollectionStorageObserver
,
showDeleteCollectionPrompt
=
::
showDeleteCollectionPrompt
,
showTabTray
=
::
openTabTray
,
handleSwipedItemDeletionCancel
=
::
handleSwipedItemDeletionCancel
handleSwipedItemDeletionCancel
=
::
handleSwipedItemDeletionCancel
,
handleTorBootstrapConnect
=
::
handleTorBootstrapConnect
,
cancelTorBootstrap
=
::
cancelTorBootstrap
,
initiateTorBootstrap
=
::
initiateTorBootstrap
)
)
...
...
@@ -257,6 +267,9 @@ class HomeFragment : Fragment() {
updateSessionControlView
(
view
)
activity
.
themeManager
.
applyStatusBarTheme
(
activity
)
adjustHomeFragmentView
(
currentMode
.
getCurrentMode
(),
view
)
return
view
}
...
...
@@ -327,6 +340,44 @@ class HomeFragment : Fragment() {
}
}
private
fun
adjustHomeFragmentView
(
mode
:
Mode
,
view
:
View
?)
{
if
(
mode
==
Mode
.
Bootstrap
)
{
view
?.
sessionControlRecyclerView
?.
apply
{
setPadding
(
0
,
0
,
0
,
0
)
(
getLayoutParams
()
as
ViewGroup
.
MarginLayoutParams
).
setMargins
(
0
,
0
,
0
,
0
)
}
view
?.
homeAppBar
?.
apply
{
visibility
=
View
.
GONE
}
view
?.
toolbarLayout
?.
apply
{
visibility
=
View
.
GONE
}
}
else
{
// Keep synchronized with xml layout (somehow).
view
?.
sessionControlRecyclerView
?.
apply
{
setPadding
(
SESSION_CONTROL_VIEW_PADDING
,
SESSION_CONTROL_VIEW_PADDING
,
SESSION_CONTROL_VIEW_PADDING
,
SESSION_CONTROL_VIEW_PADDING
)
// Default margin until it is re-set below (either set immediately or after Layout)
(
getLayoutParams
()
as
ViewGroup
.
MarginLayoutParams
).
setMargins
(
0
,
0
,
0
,
DEFAULT_ONBOARDING_FINISH_MARGIN
)
}
view
?.
homeAppBar
?.
apply
{
visibility
=
View
.
VISIBLE
}
view
?.
toolbarLayout
?.
apply
{
visibility
=
View
.
VISIBLE
}
}
}
@Suppress
(
"LongMethod"
,
"ComplexMethod"
)
override
fun
onViewCreated
(
view
:
View
,
savedInstanceState
:
Bundle
?)
{
super
.
onViewCreated
(
view
,
savedInstanceState
)
...
...
@@ -617,8 +668,12 @@ class HomeFragment : Fragment() {
}
private
fun
dispatchModeChanges
(
mode
:
Mode
)
{
if
(
mode
!=
Mode
.
fromBrowsingMode
(
browsingModeManager
.
mode
))
{
homeFragmentStore
.
dispatch
(
HomeFragmentAction
.
ModeChange
(
mode
))
homeFragmentStore
.
dispatch
(
HomeFragmentAction
.
ModeChange
(
mode
))
val
localView
=
view
adjustHomeFragmentView
(
mode
,
view
)
if
(
localView
!=
null
)
{
updateSessionControlView
(
localView
)
}
}
...
...
@@ -658,6 +713,8 @@ class HomeFragment : Fragment() {
}
homeViewModel
.
layoutManagerState
=
sessionControlView
!!
.
view
.
layoutManager
?.
onSaveInstanceState
()
currentMode
.
unregisterTorListener
()
}
override
fun
onResume
()
{
...
...
@@ -989,6 +1046,18 @@ class HomeFragment : Fragment() {
view
?.
sessionControlRecyclerView
?.
adapter
?.
notifyDataSetChanged
()
}
private
fun
handleTorBootstrapConnect
()
{
requireComponents
.
torController
.
onTorConnecting
()
}
private
fun
cancelTorBootstrap
()
{
requireComponents
.
torController
.
stopTor
()
}
private
fun
initiateTorBootstrap
(
withDebugLogging
:
Boolean
=
false
)
{
requireComponents
.
torController
.
initiateTorBootstrap
(
lifecycleScope
,
withDebugLogging
)
}
companion
object
{
const
val
ALL_NORMAL_TABS
=
"all_normal"
const
val
ALL_PRIVATE_TABS
=
"all_private"
...
...
@@ -1007,5 +1076,7 @@ class HomeFragment : Fragment() {
// Layout
private
const
val
HEADER_MARGIN
=
60
private
const
val
DEFAULT_ONBOARDING_FINISH_MARGIN
=
60
private
const
val
SESSION_CONTROL_VIEW_PADDING
=
16
}
}
app/src/main/java/org/mozilla/fenix/home/Mode.kt
View file @
87f547bd
...
...
@@ -10,6 +10,9 @@ import mozilla.components.concept.sync.AuthType
import
mozilla.components.concept.sync.OAuthAccount
import
mozilla.components.concept.sync.Profile
import
mozilla.components.service.fxa.sharing.ShareableAccount
import
org.mozilla.fenix.tor.TorController
import
org.mozilla.fenix.tor.TorEvents
import
org.mozilla.fenix.tor.bootstrap.TorQuickStart
import
org.mozilla.fenix.browser.browsingmode.BrowsingMode
import
org.mozilla.fenix.browser.browsingmode.BrowsingModeManager
import
org.mozilla.fenix.ext.components
...
...
@@ -22,6 +25,7 @@ sealed class Mode {
object
Normal
:
Mode
()
object
Private
:
Mode
()
data class
Onboarding
(
val
state
:
OnboardingState
)
:
Mode
()
object
Bootstrap
:
Mode
()
companion
object
{
fun
fromBrowsingMode
(
browsingMode
:
BrowsingMode
)
=
when
(
browsingMode
)
{
...
...
@@ -43,16 +47,26 @@ sealed class OnboardingState {
object
SignedIn
:
OnboardingState
()
}
@SuppressWarnings
(
"LongParameterList"
,
"TooManyFunctions"
)
class
CurrentMode
(
private
val
context
:
Context
,
private
val
onboarding
:
FenixOnboarding
,
private
val
torQuickStart
:
TorQuickStart
,
private
val
shouldStartTor
:
Boolean
,
private
val
torController
:
TorController
,
private
val
browsingModeManager
:
BrowsingModeManager
,
private
val
dispatchModeChanges
:
(
mode
:
Mode
)
->
Unit
)
:
AccountObserver
{
)
:
AccountObserver
,
TorEvents
{
private
val
accountManager
by
lazy
{
context
.
components
.
backgroundServices
.
accountManager
}
fun
getCurrentMode
()
=
if
(
onboarding
.
userHasBeenOnboarded
())
{
init
{
torController
.
registerTorListener
(
this
)
}
fun
getCurrentMode
()
=
if
(
shouldStartTor
&&
(!
torQuickStart
.
quickStartTor
()
&&
!
torController
.
isBootstrapped
))
{
Mode
.
Bootstrap
}
else
if
(
onboarding
.
userHasBeenOnboarded
())
{
Mode
.
fromBrowsingMode
(
browsingModeManager
.
mode
)
}
else
{
val
account
=
accountManager
.
authenticatedAccount
()
...
...
@@ -72,6 +86,26 @@ class CurrentMode(
dispatchModeChanges
(
getCurrentMode
())
}
@SuppressWarnings
(
"EmptyFunctionBlock"
)
override
fun
onTorConnecting
()
{
}
override
fun
onTorConnected
()
{
dispatchModeChanges
(
getCurrentMode
())
}
override
fun
onTorStopped
()
{
dispatchModeChanges
(
getCurrentMode
())
}
@SuppressWarnings
(
"EmptyFunctionBlock"
)
override
fun
onTorStatusUpdate
(
entry
:
String
?,
status
:
String
?)
{
}
fun
unregisterTorListener
()
{
torController
.
unregisterTorListener
(
this
)
}
override
fun
onAuthenticated
(
account
:
OAuthAccount
,
authType
:
AuthType
)
=
emitModeChanges
()
override
fun
onAuthenticationProblems
()
=
emitModeChanges
()
override
fun
onLoggedOut
()
=
emitModeChanges
()
...
...
app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt
View file @
87f547bd
...
...
@@ -149,6 +149,26 @@ interface SessionControlController {
* @see [CollectionInteractor.onRemoveCollectionsPlaceholder]
*/
fun
handleRemoveCollectionsPlaceholder
()
/**
* @see [TorBootstrapInteractor.onTorBootstrapConnectClicked]
*/
fun
handleTorBootstrapConnectClicked
()
/**
* @see [TorBootstrapInteractor.onTorBootstrapConnectingClicked]
*/
fun
handleTorBootstrapConnectingClicked
()
/**
* @see [TorBootstrapInteractor.onTorStartBootstrapping]
*/
fun
handleTorStartBootstrapping
()
/**
* @see [TorBootstrapInteractor.onTorStartDebugBootstrapping]
*/
fun
handleTorStartDebugBootstrapping
()
}
@Suppress
(
"TooManyFunctions"
,
"LargeClass"
)
...
...
@@ -173,7 +193,10 @@ class DefaultSessionControlController(
handleSwipedItemDeletionCancel
:
()
->
Unit
)
->
Unit
,
private
val
showTabTray
:
()
->
Unit
,
private
val
handleSwipedItemDeletionCancel
:
()
->
Unit
private
val
handleSwipedItemDeletionCancel
:
()
->
Unit
,
private
val
handleTorBootstrapConnect
:
()
->
Unit
,
private
val
initiateTorBootstrap
:
(
Boolean
)
->
Unit
,
private
val
cancelTorBootstrap
:
()
->
Unit
)
:
SessionControlController
{
override
fun
handleCollectionAddTabTapped
(
collection
:
TabCollection
)
{
...
...
@@ -431,4 +454,20 @@ class DefaultSessionControlController(
)
navController
.
nav
(
R
.
id
.
homeFragment
,
directions
)
}
override
fun
handleTorBootstrapConnectClicked
()
{
handleTorBootstrapConnect
()
}
override
fun
handleTorBootstrapConnectingClicked
()
{
cancelTorBootstrap
()
}
override
fun
handleTorStartBootstrapping
()
{
initiateTorBootstrap
(
false
)
}
override
fun
handleTorStartDebugBootstrapping
()
{
initiateTorBootstrap
(
true
)
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment