11/*
22 * Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
33 * SPDX-License-Identifier: GPL-3.0-only
4+ *
45 */
56
6- package com.zeapo.pwdstore
7+ package com.zeapo.pwdstore.ui.onboarding.fragments
78
89import android.Manifest
9- import android.content.Intent
1010import android.os.Bundle
11- import androidx.activity.result.contract.ActivityResultContracts.RequestPermission
12- import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
11+ import android.view.View
12+ import androidx.activity.result.contract.ActivityResultContracts
1313import androidx.appcompat.app.AppCompatActivity
1414import androidx.core.content.edit
15+ import androidx.fragment.app.Fragment
1516import com.github.ajalt.timberkt.d
1617import com.github.michaelbull.result.onFailure
1718import com.github.michaelbull.result.runCatching
1819import com.google.android.material.dialog.MaterialAlertDialogBuilder
19- import com.zeapo.pwdstore.databinding.ActivityOnboardingBinding
20- import com.zeapo.pwdstore.git.GitServerConfigActivity
20+ import com.zeapo.pwdstore.R
21+ import com.zeapo.pwdstore.UserPreference
22+ import com.zeapo.pwdstore.databinding.FragmentRepoLocationBinding
2123import com.zeapo.pwdstore.utils.PasswordRepository
2224import com.zeapo.pwdstore.utils.PreferenceKeys
23- import com.zeapo.pwdstore.utils.isPermissionGranted
25+ import com.zeapo.pwdstore.utils.finish
2426import com.zeapo.pwdstore.utils.getString
27+ import com.zeapo.pwdstore.utils.isPermissionGranted
2528import com.zeapo.pwdstore.utils.listFilesRecursively
2629import com.zeapo.pwdstore.utils.sharedPrefs
2730import com.zeapo.pwdstore.utils.viewBinding
2831import java.io.File
2932
30- class OnboardingActivity : AppCompatActivity ( ) {
33+ class RepoLocationFragment : Fragment ( R .layout.fragment_repo_location ) {
3134
32- private val binding by viewBinding(ActivityOnboardingBinding ::inflate)
33- private val settings by lazy { applicationContext.sharedPrefs }
35+ private val firstRunActivity by lazy { requireActivity() }
36+ private val settings by lazy { firstRunActivity.applicationContext.sharedPrefs }
37+ private val binding by viewBinding(FragmentRepoLocationBinding ::bind)
3438 private val sortOrder: PasswordRepository .PasswordSortOrder
3539 get() = PasswordRepository .PasswordSortOrder .getSortOrder(settings)
3640
37- private val cloneAction = registerForActivityResult(StartActivityForResult ()) { result ->
38- if (result.resultCode == RESULT_OK ) {
39- settings.edit { putBoolean(PreferenceKeys .REPOSITORY_INITIALIZED , true ) }
40- finish()
41- }
42- }
43-
44- private val repositoryInitAction = registerForActivityResult(StartActivityForResult ()) { result ->
45- if (result.resultCode == RESULT_OK ) {
41+ private val repositoryInitAction = registerForActivityResult(ActivityResultContracts .StartActivityForResult ()) { result ->
42+ if (result.resultCode == AppCompatActivity .RESULT_OK ) {
4643 initializeRepositoryInfo()
47- finish()
4844 }
4945 }
5046
51- private val externalDirectorySelectAction = registerForActivityResult(StartActivityForResult ()) { result ->
52- if (result.resultCode == RESULT_OK ) {
47+ private val externalDirectorySelectAction = registerForActivityResult(ActivityResultContracts . StartActivityForResult ()) { result ->
48+ if (result.resultCode == AppCompatActivity . RESULT_OK ) {
5349 if (checkExternalDirectory()) {
5450 finish()
5551 } else {
@@ -58,40 +54,27 @@ class OnboardingActivity : AppCompatActivity() {
5854 }
5955 }
6056
61- override fun onCreate (savedInstanceState : Bundle ? ) {
62- super .onCreate(savedInstanceState)
63- supportActionBar?.hide()
64- setContentView(binding.root)
65- binding.settingsButton.setOnClickListener {
66- startActivity(Intent (this , UserPreference ::class .java))
67- }
68- binding.localDirectoryButton.setOnClickListener {
69- MaterialAlertDialogBuilder (this )
70- .setTitle(resources.getString(R .string.location_dialog_title))
71- .setMessage(resources.getString(R .string.location_dialog_create_text))
72- .setPositiveButton(resources.getString(R .string.location_hidden)) { _, _ ->
73- createRepoInHiddenDir()
74- }
75- .setNegativeButton(resources.getString(R .string.location_sdcard)) { _, _ ->
76- createRepoFromExternalDir()
77- }
78- .show()
79- }
80- binding.cloneFromServerButton.setOnClickListener {
81- cloneToHiddenDir()
82- }
57+ private val externalDirPermGrantedAction = createPermGrantedAction {
58+ externalDirectorySelectAction.launch(UserPreference .createDirectorySelectionIntent(requireContext()))
8359 }
8460
85- override fun onBackPressed () {
86- finishAffinity ()
61+ private val repositoryUsePermGrantedAction = createPermGrantedAction {
62+ initializeRepositoryInfo ()
8763 }
8864
89- /* *
90- * Clones a remote Git repository to the app's private directory
91- */
92- private fun cloneToHiddenDir () {
93- settings.edit { putBoolean(PreferenceKeys .GIT_EXTERNAL , false ) }
94- cloneAction.launch(GitServerConfigActivity .createCloneIntent(this ))
65+ private val repositoryChangePermGrantedAction = createPermGrantedAction {
66+ repositoryInitAction.launch(UserPreference .createDirectorySelectionIntent(requireContext()))
67+ }
68+
69+ override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
70+ super .onViewCreated(view, savedInstanceState)
71+ binding.hidden.setOnClickListener {
72+ createRepoInHiddenDir()
73+ }
74+
75+ binding.sdcard.setOnClickListener {
76+ createRepoFromExternalDir()
77+ }
9578 }
9679
9780 /* *
@@ -103,7 +86,6 @@ class OnboardingActivity : AppCompatActivity() {
10386 remove(PreferenceKeys .GIT_EXTERNAL_REPO )
10487 }
10588 initializeRepositoryInfo()
106- finish()
10789 }
10890
10991 /* *
@@ -114,40 +96,28 @@ class OnboardingActivity : AppCompatActivity() {
11496 val externalRepo = settings.getString(PreferenceKeys .GIT_EXTERNAL_REPO )
11597 if (externalRepo == null ) {
11698 if (! isPermissionGranted(Manifest .permission.WRITE_EXTERNAL_STORAGE )) {
117- registerForActivityResult(RequestPermission ()) { granted ->
118- if (granted) {
119- externalDirectorySelectAction.launch(UserPreference .createDirectorySelectionIntent(this ))
120- }
121- }.launch(Manifest .permission.WRITE_EXTERNAL_STORAGE )
99+ externalDirPermGrantedAction.launch(Manifest .permission.WRITE_EXTERNAL_STORAGE )
122100 } else {
123101 // Unlikely we have storage permissions without user ever selecting a directory,
124102 // but let's not assume.
125- externalDirectorySelectAction.launch(UserPreference .createDirectorySelectionIntent(this ))
103+ externalDirectorySelectAction.launch(UserPreference .createDirectorySelectionIntent(requireContext() ))
126104 }
127105 } else {
128- MaterialAlertDialogBuilder (this )
106+ MaterialAlertDialogBuilder (requireActivity() )
129107 .setTitle(resources.getString(R .string.directory_selected_title))
130108 .setMessage(resources.getString(R .string.directory_selected_message, externalRepo))
131109 .setPositiveButton(resources.getString(R .string.use)) { _, _ ->
132110 if (! isPermissionGranted(Manifest .permission.WRITE_EXTERNAL_STORAGE )) {
133- registerForActivityResult(RequestPermission ()) { granted ->
134- if (granted) {
135- initializeRepositoryInfo()
136- }
137- }.launch(Manifest .permission.WRITE_EXTERNAL_STORAGE )
111+ repositoryUsePermGrantedAction.launch(Manifest .permission.WRITE_EXTERNAL_STORAGE )
138112 } else {
139113 initializeRepositoryInfo()
140114 }
141115 }
142116 .setNegativeButton(resources.getString(R .string.change)) { _, _ ->
143117 if (! isPermissionGranted(Manifest .permission.WRITE_EXTERNAL_STORAGE )) {
144- registerForActivityResult(RequestPermission ()) { granted ->
145- if (granted) {
146- repositoryInitAction.launch(UserPreference .createDirectorySelectionIntent(this ))
147- }
148- }.launch(Manifest .permission.WRITE_EXTERNAL_STORAGE )
118+ repositoryChangePermGrantedAction.launch(Manifest .permission.WRITE_EXTERNAL_STORAGE )
149119 } else {
150- repositoryInitAction.launch(UserPreference .createDirectorySelectionIntent(this ))
120+ repositoryInitAction.launch(UserPreference .createDirectorySelectionIntent(requireContext() ))
151121 }
152122 }
153123 .show()
@@ -192,6 +162,7 @@ class OnboardingActivity : AppCompatActivity() {
192162 d { " Failed to delete local repository: $localDir " }
193163 }
194164 }
165+ finish()
195166 }
196167
197168 private fun initializeRepositoryInfo () {
@@ -205,4 +176,16 @@ class OnboardingActivity : AppCompatActivity() {
205176 }
206177 createRepository()
207178 }
179+
180+ private fun createPermGrantedAction (block : () -> Unit ) =
181+ registerForActivityResult(ActivityResultContracts .RequestPermission ()) { granted ->
182+ if (granted) {
183+ block.invoke()
184+ }
185+ }
186+
187+ companion object {
188+
189+ fun newInstance (): RepoLocationFragment = RepoLocationFragment ()
190+ }
208191}
0 commit comments