Consolidate password list refresh (#887)

This commit is contained in:
Fabian Henneke 2020-06-28 09:59:15 +02:00 committed by GitHub
parent 9fc5d337b8
commit 535ad1dbb1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 31 additions and 34 deletions

View file

@ -179,6 +179,11 @@ class PasswordStore : AppCompatActivity(R.layout.activity_pwdstore) {
} }
} }
public override fun onStart() {
super.onStart()
refreshPasswordList()
}
public override fun onResume() { public override fun onResume() {
super.onResume() super.onResume()
// do not attempt to checkLocalRepository() if no storage permission: immediate crash // do not attempt to checkLocalRepository() if no storage permission: immediate crash
@ -584,7 +589,6 @@ class PasswordStore : AppCompatActivity(R.layout.activity_pwdstore) {
item.file.toRelativeString(getRepositoryDirectory(this)) item.file.toRelativeString(getRepositoryDirectory(this))
} }
)) ))
refreshPasswordList()
} }
.setNegativeButton(resources.getString(R.string.dialog_no), null) .setNegativeButton(resources.getString(R.string.dialog_no), null)
.show() .show()
@ -662,7 +666,7 @@ class PasswordStore : AppCompatActivity(R.layout.activity_pwdstore) {
} }
} }
} }
resetPasswordList() refreshPasswordList()
plist?.dismissActionMode() plist?.dismissActionMode()
}.launch(intent) }.launch(intent)
} }
@ -727,24 +731,17 @@ class PasswordStore : AppCompatActivity(R.layout.activity_pwdstore) {
} }
/** /**
* Resets navigation to the repository root and refreshes the password list accordingly. * Refreshes the password list by re-executing the last navigation or search action, preserving
* * the navigation stack and scroll position. If the current directory no longer exists,
* Use this rather than [refreshPasswordList] after major file system operations that may remove * navigation is reset to the repository root.
* the current directory and thus require a full reset of the navigation stack.
*/ */
fun resetPasswordList() { fun refreshPasswordList() {
if (model.currentDir.value?.isDirectory == true) {
model.forceRefresh()
} else {
model.reset() model.reset()
supportActionBar!!.setDisplayHomeAsUpEnabled(false) supportActionBar!!.setDisplayHomeAsUpEnabled(false)
} }
/**
* Refreshes the password list by re-executing the last navigation or search action.
*
* Use this rather than [resetPasswordList] after file system operations limited to the current
* folder since it preserves the scroll position and navigation stack.
*/
fun refreshPasswordList() {
model.forceRefresh()
} }
private val currentDir: File private val currentDir: File
@ -763,15 +760,13 @@ class PasswordStore : AppCompatActivity(R.layout.activity_pwdstore) {
data.extras!!.getString("LONG_NAME"))) data.extras!!.getString("LONG_NAME")))
} }
} }
refreshPasswordList()
} }
REQUEST_CODE_ENCRYPT -> { REQUEST_CODE_ENCRYPT -> {
commitChange(resources.getString(R.string.git_commit_add_text, commitChange(resources.getString(R.string.git_commit_add_text,
data!!.extras!!.getString("LONG_NAME"))) data!!.extras!!.getString("LONG_NAME")))
refreshPasswordList()
} }
BaseGitActivity.REQUEST_INIT, NEW_REPO_BUTTON -> initializeRepositoryInfo() BaseGitActivity.REQUEST_INIT, NEW_REPO_BUTTON -> initializeRepositoryInfo()
BaseGitActivity.REQUEST_SYNC, BaseGitActivity.REQUEST_PULL -> resetPasswordList() BaseGitActivity.REQUEST_SYNC, BaseGitActivity.REQUEST_PULL -> refreshPasswordList()
HOME -> checkLocalRepository() HOME -> checkLocalRepository()
// duplicate code // duplicate code
CLONE_REPO_BUTTON -> { CLONE_REPO_BUTTON -> {
@ -793,6 +788,14 @@ class PasswordStore : AppCompatActivity(R.layout.activity_pwdstore) {
intent.putExtra(BaseGitActivity.REQUEST_ARG_OP, BaseGitActivity.REQUEST_CLONE) intent.putExtra(BaseGitActivity.REQUEST_ARG_OP, BaseGitActivity.REQUEST_CLONE)
startActivityForResult(intent, BaseGitActivity.REQUEST_CLONE) startActivityForResult(intent, BaseGitActivity.REQUEST_CLONE)
} }
else -> {
d { "Unexpected request code: $requestCode" }
// FIXME: The sync operation returns with a requestCode of 65535 instead of the
// expected 105. It is completely unclear why, but the issue might be resolved
// by switching to ActivityResultContracts. For now, we run the post-sync code
// also when encountering an unexpected request code.
refreshPasswordList()
}
} }
} }
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)

View file

@ -58,7 +58,7 @@ class BreakOutOfDetached(fileDir: File, callingActivity: Activity) : GitOperatio
} }
} }
} }
GitAsyncTask(callingActivity, true, this, null) GitAsyncTask(callingActivity, this, null)
.execute(*this.commands.toTypedArray()) .execute(*this.commands.toTypedArray())
} }

View file

