Dialog refactoring

This commit is contained in:
merkost 2023-07-15 22:12:52 +10:00
parent a518ba8a4e
commit 57c07e33fc
3 changed files with 84 additions and 136 deletions

View File

@ -1,69 +1,78 @@
package com.simplemobiletools.contacts.pro.dialogs package com.simplemobiletools.contacts.pro.dialogs
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.dialogs.FilePickerDialog import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.extensions.hideKeyboard
import com.simplemobiletools.commons.extensions.humanizePath
import com.simplemobiletools.commons.extensions.isAValidFilename
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.extensions.value
import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.ContactsHelper
import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.models.contacts.Contact
import com.simplemobiletools.commons.models.contacts.ContactSource
import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.activities.SimpleActivity
import com.simplemobiletools.contacts.pro.adapters.FilterContactSourcesAdapter
import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.extensions.config
import kotlinx.android.synthetic.main.dialog_manage_automatic_backups.view.backup_events_filename import kotlinx.android.synthetic.main.dialog_manage_automatic_backups.view.backup_contact_sources_list
import kotlinx.android.synthetic.main.dialog_manage_automatic_backups.view.backup_events_filename_hint import kotlinx.android.synthetic.main.dialog_manage_automatic_backups.view.backup_contacts_filename
import kotlinx.android.synthetic.main.dialog_manage_automatic_backups.view.backup_events_folder import kotlinx.android.synthetic.main.dialog_manage_automatic_backups.view.backup_contacts_filename_hint
import kotlinx.android.synthetic.main.dialog_manage_automatic_backups.view.manage_event_types_holder import kotlinx.android.synthetic.main.dialog_manage_automatic_backups.view.backup_contacts_folder
import java.io.File import java.io.File
class ManageAutoBackupsDialog(private val activity: SimpleActivity, onSuccess: () -> Unit) { class ManageAutoBackupsDialog(private val activity: SimpleActivity, onSuccess: () -> Unit) {
private val view = (activity.layoutInflater.inflate(R.layout.dialog_manage_automatic_backups, null) as ViewGroup) private val view = (activity.layoutInflater.inflate(R.layout.dialog_manage_automatic_backups, null) as ViewGroup)
private val config = activity.config private val config = activity.config
private var backupFolder = config.autoBackupFolder private var backupFolder = config.autoBackupFolder
private var contactSources = mutableListOf<ContactSource>()
private var selectedContactSources = config.autoBackupContactSources private var selectedContactSources = config.autoBackupContactSources
private var contacts = ArrayList<Contact>()
private var isContactSourcesReady = false
private var isContactsReady = false
init { init {
view.apply { view.apply {
backup_events_folder.setText(activity.humanizePath(backupFolder)) backup_contacts_folder.setText(activity.humanizePath(backupFolder))
val filename = config.autoBackupFilename.ifEmpty { val filename = config.autoBackupFilename.ifEmpty {
"${activity.getString(R.string.contacts)}_%Y%M%D_%h%m%s" "${activity.getString(R.string.contacts)}_%Y%M%D_%h%m%s"
} }
backup_events_filename.setText(filename) backup_contacts_filename.setText(filename)
backup_events_filename_hint.setEndIconOnClickListener { backup_contacts_filename_hint.setEndIconOnClickListener {
DateTimePatternInfoDialog(activity) DateTimePatternInfoDialog(activity)
} }
backup_events_filename_hint.setEndIconOnLongClickListener { backup_contacts_filename_hint.setEndIconOnLongClickListener {
DateTimePatternInfoDialog(activity) DateTimePatternInfoDialog(activity)
true true
} }
backup_events_folder.setOnClickListener { backup_contacts_folder.setOnClickListener {
selectBackupFolder() selectBackupFolder()
} }
manage_event_types_holder.setOnClickListener { ContactsHelper(activity).getContactSources { sources ->
activity.runOnUiThread { contactSources = sources
SelectContactTypesDialog(activity, selectedContactSources.toList()) { isContactSourcesReady = true
selectedContactSources = it.map { it.name }.toSet() processDataIfReady(this)
config.autoBackupContactSources = it.map { it.name }.toSet() }
}
} ContactsHelper(activity).getContacts(getAll = true) { receivedContacts ->
contacts = receivedContacts
isContactsReady = true
processDataIfReady(this)
} }
} }
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok, null) .setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
.apply { .apply {
activity.setupDialogStuff(view, this, R.string.manage_automatic_backups) { dialog -> activity.setupDialogStuff(view, this, R.string.manage_automatic_backups) { dialog ->
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
val filename = view.backup_events_filename.value if (view.backup_contact_sources_list.adapter == null) {
return@setOnClickListener
}
val filename = view.backup_contacts_filename.value
when { when {
filename.isEmpty() -> activity.toast(R.string.empty_name) filename.isEmpty() -> activity.toast(R.string.empty_name)
filename.isAValidFilename() -> { filename.isAValidFilename() -> {
@ -73,11 +82,14 @@ class ManageAutoBackupsDialog(private val activity: SimpleActivity, onSuccess: (
return@setOnClickListener return@setOnClickListener
} }
if (selectedContactSources.isEmpty()) { val selectedSources = (view.backup_contact_sources_list.adapter as FilterContactSourcesAdapter).getSelectedContactSources()
if (selectedSources.isEmpty()) {
activity.toast(R.string.no_entries_for_exporting) activity.toast(R.string.no_entries_for_exporting)
return@setOnClickListener return@setOnClickListener
} }
config.autoBackupContactSources = selectedSources.map { it.name }.toSet()
ensureBackgroundThread { ensureBackgroundThread {
config.apply { config.apply {
autoBackupFolder = backupFolder autoBackupFolder = backupFolder
@ -99,8 +111,27 @@ class ManageAutoBackupsDialog(private val activity: SimpleActivity, onSuccess: (
} }
} }
private fun processDataIfReady(view: View) {
if (!isContactSourcesReady || !isContactsReady) {
return
}
val contactSourcesWithCount = mutableListOf<ContactSource>()
for (source in contactSources) {
val count = contacts.filter { it.source == source.name }.count()
contactSourcesWithCount.add(source.copy(count = count))
}
contactSources.clear()
contactSources.addAll(contactSourcesWithCount)
activity.runOnUiThread {
view.backup_contact_sources_list.adapter = FilterContactSourcesAdapter(activity, contactSourcesWithCount, selectedContactSources.toList())
}
}
private fun selectBackupFolder() { private fun selectBackupFolder() {
activity.hideKeyboard(view.backup_events_filename) activity.hideKeyboard(view.backup_contacts_filename)
FilePickerDialog(activity, backupFolder, false, showFAB = true) { path -> FilePickerDialog(activity, backupFolder, false, showFAB = true) { path ->
activity.handleSAFDialog(path) { grantedSAF -> activity.handleSAFDialog(path) { grantedSAF ->
if (!grantedSAF) { if (!grantedSAF) {
@ -113,7 +144,7 @@ class ManageAutoBackupsDialog(private val activity: SimpleActivity, onSuccess: (
} }
backupFolder = path backupFolder = path
view.backup_events_folder.setText(activity.humanizePath(path)) view.backup_contacts_folder.setText(activity.humanizePath(path))
} }
} }
} }

View File

@ -1,82 +0,0 @@
package com.simplemobiletools.contacts.pro.dialogs
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.helpers.ContactsHelper
import com.simplemobiletools.commons.models.contacts.Contact
import com.simplemobiletools.commons.models.contacts.ContactSource
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.SimpleActivity
import com.simplemobiletools.contacts.pro.adapters.FilterContactSourcesAdapter
import kotlinx.android.synthetic.main.dialog_filter_contact_sources.view.filter_contact_sources_list
class SelectContactTypesDialog(
val activity: SimpleActivity,
private val selectedContactTypes: List<String>,
val callback: (HashSet<ContactSource>) -> Unit
) {
private var dialog: AlertDialog? = null
private val view = activity.layoutInflater.inflate(R.layout.dialog_filter_contact_sources, null)
private var contactSources = mutableListOf<ContactSource>()
private var contacts = listOf<Contact>()
private var isContactSourcesReady = false
private var isContactsReady = false
init {
ContactsHelper(activity).getContactSources { sources ->
contactSources = sources
isContactSourcesReady = true
processDataIfReady()
}
ContactsHelper(activity).getContacts(getAll = true) { receivedContacts ->
contacts = receivedContacts
isContactsReady = true
processDataIfReady()
}
}
private fun processDataIfReady() {
if (!isContactSourcesReady) {
return
}
val contactSourcesWithCount = mutableListOf<ContactSource>()
for (contactSource in contactSources) {
val count = if (isContactsReady) {
contacts.count { it.source == contactSource.name }
} else {
-1
}
contactSourcesWithCount.add(contactSource.copy(count = count))
}
contactSources.clear()
contactSources.addAll(contactSourcesWithCount)
activity.runOnUiThread {
view.filter_contact_sources_list.adapter = FilterContactSourcesAdapter(activity, contactSourcesWithCount, selectedContactTypes.toList())
if (dialog == null) {
activity.runOnUiThread {
activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { _, _ -> confirmContactTypes() }
.setNegativeButton(R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this) { alertDialog ->
dialog = alertDialog
}
}
}
}
}
}
private fun confirmContactTypes() {
val adapter = view.filter_contact_sources_list.adapter as FilterContactSourcesAdapter
val selectedItems = adapter.getSelectedContactSources()
callback(selectedItems.toHashSet())
dialog?.dismiss()
}
}

View File

@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/export_events_scrollview" android:id="@+id/backup_contacts_scrollview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<LinearLayout <LinearLayout
android:id="@+id/backup_events_holder" android:id="@+id/backup_contacts_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:paddingTop="@dimen/activity_margin"> android:paddingTop="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextInputLayout <com.simplemobiletools.commons.views.MyTextInputLayout
android:id="@+id/backup_events_folder_hint" android:id="@+id/backup_contacts_folder_hint"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_margin" android:layout_marginStart="@dimen/activity_margin"
@ -22,7 +22,7 @@
android:hint="@string/folder"> android:hint="@string/folder">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/backup_events_folder" android:id="@+id/backup_contacts_folder"
style="@style/UnclickableEditText" style="@style/UnclickableEditText"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
@ -30,7 +30,7 @@
</com.simplemobiletools.commons.views.MyTextInputLayout> </com.simplemobiletools.commons.views.MyTextInputLayout>
<com.simplemobiletools.commons.views.MyTextInputLayout <com.simplemobiletools.commons.views.MyTextInputLayout
android:id="@+id/backup_events_filename_hint" android:id="@+id/backup_contacts_filename_hint"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_margin" android:layout_marginStart="@dimen/activity_margin"
@ -40,7 +40,7 @@
app:endIconMode="custom"> app:endIconMode="custom">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/backup_events_filename" android:id="@+id/backup_contacts_filename"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:inputType="textCapWords" android:inputType="textCapWords"
@ -51,34 +51,33 @@
</com.simplemobiletools.commons.views.MyTextInputLayout> </com.simplemobiletools.commons.views.MyTextInputLayout>
<ImageView <ImageView
android:id="@+id/select_event_types_divider" android:id="@+id/backup_contacts_divider"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/divider_height" android:layout_height="1px"
android:layout_marginStart="@dimen/activity_margin" android:layout_marginStart="@dimen/activity_margin"
android:layout_marginTop="@dimen/medium_margin"
android:layout_marginEnd="@dimen/activity_margin"
android:layout_marginBottom="@dimen/medium_margin"
android:background="@color/divider_grey" android:background="@color/divider_grey"
android:importantForAccessibility="no" /> android:importantForAccessibility="no" />
<RelativeLayout <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/manage_event_types_holder" android:id="@+id/backup_contacts_pick_sources_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="@dimen/activity_margin"
android:paddingEnd="@dimen/activity_margin"
android:text="@string/include_contact_sources"
android:textSize="@dimen/smaller_text_size" />
<com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/backup_contact_sources_list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground" android:clipToPadding="false"
android:paddingVertical="@dimen/medium_margin" android:overScrollMode="never"
android:paddingStart="@dimen/normal_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/activity_margin"> app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/manage_event_types"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingHorizontal="@dimen/medium_margin"
android:paddingVertical="@dimen/normal_margin"
android:text="@string/include_contact_sources"
android:textSize="@dimen/normal_text_size" />
</RelativeLayout>
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>