mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Fix education hints #1192
This commit is contained in:
@@ -5,6 +5,7 @@ KeePassDX(3.3.0)
|
||||
* Search with regular expression #175
|
||||
* Merge from file and save as copy #1221 #1204 #840
|
||||
* Fix custom data #1236
|
||||
* Fix education hints #1192
|
||||
* New UI and fix styles
|
||||
* Add "Simple" and "Reply" themes
|
||||
|
||||
|
||||
@@ -91,6 +91,8 @@ class EntryActivity : DatabaseLockActivity() {
|
||||
|
||||
private val mEntryViewModel: EntryViewModel by viewModels()
|
||||
|
||||
private val mEntryActivityEducation = EntryActivityEducation(this)
|
||||
|
||||
private var mMainEntryId: NodeId<UUID>? = null
|
||||
private var mHistoryPosition: Int = -1
|
||||
private var mEntryIsHistory: Boolean = false
|
||||
@@ -379,11 +381,7 @@ class EntryActivity : DatabaseLockActivity() {
|
||||
|
||||
// Show education views
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
performedNextEducation(
|
||||
EntryActivityEducation(
|
||||
this
|
||||
), menu
|
||||
)
|
||||
performedNextEducation(menu)
|
||||
}
|
||||
}
|
||||
return true
|
||||
@@ -409,31 +407,30 @@ class EntryActivity : DatabaseLockActivity() {
|
||||
return super.onPrepareOptionsMenu(menu)
|
||||
}
|
||||
|
||||
private fun performedNextEducation(entryActivityEducation: EntryActivityEducation,
|
||||
menu: Menu) {
|
||||
private fun performedNextEducation(menu: Menu) {
|
||||
val entryFragment = supportFragmentManager.findFragmentByTag(ENTRY_FRAGMENT_TAG)
|
||||
as? EntryFragment?
|
||||
val entryFieldCopyView: View? = entryFragment?.firstEntryFieldCopyView()
|
||||
val entryCopyEducationPerformed = entryFieldCopyView != null
|
||||
&& entryActivityEducation.checkAndPerformedEntryCopyEducation(
|
||||
&& mEntryActivityEducation.checkAndPerformedEntryCopyEducation(
|
||||
entryFieldCopyView,
|
||||
{
|
||||
entryFragment.launchEntryCopyEducationAction()
|
||||
},
|
||||
{
|
||||
performedNextEducation(entryActivityEducation, menu)
|
||||
performedNextEducation(menu)
|
||||
})
|
||||
|
||||
if (!entryCopyEducationPerformed) {
|
||||
val menuEditView = toolbar?.findViewById<View>(R.id.menu_edit)
|
||||
// entryEditEducationPerformed
|
||||
menuEditView != null && entryActivityEducation.checkAndPerformedEntryEditEducation(
|
||||
menuEditView != null && mEntryActivityEducation.checkAndPerformedEntryEditEducation(
|
||||
menuEditView,
|
||||
{
|
||||
onOptionsItemSelected(menu.findItem(R.id.menu_edit))
|
||||
},
|
||||
{
|
||||
performedNextEducation(entryActivityEducation, menu)
|
||||
performedNextEducation(menu)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -113,7 +113,7 @@ class EntryEditActivity : DatabaseLockActivity(),
|
||||
private var mExternalFileHelper: ExternalFileHelper? = null
|
||||
private var mAttachmentFileBinderManager: AttachmentFileBinderManager? = null
|
||||
// Education
|
||||
private var entryEditActivityEducation: EntryEditActivityEducation? = null
|
||||
private var mEntryEditActivityEducation = EntryEditActivityEducation(this)
|
||||
|
||||
private var mIconSelectionActivityResultLauncher = IconPickerActivity.registerIconSelectionForResult(this) { icon ->
|
||||
mEntryEditViewModel.selectIcon(icon)
|
||||
@@ -183,8 +183,6 @@ class EntryEditActivity : DatabaseLockActivity(),
|
||||
}
|
||||
|
||||
mAttachmentFileBinderManager = AttachmentFileBinderManager(this)
|
||||
// Verify the education views
|
||||
entryEditActivityEducation = EntryEditActivityEducation(this)
|
||||
|
||||
// Lock button
|
||||
lockView?.setOnClickListener { lockAndExit() }
|
||||
@@ -538,10 +536,8 @@ class EntryEditActivity : DatabaseLockActivity(),
|
||||
super.onCreateOptionsMenu(menu)
|
||||
if (mEntryLoaded) {
|
||||
menuInflater.inflate(R.menu.entry_edit, menu)
|
||||
entryEditActivityEducation?.let {
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
performedNextEducation(it)
|
||||
}
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
performedNextEducation()
|
||||
}
|
||||
}
|
||||
return true
|
||||
@@ -568,19 +564,19 @@ class EntryEditActivity : DatabaseLockActivity(),
|
||||
return super.onPrepareOptionsMenu(menu)
|
||||
}
|
||||
|
||||
private fun performedNextEducation(entryEditActivityEducation: EntryEditActivityEducation) {
|
||||
private fun performedNextEducation() {
|
||||
|
||||
val entryEditFragment = supportFragmentManager.findFragmentById(R.id.entry_edit_content)
|
||||
as? EntryEditFragment?
|
||||
val generatePasswordView = entryEditFragment?.getActionImageView()
|
||||
val generatePasswordEductionPerformed = generatePasswordView != null
|
||||
&& entryEditActivityEducation.checkAndPerformedGeneratePasswordEducation(
|
||||
&& mEntryEditActivityEducation.checkAndPerformedGeneratePasswordEducation(
|
||||
generatePasswordView,
|
||||
{
|
||||
entryEditFragment.launchGeneratePasswordEductionAction()
|
||||
},
|
||||
{
|
||||
performedNextEducation(entryEditActivityEducation)
|
||||
performedNextEducation()
|
||||
}
|
||||
)
|
||||
|
||||
@@ -589,33 +585,33 @@ class EntryEditActivity : DatabaseLockActivity(),
|
||||
val addNewFieldEducationPerformed = mAllowCustomFields
|
||||
&& addNewFieldView != null
|
||||
&& addNewFieldView.isVisible
|
||||
&& entryEditActivityEducation.checkAndPerformedEntryNewFieldEducation(
|
||||
&& mEntryEditActivityEducation.checkAndPerformedEntryNewFieldEducation(
|
||||
addNewFieldView,
|
||||
{
|
||||
addNewCustomField()
|
||||
},
|
||||
{
|
||||
performedNextEducation(entryEditActivityEducation)
|
||||
performedNextEducation()
|
||||
}
|
||||
)
|
||||
if (!addNewFieldEducationPerformed) {
|
||||
val attachmentView: View? = entryEditAddToolBar?.findViewById(R.id.menu_add_attachment)
|
||||
val addAttachmentEducationPerformed = attachmentView != null
|
||||
&& attachmentView.isVisible
|
||||
&& entryEditActivityEducation.checkAndPerformedAttachmentEducation(
|
||||
&& mEntryEditActivityEducation.checkAndPerformedAttachmentEducation(
|
||||
attachmentView,
|
||||
{
|
||||
addNewAttachment()
|
||||
},
|
||||
{
|
||||
performedNextEducation(entryEditActivityEducation)
|
||||
performedNextEducation()
|
||||
}
|
||||
)
|
||||
if (!addAttachmentEducationPerformed) {
|
||||
val setupOtpView: View? = entryEditAddToolBar?.findViewById(R.id.menu_add_otp)
|
||||
setupOtpView != null
|
||||
&& setupOtpView.isVisible
|
||||
&& entryEditActivityEducation.checkAndPerformedSetUpOTPEducation(
|
||||
&& mEntryEditActivityEducation.checkAndPerformedSetUpOTPEducation(
|
||||
setupOtpView,
|
||||
{
|
||||
setupOtp()
|
||||
@@ -662,8 +658,8 @@ class EntryEditActivity : DatabaseLockActivity(),
|
||||
|
||||
override fun acceptPassword(passwordField: Field) {
|
||||
mEntryEditViewModel.selectPassword(passwordField)
|
||||
entryEditActivityEducation?.let {
|
||||
Handler(Looper.getMainLooper()).post { performedNextEducation(it) }
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
performedNextEducation()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -78,6 +78,8 @@ class FileDatabaseSelectActivity : DatabaseModeActivity(),
|
||||
|
||||
private val databaseFilesViewModel: DatabaseFilesViewModel by viewModels()
|
||||
|
||||
private val mFileDatabaseSelectActivityEducation = FileDatabaseSelectActivityEducation(this)
|
||||
|
||||
// Adapter to manage database history list
|
||||
private var mAdapterDatabaseHistory: FileDatabaseHistoryAdapter? = null
|
||||
|
||||
@@ -132,7 +134,7 @@ class FileDatabaseSelectActivity : DatabaseModeActivity(),
|
||||
Log.e(TAG, error)
|
||||
}
|
||||
}
|
||||
openDatabaseButtonView = findViewById(R.id.open_keyfile_button)
|
||||
openDatabaseButtonView = findViewById(R.id.open_database_button)
|
||||
openDatabaseButtonView?.setOpenDocumentClickListener(mExternalFileHelper)
|
||||
|
||||
// History list
|
||||
@@ -392,39 +394,40 @@ class FileDatabaseSelectActivity : DatabaseModeActivity(),
|
||||
MenuUtil.defaultMenuInflater(menuInflater, menu)
|
||||
}
|
||||
|
||||
Handler(Looper.getMainLooper()).post { performedNextEducation(FileDatabaseSelectActivityEducation(this)) }
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
performedNextEducation()
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
private fun performedNextEducation(fileDatabaseSelectActivityEducation: FileDatabaseSelectActivityEducation) {
|
||||
private fun performedNextEducation() {
|
||||
// If no recent files
|
||||
val createDatabaseEducationPerformed =
|
||||
createDatabaseButtonView != null
|
||||
&& createDatabaseButtonView!!.visibility == View.VISIBLE
|
||||
&& mAdapterDatabaseHistory != null
|
||||
&& mAdapterDatabaseHistory!!.itemCount == 0
|
||||
&& fileDatabaseSelectActivityEducation.checkAndPerformedCreateDatabaseEducation(
|
||||
&& mFileDatabaseSelectActivityEducation.checkAndPerformedCreateDatabaseEducation(
|
||||
createDatabaseButtonView!!,
|
||||
{
|
||||
createNewFile()
|
||||
},
|
||||
{
|
||||
// But if the user cancel, it can also select a database
|
||||
performedNextEducation(fileDatabaseSelectActivityEducation)
|
||||
performedNextEducation()
|
||||
})
|
||||
if (!createDatabaseEducationPerformed) {
|
||||
// selectDatabaseEducationPerformed
|
||||
openDatabaseButtonView != null
|
||||
&& fileDatabaseSelectActivityEducation.checkAndPerformedSelectDatabaseEducation(
|
||||
openDatabaseButtonView!!,
|
||||
{ tapTargetView ->
|
||||
tapTargetView?.let {
|
||||
mExternalFileHelper?.openDocument()
|
||||
}
|
||||
},
|
||||
{}
|
||||
)
|
||||
&& mFileDatabaseSelectActivityEducation.checkAndPerformedSelectDatabaseEducation(
|
||||
openDatabaseButtonView!!,
|
||||
{ tapTargetView ->
|
||||
tapTargetView?.let {
|
||||
mExternalFileHelper?.openDocument()
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -118,6 +118,8 @@ class GroupActivity : DatabaseLockActivity(),
|
||||
private val mGroupViewModel: GroupViewModel by viewModels()
|
||||
private val mGroupEditViewModel: GroupEditViewModel by viewModels()
|
||||
|
||||
private val mGroupActivityEducation = GroupActivityEducation(this)
|
||||
|
||||
private var mBreadcrumbAdapter: BreadcrumbAdapter? = null
|
||||
|
||||
private var mSearchMenuItem: MenuItem? = null
|
||||
@@ -1205,70 +1207,64 @@ class GroupActivity : DatabaseLockActivity(),
|
||||
|
||||
// Launch education screen
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
performedNextEducation(
|
||||
GroupActivityEducation(this),
|
||||
menu
|
||||
)
|
||||
performedNextEducation(menu)
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
private fun performedNextEducation(
|
||||
groupActivityEducation: GroupActivityEducation,
|
||||
menu: Menu
|
||||
) {
|
||||
private fun performedNextEducation(menu: Menu) {
|
||||
|
||||
// If no node, show education to add new one
|
||||
val addNodeButtonEducationPerformed = actionNodeMode == null
|
||||
&& addNodeButtonView?.addButtonView != null
|
||||
&& addNodeButtonView!!.isEnable
|
||||
&& groupActivityEducation.checkAndPerformedAddNodeButtonEducation(
|
||||
&& mGroupActivityEducation.checkAndPerformedAddNodeButtonEducation(
|
||||
addNodeButtonView?.addButtonView!!,
|
||||
{
|
||||
addNodeButtonView?.openButtonIfClose()
|
||||
},
|
||||
{
|
||||
performedNextEducation(groupActivityEducation, menu)
|
||||
performedNextEducation(menu)
|
||||
}
|
||||
)
|
||||
if (!addNodeButtonEducationPerformed) {
|
||||
|
||||
val searchMenuEducationPerformed = toolbar != null
|
||||
&& toolbar!!.findViewById<View>(R.id.menu_search) != null
|
||||
&& groupActivityEducation.checkAndPerformedSearchMenuEducation(
|
||||
&& mGroupActivityEducation.checkAndPerformedSearchMenuEducation(
|
||||
toolbar!!.findViewById(R.id.menu_search),
|
||||
{
|
||||
menu.findItem(R.id.menu_search).expandActionView()
|
||||
},
|
||||
{
|
||||
performedNextEducation(groupActivityEducation, menu)
|
||||
performedNextEducation(menu)
|
||||
})
|
||||
|
||||
if (!searchMenuEducationPerformed) {
|
||||
|
||||
val sortMenuEducationPerformed = toolbar != null
|
||||
&& toolbar!!.findViewById<View>(R.id.menu_sort) != null
|
||||
&& groupActivityEducation.checkAndPerformedSortMenuEducation(
|
||||
&& mGroupActivityEducation.checkAndPerformedSortMenuEducation(
|
||||
toolbar!!.findViewById(R.id.menu_sort),
|
||||
{
|
||||
onOptionsItemSelected(menu.findItem(R.id.menu_sort))
|
||||
},
|
||||
{
|
||||
performedNextEducation(groupActivityEducation, menu)
|
||||
performedNextEducation(menu)
|
||||
})
|
||||
|
||||
if (!sortMenuEducationPerformed) {
|
||||
// lockMenuEducationPerformed
|
||||
val lockButtonView = findViewById<View>(R.id.lock_button)
|
||||
lockButtonView != null
|
||||
&& groupActivityEducation.checkAndPerformedLockMenuEducation(
|
||||
&& mGroupActivityEducation.checkAndPerformedLockMenuEducation(
|
||||
lockButtonView,
|
||||
{
|
||||
lockAndExit()
|
||||
},
|
||||
{
|
||||
performedNextEducation(groupActivityEducation, menu)
|
||||
performedNextEducation(menu)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,6 +88,8 @@ class MainCredentialActivity : DatabaseModeActivity(), AdvancedUnlockFragment.Bu
|
||||
private val mDatabaseFileViewModel: DatabaseFileViewModel by viewModels()
|
||||
private val mAdvancedUnlockViewModel: AdvancedUnlockViewModel by viewModels()
|
||||
|
||||
private val mPasswordActivityEducation = PasswordActivityEducation(this)
|
||||
|
||||
private var mDefaultDatabase: Boolean = false
|
||||
private var mDatabaseFileUri: Uri? = null
|
||||
|
||||
@@ -553,26 +555,27 @@ class MainCredentialActivity : DatabaseModeActivity(), AdvancedUnlockFragment.Bu
|
||||
if (!performedEductionInProgress) {
|
||||
performedEductionInProgress = true
|
||||
// Show education views
|
||||
Handler(Looper.getMainLooper()).post { performedNextEducation(PasswordActivityEducation(this), menu) }
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
performedNextEducation(menu)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun performedNextEducation(passwordActivityEducation: PasswordActivityEducation,
|
||||
menu: Menu) {
|
||||
private fun performedNextEducation(menu: Menu) {
|
||||
val educationToolbar = toolbar
|
||||
val unlockEducationPerformed = educationToolbar != null
|
||||
&& passwordActivityEducation.checkAndPerformedUnlockEducation(
|
||||
&& mPasswordActivityEducation.checkAndPerformedUnlockEducation(
|
||||
educationToolbar,
|
||||
{
|
||||
performedNextEducation(passwordActivityEducation, menu)
|
||||
performedNextEducation(menu)
|
||||
},
|
||||
{
|
||||
performedNextEducation(passwordActivityEducation, menu)
|
||||
performedNextEducation(menu)
|
||||
})
|
||||
if (!unlockEducationPerformed) {
|
||||
val readOnlyEducationPerformed =
|
||||
educationToolbar?.findViewById<View>(R.id.menu_open_file_read_mode_key) != null
|
||||
&& passwordActivityEducation.checkAndPerformedReadOnlyEducation(
|
||||
&& mPasswordActivityEducation.checkAndPerformedReadOnlyEducation(
|
||||
educationToolbar.findViewById(R.id.menu_open_file_read_mode_key),
|
||||
{
|
||||
try {
|
||||
@@ -580,19 +583,19 @@ class MainCredentialActivity : DatabaseModeActivity(), AdvancedUnlockFragment.Bu
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Unable to find read mode menu")
|
||||
}
|
||||
performedNextEducation(passwordActivityEducation, menu)
|
||||
performedNextEducation(menu)
|
||||
},
|
||||
{
|
||||
performedNextEducation(passwordActivityEducation, menu)
|
||||
performedNextEducation(menu)
|
||||
})
|
||||
|
||||
advancedUnlockFragment?.performEducation(passwordActivityEducation,
|
||||
advancedUnlockFragment?.performEducation(mPasswordActivityEducation,
|
||||
readOnlyEducationPerformed,
|
||||
{
|
||||
performedNextEducation(passwordActivityEducation, menu)
|
||||
performedNextEducation(menu)
|
||||
},
|
||||
{
|
||||
performedNextEducation(passwordActivityEducation, menu)
|
||||
performedNextEducation(menu)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ import com.kunzisoft.keepass.R
|
||||
|
||||
open class Education(val activity: Activity) {
|
||||
|
||||
private var mOneEducationHintOpen = false
|
||||
/**
|
||||
* Utility method to save preference after an education action
|
||||
*/
|
||||
@@ -39,15 +40,36 @@ open class Education(val activity: Activity) {
|
||||
listener: TapTargetView.Listener,
|
||||
saveEducationStringId: Int): Boolean {
|
||||
var doEducation = false
|
||||
if (isEducationScreensEnabled()) {
|
||||
if (!isEducationAlreadyPerformed) {
|
||||
try {
|
||||
TapTargetView.showFor(activity, tapTarget, listener)
|
||||
saveEducationPreference(activity, saveEducationStringId)
|
||||
doEducation = true
|
||||
} catch (e: Exception) {
|
||||
Log.w(Education::class.java.name, "Can't performed education " + e.message)
|
||||
}
|
||||
if (isEducationScreensEnabled()
|
||||
&& !mOneEducationHintOpen
|
||||
&& !isEducationAlreadyPerformed) {
|
||||
try {
|
||||
TapTargetView.showFor(activity, tapTarget, object : TapTargetView.Listener() {
|
||||
override fun onTargetClick(view: TapTargetView) {
|
||||
mOneEducationHintOpen = false
|
||||
saveEducationPreference(activity, saveEducationStringId)
|
||||
super.onTargetClick(view)
|
||||
listener.onTargetClick(view)
|
||||
}
|
||||
|
||||
override fun onOuterCircleClick(view: TapTargetView?) {
|
||||
mOneEducationHintOpen = false
|
||||
saveEducationPreference(activity, saveEducationStringId)
|
||||
super.onOuterCircleClick(view)
|
||||
listener.onOuterCircleClick(view)
|
||||
view?.dismiss(false)
|
||||
}
|
||||
|
||||
override fun onTargetCancel(view: TapTargetView?) {
|
||||
mOneEducationHintOpen = false
|
||||
saveEducationPreference(activity, saveEducationStringId)
|
||||
super.onTargetCancel(view)
|
||||
}
|
||||
})
|
||||
mOneEducationHintOpen = true
|
||||
doEducation = true
|
||||
} catch (e: Exception) {
|
||||
Log.w(Education::class.java.name, "Can't performed education " + e.message)
|
||||
}
|
||||
}
|
||||
return doEducation
|
||||
|
||||
@@ -158,11 +158,11 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:layout_gravity="top"
|
||||
app:layout_constraintBottom_toTopOf="@+id/open_keyfile_button"
|
||||
app:layout_constraintBottom_toTopOf="@+id/open_database_button"
|
||||
android:background="?attr/colorPrimaryDark"/>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatButton
|
||||
android:id="@+id/open_keyfile_button"
|
||||
android:id="@+id/open_database_button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/select_database_file"
|
||||
|
||||
@@ -4,5 +4,6 @@
|
||||
* Search with regular expression #175
|
||||
* Merge from file and save as copy #1221 #1204 #840
|
||||
* Fix custom data #1236
|
||||
* Fix education hints #1192
|
||||
* New UI and fix styles
|
||||
* Add "Simple" and "Reply" themes
|
||||
@@ -4,5 +4,6 @@
|
||||
* Recherche avec expression régulière #175
|
||||
* Fusion depuis un fichier et sauvegarde de copie #1221 #1204 #840
|
||||
* Correction des données customisées #1236
|
||||
* Correction de écrans d'éducation #1192
|
||||
* Nouvelle interface utilisateur et correction des styles
|
||||
* Ajout des thèmes "Simple" et "Réponse"
|
||||
Reference in New Issue
Block a user