@ -36,7 +36,7 @@ class CloneOperation(fileDir: File, callingActivity: Activity) : GitOperation(fi
override fun execute() { override fun execute() {
(this.command as? CloneCommand)?.setCredentialsProvider(this.provider) (this.command as? CloneCommand)?.setCredentialsProvider(this.provider)
GitAsyncTask(callingActivity, false, this, Intent()).execute(this.command) GitAsyncTask(callingActivity, this, Intent()).execute(this.command)
} }
override fun onError(err: Exception) { override fun onError(err: Exception) {

View file

@ -10,7 +10,6 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.AsyncTask import android.os.AsyncTask
import com.github.ajalt.timberkt.e import com.github.ajalt.timberkt.e
import com.zeapo.pwdstore.PasswordStore
import com.zeapo.pwdstore.R import com.zeapo.pwdstore.R
import com.zeapo.pwdstore.git.config.SshjSessionFactory import com.zeapo.pwdstore.git.config.SshjSessionFactory
import net.schmizz.sshj.common.DisconnectReason import net.schmizz.sshj.common.DisconnectReason
@ -30,7 +29,6 @@ import java.lang.ref.WeakReference
class GitAsyncTask( class GitAsyncTask(
activity: Activity, activity: Activity,
private val refreshListOnEnd: Boolean,
private val operation: GitOperation, private val operation: GitOperation,
private val finishWithResultOnEnd: Intent?, private val finishWithResultOnEnd: Intent?,
private val silentlyExecute: Boolean = false private val silentlyExecute: Boolean = false
@ -170,9 +168,6 @@ class GitAsyncTask(
} }
} }
} }
if (refreshListOnEnd) {
(activity as? PasswordStore)?.resetPasswordList()
}
(SshSessionFactory.getInstance() as? SshjSessionFactory)?.clearCredentials() (SshSessionFactory.getInstance() as? SshjSessionFactory)?.clearCredentials()
SshSessionFactory.setInstance(null) SshSessionFactory.setInstance(null)
} }

View file

@ -35,7 +35,7 @@ class PullOperation(fileDir: File, callingActivity: Activity) : GitOperation(fil
override fun execute() { override fun execute() {
(this.command as? PullCommand)?.setCredentialsProvider(this.provider) (this.command as? PullCommand)?.setCredentialsProvider(this.provider)
GitAsyncTask(callingActivity, false, this, Intent()).execute(this.command) GitAsyncTask(callingActivity, this, Intent()).execute(this.command)
} }
override fun onError(err: Exception) { override fun onError(err: Exception) {

View file

@ -35,7 +35,7 @@ class PushOperation(fileDir: File, callingActivity: Activity) : GitOperation(fil
override fun execute() { override fun execute() {
(this.command as? PushCommand)?.setCredentialsProvider(this.provider) (this.command as? PushCommand)?.setCredentialsProvider(this.provider)
GitAsyncTask(callingActivity, false, this, Intent()).execute(this.command) GitAsyncTask(callingActivity, this, Intent()).execute(this.command)
} }
override fun onError(err: Exception) { override fun onError(err: Exception) {

View file

@ -41,7 +41,7 @@ class ResetToRemoteOperation(fileDir: File, callingActivity: Activity) : GitOper
override fun execute() { override fun execute() {
this.fetchCommand?.setCredentialsProvider(this.provider) this.fetchCommand?.setCredentialsProvider(this.provider)
GitAsyncTask(callingActivity, false, this, Intent()) GitAsyncTask(callingActivity, this, Intent())
.execute(this.addCommand, this.fetchCommand, this.resetCommand) .execute(this.addCommand, this.fetchCommand, this.resetCommand)
} }

View file

@ -50,7 +50,7 @@ class SyncOperation(fileDir: File, callingActivity: Activity) : GitOperation(fil
this.pullCommand?.setCredentialsProvider(this.provider) this.pullCommand?.setCredentialsProvider(this.provider)
this.pushCommand?.setCredentialsProvider(this.provider) this.pushCommand?.setCredentialsProvider(this.provider)
} }
GitAsyncTask(callingActivity, false, this, Intent()).execute(this.addCommand, this.statusCommand, this.commitCommand, this.pullCommand, this.pushCommand) GitAsyncTask(callingActivity, this, Intent()).execute(this.addCommand, this.statusCommand, this.commitCommand, this.pullCommand, this.pushCommand)
} }
override fun onError(err: Exception) { override fun onError(err: Exception) {

View file

@ -23,7 +23,6 @@ import androidx.security.crypto.EncryptedSharedPreferences
import androidx.security.crypto.MasterKey import androidx.security.crypto.MasterKey
import com.github.ajalt.timberkt.d import com.github.ajalt.timberkt.d
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.zeapo.pwdstore.PasswordStore
import com.zeapo.pwdstore.git.GitAsyncTask import com.zeapo.pwdstore.git.GitAsyncTask
import com.zeapo.pwdstore.git.GitOperation import com.zeapo.pwdstore.git.GitOperation
import com.zeapo.pwdstore.utils.PasswordRepository.Companion.getRepositoryDirectory import com.zeapo.pwdstore.utils.PasswordRepository.Companion.getRepositoryDirectory
@ -92,7 +91,7 @@ fun Activity.commitChange(message: String, finishWithResultOnEnd: Intent? = null
override fun execute() { override fun execute() {
d { "Comitting with message: '$message'" } d { "Comitting with message: '$message'" }
val git = Git(repository) val git = Git(repository)
val task = GitAsyncTask(this@commitChange, true, this, finishWithResultOnEnd, silentlyExecute = true) val task = GitAsyncTask(this@commitChange, this, finishWithResultOnEnd, silentlyExecute = true)
task.execute( task.execute(
git.add().addFilepattern("."), git.add().addFilepattern("."),
git.commit().setAll(true).setMessage(message) git.commit().setAll(true).setMessage(message)