@@ -42,11 +42,15 @@ import com.duckduckgo.autofill.impl.importing.gpm.webflow.ImportGooglePassword
42
42
import com.duckduckgo.autofill.impl.importing.gpm.webflow.ImportGooglePasswordResult
43
43
import com.duckduckgo.autofill.impl.ui.credential.dialog.animateClosed
44
44
import com.duckduckgo.autofill.impl.ui.credential.management.importpassword.ImportPasswordsPixelSender
45
+ import com.duckduckgo.autofill.impl.ui.credential.management.importpassword.google.ImportFromGooglePasswordsDialogViewModel.ViewMode.DeterminingFirstView
46
+ import com.duckduckgo.autofill.impl.ui.credential.management.importpassword.google.ImportFromGooglePasswordsDialogViewModel.ViewMode.FlowTerminated
45
47
import com.duckduckgo.autofill.impl.ui.credential.management.importpassword.google.ImportFromGooglePasswordsDialogViewModel.ViewMode.ImportError
46
48
import com.duckduckgo.autofill.impl.ui.credential.management.importpassword.google.ImportFromGooglePasswordsDialogViewModel.ViewMode.ImportSuccess
47
49
import com.duckduckgo.autofill.impl.ui.credential.management.importpassword.google.ImportFromGooglePasswordsDialogViewModel.ViewMode.Importing
48
50
import com.duckduckgo.autofill.impl.ui.credential.management.importpassword.google.ImportFromGooglePasswordsDialogViewModel.ViewMode.PreImport
49
51
import com.duckduckgo.autofill.impl.ui.credential.management.importpassword.google.ImportFromGooglePasswordsDialogViewModel.ViewState
52
+ import com.duckduckgo.common.ui.view.gone
53
+ import com.duckduckgo.common.ui.view.show
50
54
import com.duckduckgo.common.utils.FragmentViewModelFactory
51
55
import com.duckduckgo.common.utils.extensions.html
52
56
import com.duckduckgo.di.scopes.FragmentScope
@@ -109,13 +113,15 @@ class ImportFromGooglePasswordsDialog : BottomSheetDialogFragment() {
109
113
when (it) {
110
114
is ImportGooglePasswordResult .Success -> viewModel.onImportFlowFinishedSuccessfully()
111
115
is ImportGooglePasswordResult .Error -> viewModel.onImportFlowFinishedWithError(it.reason)
112
- is ImportGooglePasswordResult .UserCancelled -> viewModel.onImportFlowCancelledByUser(it.stage)
116
+ is ImportGooglePasswordResult .UserCancelled -> viewModel.onImportFlowCancelledByUser(it.stage, canShowPreImportDialog() )
113
117
else -> {}
114
118
}
115
119
}
116
120
}
117
121
118
122
private fun switchDialogShowImportInProgressView () {
123
+ showDialogContent()
124
+
119
125
binding.prePostViewSwitcher.displayedChild = 1
120
126
binding.postflow.inProgressFinishedViewSwitcher.displayedChild = 0
121
127
}
@@ -126,10 +132,13 @@ class ImportFromGooglePasswordsDialog : BottomSheetDialogFragment() {
126
132
}
127
133
128
134
private fun switchDialogShowPreImportView () {
135
+ showDialogContent()
129
136
binding.prePostViewSwitcher.displayedChild = 0
130
137
}
131
138
132
139
private fun processSuccessResult (result : CredentialImporter .ImportResult .Finished ) {
140
+ showDialogContent()
141
+
133
142
binding.postflow.importFinished.errorNotImported.visibility = View .GONE
134
143
binding.postflow.appIcon.setImageDrawable(
135
144
ContextCompat .getDrawable(
@@ -154,6 +163,8 @@ class ImportFromGooglePasswordsDialog : BottomSheetDialogFragment() {
154
163
}
155
164
156
165
private fun processErrorResult () {
166
+ showDialogContent()
167
+
157
168
binding.postflow.importFinished.resultsImported.visibility = View .GONE
158
169
binding.postflow.importFinished.duplicatesNotImported.visibility = View .GONE
159
170
binding.postflow.importFinished.errorNotImported.visibility = View .VISIBLE
@@ -169,6 +180,14 @@ class ImportFromGooglePasswordsDialog : BottomSheetDialogFragment() {
169
180
switchDialogShowImportResultsView()
170
181
}
171
182
183
+ private fun showDialogContent () {
184
+ binding.root.show()
185
+ }
186
+
187
+ private fun hideDialogContent () {
188
+ binding.root.gone()
189
+ }
190
+
172
191
override fun onAttach (context : Context ) {
173
192
AndroidSupportInjection .inject(this )
174
193
super .onAttach(context)
@@ -180,16 +199,24 @@ class ImportFromGooglePasswordsDialog : BottomSheetDialogFragment() {
180
199
if (savedInstanceState != null ) {
181
200
// If being created after a configuration change, dismiss the dialog as the WebView will be re-created too
182
201
dismiss()
202
+ return
203
+ }
204
+
205
+ // check if we should show the initial instructional prompt
206
+ if (canShowPreImportDialog()) {
207
+ viewModel.shouldShowInitialInstructionalPrompt()
208
+ } else {
209
+ startImportWebFlow()
183
210
}
184
211
}
185
212
213
+ private fun canShowPreImportDialog () = arguments?.getBoolean(KEY_SHOW_INITIAL_INSTRUCTIONAL_PROMPT , true ) ? : true
214
+
186
215
override fun onCreateView (
187
216
inflater : LayoutInflater ,
188
217
container : ViewGroup ? ,
189
218
savedInstanceState : Bundle ? ,
190
219
): View {
191
- importPasswordsPixelSender.onImportPasswordsDialogDisplayed()
192
-
193
220
_binding = ContentImportFromGooglePasswordDialogBinding .inflate(inflater, container, false )
194
221
configureViews(binding)
195
222
observeViewModel()
@@ -208,6 +235,8 @@ class ImportFromGooglePasswordsDialog : BottomSheetDialogFragment() {
208
235
is ImportError -> processErrorResult()
209
236
is ImportSuccess -> processSuccessResult(viewState.viewMode.importResult)
210
237
is Importing -> switchDialogShowImportInProgressView()
238
+ is DeterminingFirstView -> hideDialogContent()
239
+ is FlowTerminated -> dismiss()
211
240
}
212
241
}
213
242
@@ -233,6 +262,11 @@ class ImportFromGooglePasswordsDialog : BottomSheetDialogFragment() {
233
262
}
234
263
235
264
private fun onImportGcmButtonClicked () {
265
+ startImportWebFlow()
266
+ importPasswordsPixelSender.onImportPasswordsDialogImportButtonClicked()
267
+ }
268
+
269
+ private fun startImportWebFlow () {
236
270
authorizationGracePeriod.requestExtendedGracePeriod()
237
271
238
272
val intent = globalActivityStarter.startIntent(
@@ -241,8 +275,6 @@ class ImportFromGooglePasswordsDialog : BottomSheetDialogFragment() {
241
275
)
242
276
importGooglePasswordsFlowLauncher.launch(intent)
243
277
244
- importPasswordsPixelSender.onImportPasswordsDialogImportButtonClicked()
245
-
246
278
// we don't want the eventual dismissal of this dialog to count as a cancellation
247
279
ignoreCancellationEvents = true
248
280
}
@@ -266,8 +298,13 @@ class ImportFromGooglePasswordsDialog : BottomSheetDialogFragment() {
266
298
267
299
companion object {
268
300
269
- fun instance (): ImportFromGooglePasswordsDialog {
301
+ private const val KEY_SHOW_INITIAL_INSTRUCTIONAL_PROMPT = " showInitialInstructionalPrompt"
302
+
303
+ fun instance (showInitialInstructionalPrompt : Boolean ): ImportFromGooglePasswordsDialog {
270
304
val fragment = ImportFromGooglePasswordsDialog ()
305
+ fragment.arguments = Bundle ().apply {
306
+ putBoolean(KEY_SHOW_INITIAL_INSTRUCTIONAL_PROMPT , showInitialInstructionalPrompt)
307
+ }
271
308
return fragment
272
309
}
273
310
}
0 commit comments