Skip to content

Commit 9b997bf

Browse files
authored
Add DuckDuckgoFragment and use it (duckduckgo#2137)
Task/Issue URL: https://app.asana.com/0/488551667048375/1202717423070878/f ### Description `Fragments` currently have an associated dagger component but are not dagger injectors. Similar to what we did for Activities, create a `DuckDuckGoFragment` and `DaggerFragment` that contains all the logic so that we don't need to repeat it in every single fragment. ### Steps to test this PR Smoke tests for: * autofill fragments * email fragments * AppTP fragments * browser fragment * feedback fragment
1 parent 87d3ec2 commit 9b997bf

File tree

22 files changed

+228
-85
lines changed

22 files changed

+228
-85
lines changed

app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ import com.duckduckgo.app.tabs.ui.TabSwitcherActivity
127127
import com.duckduckgo.mobile.android.ui.DuckDuckGoTheme
128128
import com.duckduckgo.mobile.android.ui.store.ThemingDataStore
129129
import com.google.android.material.snackbar.Snackbar
130-
import dagger.android.support.AndroidSupportInjection
131130
import kotlinx.android.synthetic.main.fragment_browser_tab.*
132131
import kotlinx.android.synthetic.main.include_cta_buttons.view.*
133132
import kotlinx.android.synthetic.main.include_dax_dialog_cta.*
@@ -180,6 +179,7 @@ import com.duckduckgo.app.downloads.DownloadsFileActions
180179
import com.duckduckgo.app.browser.menu.BrowserPopupMenu
181180
import com.duckduckgo.app.browser.print.PrintInjector
182181
import com.duckduckgo.app.browser.remotemessage.asMessage
182+
import com.duckduckgo.app.global.DuckDuckGoFragment
183183
import com.duckduckgo.app.global.FragmentViewModelFactory
184184
import com.duckduckgo.app.global.view.launchDefaultAppActivity
185185
import com.duckduckgo.app.playstore.PlayStoreUtils
@@ -208,7 +208,7 @@ import javax.inject.Provider
208208

209209
@InjectWith(FragmentScope::class)
210210
class BrowserTabFragment :
211-
Fragment(),
211+
DuckDuckGoFragment(),
212212
FindListener,
213213
CoroutineScope,
214214
DaxDialogListener,
@@ -466,11 +466,6 @@ class BrowserTabFragment :
466466

467467
private val pulseAnimation: PulseAnimation = PulseAnimation(this)
468468

469-
override fun onAttach(context: Context) {
470-
AndroidSupportInjection.inject(this)
471-
super.onAttach(context)
472-
}
473-
474469
override fun onCreate(savedInstanceState: Bundle?) {
475470
super.onCreate(savedInstanceState)
476471
removeDaxDialogFromActivity()

app/src/main/java/com/duckduckgo/app/email/ui/EmailProtectionFragment.kt

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,20 @@
1616

1717
package com.duckduckgo.app.email.ui
1818

19-
import android.content.Context
2019
import android.os.Bundle
2120
import android.view.View
2221
import androidx.annotation.LayoutRes
23-
import androidx.fragment.app.Fragment
2422
import androidx.lifecycle.ViewModel
2523
import androidx.lifecycle.ViewModelProvider
24+
import com.duckduckgo.app.global.DuckDuckGoFragment
2625
import com.duckduckgo.app.global.FragmentViewModelFactory
27-
import dagger.android.support.AndroidSupportInjection
2826
import javax.inject.Inject
2927

30-
abstract class EmailProtectionFragment(@LayoutRes contentLayoutId: Int = 0) : Fragment(contentLayoutId) {
28+
abstract class EmailProtectionFragment(@LayoutRes contentLayoutId: Int = 0) : DuckDuckGoFragment(contentLayoutId) {
3129

3230
@Inject
3331
lateinit var viewModelFactory: FragmentViewModelFactory
3432

35-
override fun onAttach(context: Context) {
36-
AndroidSupportInjection.inject(this)
37-
super.onAttach(context)
38-
}
39-
4033
override fun onActivityCreated(savedInstanceState: Bundle?) {
4134
super.onActivityCreated(savedInstanceState)
4235
configureUi()

app/src/main/java/com/duckduckgo/app/feedback/ui/common/FeedbackFragment.kt

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,19 @@
1616

1717
package com.duckduckgo.app.feedback.ui.common
1818

19-
import android.content.Context
2019
import android.os.Bundle
2120
import androidx.annotation.LayoutRes
22-
import androidx.fragment.app.Fragment
2321
import androidx.lifecycle.ViewModel
2422
import androidx.lifecycle.ViewModelProvider
23+
import com.duckduckgo.app.global.DuckDuckGoFragment
2524
import com.duckduckgo.app.global.FragmentViewModelFactory
26-
import dagger.android.support.AndroidSupportInjection
2725
import javax.inject.Inject
2826

29-
abstract class FeedbackFragment(@LayoutRes contentLayoutId: Int = 0) : Fragment(contentLayoutId) {
27+
abstract class FeedbackFragment(@LayoutRes contentLayoutId: Int = 0) : DuckDuckGoFragment(contentLayoutId) {
3028

3129
@Inject
3230
lateinit var viewModelFactory: FragmentViewModelFactory
3331

34-
override fun onAttach(context: Context) {
35-
AndroidSupportInjection.inject(this)
36-
super.onAttach(context)
37-
}
38-
3932
override fun onActivityCreated(savedInstanceState: Bundle?) {
4033
super.onActivityCreated(savedInstanceState)
4134
configureListeners()

app/src/main/java/com/duckduckgo/app/onboarding/ui/page/DefaultBrowserPage.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package com.duckduckgo.app.onboarding.ui.page
1818

1919
import android.annotation.SuppressLint
2020
import android.content.ActivityNotFoundException
21-
import android.content.Context
2221
import android.content.Intent
2322
import android.graphics.Color
2423
import android.net.Uri
@@ -40,7 +39,6 @@ import com.duckduckgo.mobile.android.ui.view.show
4039
import com.duckduckgo.app.statistics.VariantManager
4140
import com.duckduckgo.appbuildconfig.api.AppBuildConfig
4241
import com.duckduckgo.di.scopes.FragmentScope
43-
import dagger.android.support.AndroidSupportInjection
4442
import kotlinx.android.synthetic.main.content_onboarding_default_browser.*
4543
import kotlinx.android.synthetic.main.include_default_browser_buttons.*
4644
import timber.log.Timber
@@ -69,11 +67,6 @@ class DefaultBrowserPage : OnboardingPageFragment() {
6967

7068
override fun layoutResource(): Int = R.layout.content_onboarding_default_browser
7169

72-
override fun onAttach(context: Context) {
73-
AndroidSupportInjection.inject(this)
74-
super.onAttach(context)
75-
}
76-
7770
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
7871
super.setUserVisibleHint(isVisibleToUser)
7972
if (isVisibleToUser) {

app/src/main/java/com/duckduckgo/app/onboarding/ui/page/OnboardingPageFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import android.view.LayoutInflater
2121
import android.view.View
2222
import android.view.ViewGroup
2323
import androidx.annotation.LayoutRes
24-
import androidx.fragment.app.Fragment
24+
import com.duckduckgo.app.global.DuckDuckGoFragment
2525
import com.duckduckgo.app.onboarding.ui.OnboardingActivity
2626

27-
abstract class OnboardingPageFragment : Fragment() {
27+
abstract class OnboardingPageFragment : DuckDuckGoFragment() {
2828

2929
@LayoutRes
3030
abstract fun layoutResource(): Int

app/src/main/java/com/duckduckgo/app/onboarding/ui/page/WelcomePage.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package com.duckduckgo.app.onboarding.ui.page
1818

1919
import android.app.Activity.RESULT_OK
20-
import android.content.Context
2120
import android.content.Intent
2221
import android.graphics.Color
2322
import android.os.Bundle
@@ -34,7 +33,6 @@ import com.duckduckgo.mobile.android.R as CommonR
3433
import com.duckduckgo.app.global.extensions.html
3534
import com.duckduckgo.appbuildconfig.api.AppBuildConfig
3635
import com.duckduckgo.di.scopes.FragmentScope
37-
import dagger.android.support.AndroidSupportInjection
3836
import kotlinx.android.synthetic.main.content_onboarding_welcome.*
3937
import kotlinx.android.synthetic.main.include_dax_dialog_cta.*
4038
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -84,11 +82,6 @@ class WelcomePage : OnboardingPageFragment() {
8482
}
8583
}
8684

87-
override fun onAttach(context: Context) {
88-
AndroidSupportInjection.inject(this)
89-
super.onAttach(context)
90-
}
91-
9285
private fun render(state: WelcomePageView.State) {
9386
when (state) {
9487
WelcomePageView.State.Idle -> {}

autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/ui/credential/management/viewing/AutofillManagementCredentialsMode.kt

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,8 @@
1616

1717
package com.duckduckgo.autofill.ui.credential.management.viewing
1818

19-
import android.content.Context
2019
import android.graphics.drawable.BitmapDrawable
2120
import android.os.Bundle
22-
import androidx.fragment.app.Fragment
2321
import android.view.LayoutInflater
2422
import android.view.Menu
2523
import android.view.MenuInflater
@@ -35,6 +33,7 @@ import androidx.lifecycle.lifecycleScope
3533
import androidx.lifecycle.repeatOnLifecycle
3634
import com.duckduckgo.anvil.annotations.InjectWith
3735
import com.duckduckgo.app.browser.favicon.FaviconManager
36+
import com.duckduckgo.app.global.DuckDuckGoFragment
3837
import com.duckduckgo.app.global.FragmentViewModelFactory
3938
import com.duckduckgo.autofill.domain.app.LoginCredentials
4039
import com.duckduckgo.autofill.impl.R
@@ -44,12 +43,11 @@ import com.duckduckgo.autofill.ui.credential.management.AutofillSettingsViewMode
4443
import com.duckduckgo.autofill.ui.credential.management.AutofillSettingsViewModel.CredentialMode.Viewing
4544
import com.duckduckgo.di.scopes.FragmentScope
4645
import com.duckduckgo.mobile.android.ui.view.OutLinedTextInputView
47-
import dagger.android.support.AndroidSupportInjection
4846
import kotlinx.coroutines.launch
4947
import javax.inject.Inject
5048

5149
@InjectWith(FragmentScope::class)
52-
class AutofillManagementCredentialsMode : Fragment(), MenuProvider {
50+
class AutofillManagementCredentialsMode : DuckDuckGoFragment(), MenuProvider {
5351

5452
@Inject
5553
lateinit var faviconManager: FaviconManager
@@ -69,11 +67,6 @@ class AutofillManagementCredentialsMode : Fragment(), MenuProvider {
6967

7068
private lateinit var binding: FragmentAutofillManagementEditModeBinding
7169

72-
override fun onAttach(context: Context) {
73-
AndroidSupportInjection.inject(this)
74-
super.onAttach(context)
75-
}
76-
7770
override fun onCreateView(
7871
inflater: LayoutInflater,
7972
container: ViewGroup?,

autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/ui/credential/management/viewing/AutofillManagementDisabledMode.kt

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,34 +17,27 @@
1717
package com.duckduckgo.autofill.ui.credential.management.viewing
1818

1919
import android.annotation.SuppressLint
20-
import android.content.Context
2120
import android.content.Intent
2221
import android.os.Build
2322
import android.os.Bundle
2423
import android.view.LayoutInflater
2524
import android.view.View
2625
import android.view.ViewGroup
27-
import androidx.fragment.app.Fragment
2826
import com.duckduckgo.anvil.annotations.InjectWith
27+
import com.duckduckgo.app.global.DuckDuckGoFragment
2928
import com.duckduckgo.appbuildconfig.api.AppBuildConfig
3029
import com.duckduckgo.autofill.impl.databinding.FragmentAutofillManagementDisabledBinding
3130
import com.duckduckgo.di.scopes.FragmentScope
32-
import dagger.android.support.AndroidSupportInjection
3331
import javax.inject.Inject
3432

3533
@InjectWith(FragmentScope::class)
36-
class AutofillManagementDisabledMode : Fragment() {
34+
class AutofillManagementDisabledMode : DuckDuckGoFragment() {
3735

3836
@Inject
3937
lateinit var appBuildConfig: AppBuildConfig
4038

4139
private lateinit var binding: FragmentAutofillManagementDisabledBinding
4240

43-
override fun onAttach(context: Context) {
44-
AndroidSupportInjection.inject(this)
45-
super.onAttach(context)
46-
}
47-
4841
override fun onCreateView(
4942
inflater: LayoutInflater,
5043
container: ViewGroup?,

autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/ui/credential/management/viewing/AutofillManagementListMode.kt

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@
1616

1717
package com.duckduckgo.autofill.ui.credential.management.viewing
1818

19-
import android.content.Context
2019
import android.os.Bundle
21-
import androidx.fragment.app.Fragment
2220
import android.view.LayoutInflater
2321
import android.view.View
2422
import android.view.ViewGroup
@@ -29,6 +27,7 @@ import androidx.lifecycle.lifecycleScope
2927
import androidx.lifecycle.repeatOnLifecycle
3028
import com.duckduckgo.anvil.annotations.InjectWith
3129
import com.duckduckgo.app.browser.favicon.FaviconManager
30+
import com.duckduckgo.app.global.DuckDuckGoFragment
3231
import com.duckduckgo.app.global.FragmentViewModelFactory
3332
import com.duckduckgo.autofill.domain.app.LoginCredentials
3433
import com.duckduckgo.autofill.impl.databinding.FragmentAutofillManagementListModeBinding
@@ -38,13 +37,12 @@ import com.duckduckgo.autofill.ui.credential.management.sorting.CredentialGroupe
3837
import com.duckduckgo.autofill.ui.credential.management.LoginCredentialTitleExtractor
3938
import com.duckduckgo.di.scopes.FragmentScope
4039
import com.duckduckgo.mobile.android.ui.view.quietlySetIsChecked
41-
import dagger.android.support.AndroidSupportInjection
4240
import kotlinx.coroutines.launch
4341
import timber.log.Timber
4442
import javax.inject.Inject
4543

4644
@InjectWith(FragmentScope::class)
47-
class AutofillManagementListMode : Fragment() {
45+
class AutofillManagementListMode : DuckDuckGoFragment() {
4846

4947
@Inject
5048
lateinit var faviconManager: FaviconManager
@@ -72,11 +70,6 @@ class AutofillManagementListMode : Fragment() {
7270
}
7371
}
7472

75-
override fun onAttach(context: Context) {
76-
AndroidSupportInjection.inject(this)
77-
super.onAttach(context)
78-
}
79-
8073
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
8174
binding = FragmentAutofillManagementListModeBinding.inflate(inflater, container, false)
8275
configureToggle()

autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/ui/credential/management/viewing/AutofillManagementLockedMode.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616

1717
package com.duckduckgo.autofill.ui.credential.management.viewing
1818

19+
import android.annotation.SuppressLint
1920
import android.os.Bundle
2021
import android.view.LayoutInflater
2122
import android.view.View
2223
import android.view.ViewGroup
2324
import androidx.fragment.app.Fragment
2425
import com.duckduckgo.autofill.impl.databinding.FragmentAutofillManagementLockedBinding
2526

27+
@SuppressLint("NoFragment") // we don't use DI here
2628
class AutofillManagementLockedMode : Fragment() {
2729
private lateinit var binding: FragmentAutofillManagementLockedBinding
2830

0 commit comments

Comments
 (0)