From e1ca1d4a866e5fe785da0ff9614da80e4bcd1e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ensar=20Saraj=C4=8Di=C4=87?= Date: Mon, 7 Aug 2023 16:13:37 +0200 Subject: [PATCH] Migrate to viewbinding and kotlin gradle scripts - Replaced kotlinx sythetic with viewbinding - Update build scripts to kotlin - Intoduced version catalog, similar to Commons - Updated kotlin from 1.7.10 to 1.9.0 - Updated room from 2.5.2 to 2.6.0-alpha02 (same as Commons) - Updated Android Gradle Plugin to 8.1.0 --- app/build.gradle | 77 -- app/build.gradle.kts | 98 +++ .../pro/activities/ContactActivity.kt | 22 +- .../pro/activities/EditContactActivity.kt | 709 +++++++++--------- .../pro/activities/GroupContactsActivity.kt | 51 +- .../activities/InsertOrEditContactActivity.kt | 133 ++-- .../contacts/pro/activities/MainActivity.kt | 218 +++--- .../pro/activities/SettingsActivity.kt | 169 +++-- .../contacts/pro/activities/SimpleActivity.kt | 12 +- .../pro/activities/ViewContactActivity.kt | 374 ++++----- .../adapters/AutoCompleteTextViewAdapter.kt | 26 +- .../contacts/pro/adapters/ContactsAdapter.kt | 31 +- .../adapters/FilterContactSourcesAdapter.kt | 16 +- .../contacts/pro/adapters/GroupsAdapter.kt | 28 +- .../pro/adapters/SelectContactsAdapter.kt | 108 ++- .../contacts/pro/adapters/ViewPagerAdapter.kt | 2 +- .../MyContactsContentProvider.kt | 2 +- .../pro/dialogs/ChangeSortingDialog.kt | 43 +- .../pro/dialogs/ChooseSocialDialog.kt | 22 +- .../pro/dialogs/CreateNewGroupDialog.kt | 16 +- .../contacts/pro/dialogs/CustomLabelDialog.kt | 17 +- .../pro/dialogs/DateTimePatternInfoDialog.kt | 2 +- .../pro/dialogs/ExportContactsDialog.kt | 44 +- .../pro/dialogs/FilterContactSourcesDialog.kt | 22 +- .../pro/dialogs/ImportContactsDialog.kt | 32 +- .../pro/dialogs/ManageAutoBackupsDialog.kt | 49 +- .../pro/dialogs/ManageVisibleFieldsDialog.kt | 6 +- .../pro/dialogs/ManageVisibleTabsDialog.kt | 4 +- .../pro/dialogs/MyDatePickerDialog.kt | 31 +- .../contacts/pro/dialogs/RenameGroupDialog.kt | 21 +- .../pro/dialogs/SelectContactsDialog.kt | 47 +- .../pro/dialogs/SelectGroupsDialog.kt | 33 +- .../contacts/pro/extensions/Activity.kt | 4 +- .../contacts/pro/extensions/Context.kt | 6 +- .../pro/fragments/ContactsFragment.kt | 22 +- .../pro/fragments/FavoritesFragment.kt | 36 +- .../contacts/pro/fragments/GroupsFragment.kt | 13 +- .../pro/fragments/MyViewPagerFragment.kt | 188 +++-- .../contacts/pro/helpers/Config.kt | 3 +- .../contacts/pro/helpers/VcfExporter.kt | 5 +- .../contacts/pro/helpers/VcfImporter.kt | 8 +- .../pro/interfaces/RefreshContactsListener.kt | 2 +- .../pro/interfaces/RemoveFromGroupListener.kt | 2 +- build.gradle | 30 - build.gradle.kts | 5 + gradle.properties | 1 + gradle/libs.versions.toml | 53 ++ gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 1 - settings.gradle.kts | 16 + 50 files changed, 1553 insertions(+), 1309 deletions(-) delete mode 100644 app/build.gradle create mode 100644 app/build.gradle.kts delete mode 100644 build.gradle create mode 100644 build.gradle.kts create mode 100644 gradle/libs.versions.toml delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 1c85ff66..00000000 --- a/app/build.gradle +++ /dev/null @@ -1,77 +0,0 @@ -plugins { - id 'com.android.application' - id 'kotlin-android' - id 'kotlin-android-extensions' - id 'kotlin-kapt' -} - -def keystorePropertiesFile = rootProject.file("keystore.properties") -def keystoreProperties = new Properties() -if (keystorePropertiesFile.exists()) { - keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) -} - -android { - compileSdkVersion 33 - - defaultConfig { - applicationId "com.simplemobiletools.contacts.pro" - minSdkVersion 23 - targetSdkVersion 33 - versionCode 104 - versionName "6.22.4" - setProperty("archivesBaseName", "contacts") - } - - signingConfigs { - if (keystorePropertiesFile.exists()) { - release { - keyAlias keystoreProperties['keyAlias'] - keyPassword keystoreProperties['keyPassword'] - storeFile file(keystoreProperties['storeFile']) - storePassword keystoreProperties['storePassword'] - } - } - } - - buildTypes { - debug { - applicationIdSuffix ".debug" - } - release { - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - if (keystorePropertiesFile.exists()) { - signingConfig signingConfigs.release - } - } - } - - flavorDimensions "variants" - productFlavors { - core {} - fdroid {} - prepaid {} - } - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - lintOptions { - checkReleaseBuilds false - abortOnError false - } -} - -dependencies { - implementation 'com.github.SimpleMobileTools:Simple-Commons:91763fe00f' - implementation 'com.googlecode.ez-vcard:ez-vcard:0.11.3' - implementation 'com.github.tibbi:IndicatorFastScroll:4524cd0b61' - implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' - implementation 'me.grantland:autofittextview:0.2.1' - - kapt "androidx.room:room-compiler:2.5.1" - implementation "androidx.room:room-runtime:2.5.1" - annotationProcessor "androidx.room:room-compiler:2.5.1" -} diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 00000000..227e0992 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,98 @@ +import java.io.FileInputStream +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.konan.properties.Properties + +plugins { + alias(libs.plugins.android) + alias(libs.plugins.kotlinAndroid) + alias(libs.plugins.ksp) +} + +val keystorePropertiesFile: File = rootProject.file("keystore.properties") +val keystoreProperties = Properties() +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) +} + +android { + compileSdk = project.libs.versions.app.build.compileSDKVersion.get().toInt() + + defaultConfig { + applicationId = libs.versions.app.version.appId.get() + minSdk = project.libs.versions.app.build.minimumSDK.get().toInt() + targetSdk = project.libs.versions.app.build.targetSDK.get().toInt() + versionName = project.libs.versions.app.version.versionName.get() + versionCode = project.libs.versions.app.version.versionCode.get().toInt() + setProperty("archivesBaseName", "contacts") + } + + signingConfigs { + if (keystorePropertiesFile.exists()) { + register("release") { + keyAlias = keystoreProperties.getProperty("keyAlias") + keyPassword = keystoreProperties.getProperty("keyPassword") + storeFile = file(keystoreProperties.getProperty("storeFile")) + storePassword = keystoreProperties.getProperty("storePassword") + } + } + } + + buildFeatures { + viewBinding = true + buildConfig = true + } + + buildTypes { + debug { + applicationIdSuffix = ".debug" + } + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + if (keystorePropertiesFile.exists()) { + signingConfig = signingConfigs.getByName("release") + } + } + } + + flavorDimensions.add("variants") + productFlavors { + register("core") + register("fdroid") + register("prepaid") + } + + sourceSets { + getByName("main").java.srcDirs("src/main/kotlin") + } + + compileOptions { + val currentJavaVersionFromLibs = JavaVersion.valueOf(libs.versions.app.build.javaVersion.get().toString()) + sourceCompatibility = currentJavaVersionFromLibs + targetCompatibility = currentJavaVersionFromLibs + } + + tasks.withType { + kotlinOptions.jvmTarget = project.libs.versions.app.build.kotlinJVMTarget.get() + } + + namespace = libs.versions.app.version.appId.get() + + lint { + checkReleaseBuilds = false + abortOnError = false + } +} + +dependencies { + implementation(libs.simple.tools.commons) + implementation(libs.androidx.swiperefreshlayout) + implementation(libs.autofittextview) + implementation(libs.ezvcard) + implementation(libs.indicatorfastscroll) + implementation(libs.bundles.room) + ksp(libs.androidx.room.compiler) +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt index 4e8b5fd0..8fe51270 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt @@ -27,9 +27,9 @@ import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.letterBackgroundColors import com.simplemobiletools.commons.models.RadioItem +import com.simplemobiletools.commons.models.contacts.Contact import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.extensions.shareContacts -import com.simplemobiletools.commons.models.contacts.Contact abstract class ContactActivity : SimpleActivity() { protected val PICK_RINGTONE_INTENT_ID = 1500 @@ -164,10 +164,10 @@ abstract class ContactActivity : SimpleActivity() { } else { getString( when (type) { - Email.TYPE_HOME -> R.string.home - Email.TYPE_WORK -> R.string.work - Email.TYPE_MOBILE -> R.string.mobile - else -> R.string.other + Email.TYPE_HOME -> com.simplemobiletools.commons.R.string.home + Email.TYPE_WORK -> com.simplemobiletools.commons.R.string.work + Email.TYPE_MOBILE -> com.simplemobiletools.commons.R.string.mobile + else -> com.simplemobiletools.commons.R.string.other } ) } @@ -179,9 +179,9 @@ abstract class ContactActivity : SimpleActivity() { } else { getString( when (type) { - StructuredPostal.TYPE_HOME -> R.string.home - StructuredPostal.TYPE_WORK -> R.string.work - else -> R.string.other + StructuredPostal.TYPE_HOME -> com.simplemobiletools.commons.R.string.home + StructuredPostal.TYPE_WORK -> com.simplemobiletools.commons.R.string.work + else -> com.simplemobiletools.commons.R.string.other } ) } @@ -207,9 +207,9 @@ abstract class ContactActivity : SimpleActivity() { } fun getEventTextId(type: Int) = when (type) { - Event.TYPE_ANNIVERSARY -> R.string.anniversary - Event.TYPE_BIRTHDAY -> R.string.birthday - else -> R.string.other + Event.TYPE_ANNIVERSARY -> com.simplemobiletools.commons.R.string.anniversary + Event.TYPE_BIRTHDAY -> com.simplemobiletools.commons.R.string.birthday + else -> com.simplemobiletools.commons.R.string.other } private fun getBigLetterPlaceholder(name: String): Bitmap { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index e14dc0d4..3da6aaca 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -16,7 +16,6 @@ import android.provider.ContactsContract.CommonDataKinds.* import android.provider.MediaStore import android.telephony.PhoneNumberUtils import android.view.View -import android.view.ViewGroup import android.view.WindowManager import android.widget.EditText import android.widget.ImageView @@ -39,6 +38,7 @@ import com.simplemobiletools.commons.models.contacts.Organization import com.simplemobiletools.commons.views.MyAutoCompleteTextView import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.adapters.AutoCompleteTextViewAdapter +import com.simplemobiletools.contacts.pro.databinding.* import com.simplemobiletools.contacts.pro.dialogs.CustomLabelDialog import com.simplemobiletools.contacts.pro.dialogs.ManageVisibleFieldsDialog import com.simplemobiletools.contacts.pro.dialogs.MyDatePickerDialog @@ -50,33 +50,19 @@ import com.simplemobiletools.contacts.pro.helpers.ADD_NEW_CONTACT_NUMBER import com.simplemobiletools.contacts.pro.helpers.IS_FROM_SIMPLE_CONTACTS import com.simplemobiletools.contacts.pro.helpers.KEY_EMAIL import com.simplemobiletools.contacts.pro.helpers.KEY_NAME -import kotlinx.android.synthetic.main.activity_edit_contact.* -import kotlinx.android.synthetic.main.item_edit_address.view.contact_address -import kotlinx.android.synthetic.main.item_edit_address.view.contact_address_type -import kotlinx.android.synthetic.main.item_edit_email.view.contact_email -import kotlinx.android.synthetic.main.item_edit_email.view.contact_email_type -import kotlinx.android.synthetic.main.item_edit_group.view.contact_group -import kotlinx.android.synthetic.main.item_edit_group.view.contact_group_remove -import kotlinx.android.synthetic.main.item_edit_im.view.contact_im -import kotlinx.android.synthetic.main.item_edit_im.view.contact_im_type -import kotlinx.android.synthetic.main.item_edit_phone_number.view.contact_number -import kotlinx.android.synthetic.main.item_edit_phone_number.view.contact_number_type -import kotlinx.android.synthetic.main.item_edit_phone_number.view.default_toggle_icon -import kotlinx.android.synthetic.main.item_edit_website.view.contact_website -import kotlinx.android.synthetic.main.item_event.view.contact_event -import kotlinx.android.synthetic.main.item_event.view.contact_event_remove -import kotlinx.android.synthetic.main.item_event.view.contact_event_type class EditContactActivity : ContactActivity() { - private val INTENT_TAKE_PHOTO = 1 - private val INTENT_CHOOSE_PHOTO = 2 - private val INTENT_CROP_PHOTO = 3 + companion object { + private const val INTENT_TAKE_PHOTO = 1 + private const val INTENT_CHOOSE_PHOTO = 2 + private const val INTENT_CROP_PHOTO = 3 - private val TAKE_PHOTO = 1 - private val CHOOSE_PHOTO = 2 - private val REMOVE_PHOTO = 3 + private const val TAKE_PHOTO = 1 + private const val CHOOSE_PHOTO = 2 + private const val REMOVE_PHOTO = 3 - private val AUTO_COMPLETE_DELAY = 5000L + private const val AUTO_COMPLETE_DELAY = 5000L + } private var mLastSavePromptTS = 0L private var wasActivityInitialized = false @@ -88,6 +74,7 @@ class EditContactActivity : ContactActivity() { private var numberViewToColor: EditText? = null private var emailViewToColor: EditText? = null private var originalContactSource = "" + private lateinit var binding: ActivityEditContactBinding enum class PrimaryNumberStatus { UNCHANGED, STARRED, UNSTARRED @@ -96,13 +83,14 @@ class EditContactActivity : ContactActivity() { override fun onCreate(savedInstanceState: Bundle?) { showTransparentTop = true super.onCreate(savedInstanceState) - setContentView(R.layout.activity_edit_contact) + binding = ActivityEditContactBinding.inflate(layoutInflater) + setContentView(binding.root) if (checkAppSideloading()) { return } - contact_wrapper.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + binding.contactWrapper.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN setupInsets() setupMenu() @@ -116,13 +104,13 @@ class EditContactActivity : ContactActivity() { if (it) { initContact() } else { - toast(R.string.no_contacts_permission) + toast(com.simplemobiletools.commons.R.string.no_contacts_permission) hideKeyboard() finish() } } } else { - toast(R.string.no_contacts_permission) + toast(com.simplemobiletools.commons.R.string.no_contacts_permission) hideKeyboard() finish() } @@ -137,7 +125,7 @@ class EditContactActivity : ContactActivity() { if (resultCode == RESULT_OK) { when (requestCode) { INTENT_TAKE_PHOTO, INTENT_CHOOSE_PHOTO -> startCropPhotoIntent(lastPhotoIntentUri, resultData?.data) - INTENT_CROP_PHOTO -> updateContactPhoto(lastPhotoIntentUri.toString(), contact_photo, contact_photo_bottom_shadow) + INTENT_CROP_PHOTO -> updateContactPhoto(lastPhotoIntentUri.toString(), binding.contactPhoto, binding.contactPhotoBottomShadow) } } } @@ -168,7 +156,7 @@ class EditContactActivity : ContactActivity() { ensureBackgroundThread { contact = ContactsHelper(this).getContactWithId(contactId, intent.getBooleanExtra(IS_PRIVATE, false)) if (contact == null) { - toast(R.string.unknown_error_occurred) + toast(com.simplemobiletools.commons.R.string.unknown_error_occurred) hideKeyboard() finish() } else { @@ -183,7 +171,7 @@ class EditContactActivity : ContactActivity() { } private fun gotContact() { - contact_scrollview.beVisible() + binding.contactScrollview.beVisible() if (contact == null) { setupNewContact() } else { @@ -224,68 +212,83 @@ class EditContactActivity : ContactActivity() { setupRingtone() if (contact!!.photoUri.isEmpty() && contact!!.photo == null) { - showPhotoPlaceholder(contact_photo) - contact_photo_bottom_shadow.beGone() + showPhotoPlaceholder(binding.contactPhoto) + binding.contactPhotoBottomShadow.beGone() } else { - updateContactPhoto(contact!!.photoUri, contact_photo, contact_photo_bottom_shadow, contact!!.photo) + updateContactPhoto(contact!!.photoUri, binding.contactPhoto, binding.contactPhotoBottomShadow, contact!!.photo) } val textColor = getProperTextColor() arrayOf( - contact_name_image, contact_numbers_image, contact_emails_image, contact_addresses_image, contact_ims_image, contact_events_image, - contact_notes_image, contact_ringtone_image, contact_organization_image, contact_websites_image, contact_groups_image, contact_source_image + binding.contactNameImage, + binding.contactNumbersImage, + binding.contactEmailsImage, + binding.contactAddressesImage, + binding.contactImsImage, + binding.contactEventsImage, + binding.contactNotesImage, + binding.contactRingtoneImage, + binding.contactOrganizationImage, + binding.contactWebsitesImage, + binding.contactGroupsImage, + binding.contactSourceImage ).forEach { it.applyColorFilter(textColor) } val properPrimaryColor = getProperPrimaryColor() arrayOf( - contact_numbers_add_new, contact_emails_add_new, contact_addresses_add_new, contact_ims_add_new, contact_events_add_new, - contact_websites_add_new, contact_groups_add_new + binding.contactNumbersAddNew, binding.contactEmailsAddNew, binding.contactAddressesAddNew, binding.contactImsAddNew, binding.contactEventsAddNew, + binding.contactWebsitesAddNew, binding.contactGroupsAddNew ).forEach { it.applyColorFilter(properPrimaryColor) } arrayOf( - contact_numbers_add_new.background, contact_emails_add_new.background, contact_addresses_add_new.background, contact_ims_add_new.background, - contact_events_add_new.background, contact_websites_add_new.background, contact_groups_add_new.background + binding.contactNumbersAddNew.background, + binding.contactEmailsAddNew.background, + binding.contactAddressesAddNew.background, + binding.contactImsAddNew.background, + binding.contactEventsAddNew.background, + binding.contactWebsitesAddNew.background, + binding.contactGroupsAddNew.background ).forEach { it.applyColorFilter(textColor) } - contact_toggle_favorite.setOnClickListener { toggleFavorite() } - contact_photo.setOnClickListener { trySetPhoto() } - contact_change_photo.setOnClickListener { trySetPhoto() } - contact_numbers_add_new.setOnClickListener { addNewPhoneNumberField() } - contact_emails_add_new.setOnClickListener { addNewEmailField() } - contact_addresses_add_new.setOnClickListener { addNewAddressField() } - contact_ims_add_new.setOnClickListener { addNewIMField() } - contact_events_add_new.setOnClickListener { addNewEventField() } - contact_websites_add_new.setOnClickListener { addNewWebsiteField() } - contact_groups_add_new.setOnClickListener { showSelectGroupsDialog() } - contact_source.setOnClickListener { showSelectContactSourceDialog() } + binding.contactToggleFavorite.setOnClickListener { toggleFavorite() } + binding.contactPhoto.setOnClickListener { trySetPhoto() } + binding.contactChangePhoto.setOnClickListener { trySetPhoto() } + binding.contactNumbersAddNew.setOnClickListener { addNewPhoneNumberField() } + binding.contactEmailsAddNew.setOnClickListener { addNewEmailField() } + binding.contactAddressesAddNew.setOnClickListener { addNewAddressField() } + binding.contactImsAddNew.setOnClickListener { addNewIMField() } + binding.contactEventsAddNew.setOnClickListener { addNewEventField() } + binding.contactWebsitesAddNew.setOnClickListener { addNewWebsiteField() } + binding.contactGroupsAddNew.setOnClickListener { showSelectGroupsDialog() } + binding.contactSource.setOnClickListener { showSelectContactSourceDialog() } - contact_change_photo.setOnLongClickListener { toast(R.string.change_photo); true; } + binding.contactChangePhoto.setOnLongClickListener { toast(R.string.change_photo); true; } setupFieldVisibility() - contact_toggle_favorite.apply { + binding.contactToggleFavorite.apply { setImageDrawable(getStarDrawable(contact!!.starred == 1)) tag = contact!!.starred setOnLongClickListener { toast(R.string.toggle_favorite); true; } } - val nameTextViews = arrayOf(contact_first_name, contact_middle_name, contact_surname).filter { it.isVisible() } + val nameTextViews = arrayOf(binding.contactFirstName, binding.contactMiddleName, binding.contactSurname).filter { it.isVisible() } if (nameTextViews.isNotEmpty()) { setupAutoComplete(nameTextViews) } - updateTextColors(contact_scrollview) + updateTextColors(binding.contactScrollview) numberViewToColor?.setTextColor(properPrimaryColor) emailViewToColor?.setTextColor(properPrimaryColor) wasActivityInitialized = true - contact_toolbar.menu.apply { + binding.contactToolbar.menu.apply { findItem(R.id.delete).isVisible = contact?.id != 0 findItem(R.id.share).isVisible = contact?.id != 0 findItem(R.id.open_with).isVisible = contact?.id != 0 && contact?.isPrivate() == false @@ -295,7 +298,13 @@ class EditContactActivity : ContactActivity() { override fun onBackPressed() { if (System.currentTimeMillis() - mLastSavePromptTS > SAVE_DISCARD_PROMPT_INTERVAL && hasContactChanged()) { mLastSavePromptTS = System.currentTimeMillis() - ConfirmationAdvancedDialog(this, "", R.string.save_before_closing, R.string.save, R.string.discard) { + ConfirmationAdvancedDialog( + this, + "", + com.simplemobiletools.commons.R.string.save_before_closing, + com.simplemobiletools.commons.R.string.save, + com.simplemobiletools.commons.R.string.discard + ) { if (it) { saveContact() } else { @@ -308,10 +317,10 @@ class EditContactActivity : ContactActivity() { } private fun setupInsets() { - contact_wrapper.setOnApplyWindowInsetsListener { _, insets -> + binding.contactWrapper.setOnApplyWindowInsetsListener { _, insets -> val windowInsets = WindowInsetsCompat.toWindowInsetsCompat(insets) val imeInsets = windowInsets.getInsets(WindowInsetsCompat.Type.ime()) - contact_scrollview.run { + binding.contactScrollview.run { setPadding(paddingLeft, paddingTop, paddingRight, imeInsets.bottom) } insets @@ -319,8 +328,8 @@ class EditContactActivity : ContactActivity() { } private fun setupMenu() { - (contact_appbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight - contact_toolbar.menu.apply { + (binding.contactAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight + binding.contactToolbar.menu.apply { findItem(R.id.save).setOnMenuItemClickListener { saveContact() true @@ -349,7 +358,7 @@ class EditContactActivity : ContactActivity() { } } - contact_toolbar.setNavigationOnClickListener { + binding.contactToolbar.setNavigationOnClickListener { hideKeyboard() finish() } @@ -367,7 +376,7 @@ class EditContactActivity : ContactActivity() { private fun startCropPhotoIntent(primaryUri: Uri?, backupUri: Uri?) { if (primaryUri == null) { - toast(R.string.unknown_error_occurred) + toast(com.simplemobiletools.commons.R.string.unknown_error_occurred) return } @@ -407,7 +416,7 @@ class EditContactActivity : ContactActivity() { try { startActivityForResult(this, INTENT_CROP_PHOTO) } catch (e: ActivityNotFoundException) { - toast(R.string.no_app_found) + toast(com.simplemobiletools.commons.R.string.no_app_found) } catch (e: Exception) { showErrorToast(e) } @@ -417,66 +426,66 @@ class EditContactActivity : ContactActivity() { private fun setupFieldVisibility() { val showFields = config.showContactFields if (showFields and (SHOW_PREFIX_FIELD or SHOW_FIRST_NAME_FIELD or SHOW_MIDDLE_NAME_FIELD or SHOW_SURNAME_FIELD or SHOW_SUFFIX_FIELD) == 0) { - contact_name_image.beInvisible() + binding.contactNameImage.beInvisible() } - contact_prefix.beVisibleIf(showFields and SHOW_PREFIX_FIELD != 0) - contact_first_name.beVisibleIf(showFields and SHOW_FIRST_NAME_FIELD != 0) - contact_middle_name.beVisibleIf(showFields and SHOW_MIDDLE_NAME_FIELD != 0) - contact_surname.beVisibleIf(showFields and SHOW_SURNAME_FIELD != 0) - contact_suffix.beVisibleIf(showFields and SHOW_SUFFIX_FIELD != 0) - contact_nickname.beVisibleIf(showFields and SHOW_NICKNAME_FIELD != 0) + binding.contactPrefix.beVisibleIf(showFields and SHOW_PREFIX_FIELD != 0) + binding.contactFirstName.beVisibleIf(showFields and SHOW_FIRST_NAME_FIELD != 0) + binding.contactMiddleName.beVisibleIf(showFields and SHOW_MIDDLE_NAME_FIELD != 0) + binding.contactSurname.beVisibleIf(showFields and SHOW_SURNAME_FIELD != 0) + binding.contactSuffix.beVisibleIf(showFields and SHOW_SUFFIX_FIELD != 0) + binding.contactNickname.beVisibleIf(showFields and SHOW_NICKNAME_FIELD != 0) - contact_source.beVisibleIf(showFields and SHOW_CONTACT_SOURCE_FIELD != 0) - contact_source_image.beVisibleIf(showFields and SHOW_CONTACT_SOURCE_FIELD != 0) + binding.contactSource.beVisibleIf(showFields and SHOW_CONTACT_SOURCE_FIELD != 0) + binding.contactSourceImage.beVisibleIf(showFields and SHOW_CONTACT_SOURCE_FIELD != 0) val arePhoneNumbersVisible = showFields and SHOW_PHONE_NUMBERS_FIELD != 0 - contact_numbers_image.beVisibleIf(arePhoneNumbersVisible) - contact_numbers_holder.beVisibleIf(arePhoneNumbersVisible) - contact_numbers_add_new.beVisibleIf(arePhoneNumbersVisible) + binding.contactNumbersImage.beVisibleIf(arePhoneNumbersVisible) + binding.contactNumbersHolder.beVisibleIf(arePhoneNumbersVisible) + binding.contactNumbersAddNew.beVisibleIf(arePhoneNumbersVisible) val areEmailsVisible = showFields and SHOW_EMAILS_FIELD != 0 - contact_emails_image.beVisibleIf(areEmailsVisible) - contact_emails_holder.beVisibleIf(areEmailsVisible) - contact_emails_add_new.beVisibleIf(areEmailsVisible) + binding.contactEmailsImage.beVisibleIf(areEmailsVisible) + binding.contactEmailsHolder.beVisibleIf(areEmailsVisible) + binding.contactEmailsAddNew.beVisibleIf(areEmailsVisible) val areAddressesVisible = showFields and SHOW_ADDRESSES_FIELD != 0 - contact_addresses_image.beVisibleIf(areAddressesVisible) - contact_addresses_holder.beVisibleIf(areAddressesVisible) - contact_addresses_add_new.beVisibleIf(areAddressesVisible) + binding.contactAddressesImage.beVisibleIf(areAddressesVisible) + binding.contactAddressesHolder.beVisibleIf(areAddressesVisible) + binding.contactAddressesAddNew.beVisibleIf(areAddressesVisible) val areIMsVisible = showFields and SHOW_IMS_FIELD != 0 - contact_ims_image.beVisibleIf(areIMsVisible) - contact_ims_holder.beVisibleIf(areIMsVisible) - contact_ims_add_new.beVisibleIf(areIMsVisible) + binding.contactImsImage.beVisibleIf(areIMsVisible) + binding.contactImsHolder.beVisibleIf(areIMsVisible) + binding.contactImsAddNew.beVisibleIf(areIMsVisible) val isOrganizationVisible = showFields and SHOW_ORGANIZATION_FIELD != 0 - contact_organization_company.beVisibleIf(isOrganizationVisible) - contact_organization_job_position.beVisibleIf(isOrganizationVisible) - contact_organization_image.beVisibleIf(isOrganizationVisible) + binding.contactOrganizationCompany.beVisibleIf(isOrganizationVisible) + binding.contactOrganizationJobPosition.beVisibleIf(isOrganizationVisible) + binding.contactOrganizationImage.beVisibleIf(isOrganizationVisible) val areEventsVisible = showFields and SHOW_EVENTS_FIELD != 0 - contact_events_image.beVisibleIf(areEventsVisible) - contact_events_holder.beVisibleIf(areEventsVisible) - contact_events_add_new.beVisibleIf(areEventsVisible) + binding.contactEventsImage.beVisibleIf(areEventsVisible) + binding.contactEventsHolder.beVisibleIf(areEventsVisible) + binding.contactEventsAddNew.beVisibleIf(areEventsVisible) val areWebsitesVisible = showFields and SHOW_WEBSITES_FIELD != 0 - contact_websites_image.beVisibleIf(areWebsitesVisible) - contact_websites_holder.beVisibleIf(areWebsitesVisible) - contact_websites_add_new.beVisibleIf(areWebsitesVisible) + binding.contactWebsitesImage.beVisibleIf(areWebsitesVisible) + binding.contactWebsitesHolder.beVisibleIf(areWebsitesVisible) + binding.contactWebsitesAddNew.beVisibleIf(areWebsitesVisible) val areGroupsVisible = showFields and SHOW_GROUPS_FIELD != 0 - contact_groups_image.beVisibleIf(areGroupsVisible) - contact_groups_holder.beVisibleIf(areGroupsVisible) - contact_groups_add_new.beVisibleIf(areGroupsVisible) + binding.contactGroupsImage.beVisibleIf(areGroupsVisible) + binding.contactGroupsHolder.beVisibleIf(areGroupsVisible) + binding.contactGroupsAddNew.beVisibleIf(areGroupsVisible) val areNotesVisible = showFields and SHOW_NOTES_FIELD != 0 - contact_notes.beVisibleIf(areNotesVisible) - contact_notes_image.beVisibleIf(areNotesVisible) + binding.contactNotes.beVisibleIf(areNotesVisible) + binding.contactNotesImage.beVisibleIf(areNotesVisible) val isRingtoneVisible = showFields and SHOW_RINGTONE_FIELD != 0 - contact_ringtone.beVisibleIf(isRingtoneVisible) - contact_ringtone_image.beVisibleIf(isRingtoneVisible) + binding.contactRingtone.beVisibleIf(isRingtoneVisible) + binding.contactRingtoneImage.beVisibleIf(isRingtoneVisible) } private fun setupEditContact() { @@ -496,12 +505,12 @@ class EditContactActivity : ContactActivity() { private fun setupNames() { contact!!.apply { - contact_prefix.setText(prefix) - contact_first_name.setText(firstName) - contact_middle_name.setText(middleName) - contact_surname.setText(surname) - contact_suffix.setText(suffix) - contact_nickname.setText(nickname) + binding.contactPrefix.setText(prefix) + binding.contactFirstName.setText(firstName) + binding.contactMiddleName.setText(middleName) + binding.contactSurname.setText(surname) + binding.contactSuffix.setText(suffix) + binding.contactNickname.setText(nickname) } } @@ -509,21 +518,24 @@ class EditContactActivity : ContactActivity() { val phoneNumbers = contact!!.phoneNumbers phoneNumbers.forEachIndexed { index, number -> - var numberHolder = contact_numbers_holder.getChildAt(index) - if (numberHolder == null) { - numberHolder = layoutInflater.inflate(R.layout.item_edit_phone_number, contact_numbers_holder, false) - contact_numbers_holder.addView(numberHolder) + val numberHolderView = binding.contactNumbersHolder.getChildAt(index) + val numberHolder = if (numberHolderView == null) { + ItemEditPhoneNumberBinding.inflate(layoutInflater, binding.contactNumbersHolder, false).also { + binding.contactNumbersHolder.addView(it.root) + } + } else { + ItemEditPhoneNumberBinding.bind(numberHolderView) } - numberHolder!!.apply { - contact_number.setText(number.value) - contact_number.tag = number.normalizedNumber - setupPhoneNumberTypePicker(contact_number_type, number.type, number.label) + numberHolder.apply { + contactNumber.setText(number.value) + contactNumber.tag = number.normalizedNumber + setupPhoneNumberTypePicker(contactNumberType, number.type, number.label) if (highlightLastPhoneNumber && index == phoneNumbers.size - 1) { - numberViewToColor = contact_number + numberViewToColor = contactNumber } - default_toggle_icon.tag = if (number.isPrimary) 1 else 0 + defaultToggleIcon.tag = if (number.isPrimary) 1 else 0 } } @@ -531,9 +543,9 @@ class EditContactActivity : ContactActivity() { } private fun setDefaultNumber(selected: ImageView) { - val numbersCount = contact_numbers_holder.childCount + val numbersCount = binding.contactNumbersHolder.childCount for (i in 0 until numbersCount) { - val toggleIcon = contact_numbers_holder.getChildAt(i).default_toggle_icon + val toggleIcon = ItemEditPhoneNumberBinding.bind(binding.contactNumbersHolder.getChildAt(i)).defaultToggleIcon if (toggleIcon != selected) { toggleIcon.tag = 0 } @@ -545,21 +557,21 @@ class EditContactActivity : ContactActivity() { } private fun initNumberHolders() { - val numbersCount = contact_numbers_holder.childCount + val numbersCount = binding.contactNumbersHolder.childCount if (numbersCount == 1) { - contact_numbers_holder.getChildAt(0).default_toggle_icon.beGone() + ItemEditPhoneNumberBinding.bind(binding.contactNumbersHolder.getChildAt(0)).defaultToggleIcon.beGone() return } for (i in 0 until numbersCount) { - val toggleIcon = contact_numbers_holder.getChildAt(i).default_toggle_icon + val toggleIcon = ItemEditPhoneNumberBinding.bind(binding.contactNumbersHolder.getChildAt(i)).defaultToggleIcon val isPrimary = toggleIcon.tag == 1 val drawableId = if (isPrimary) { - R.drawable.ic_star_vector + com.simplemobiletools.commons.R.drawable.ic_star_vector } else { - R.drawable.ic_star_outline_vector + com.simplemobiletools.commons.R.drawable.ic_star_outline_vector } val drawable = ContextCompat.getDrawable(this@EditContactActivity, drawableId) @@ -578,17 +590,20 @@ class EditContactActivity : ContactActivity() { private fun setupEmails() { contact!!.emails.forEachIndexed { index, email -> - var emailHolder = contact_emails_holder.getChildAt(index) - if (emailHolder == null) { - emailHolder = layoutInflater.inflate(R.layout.item_edit_email, contact_emails_holder, false) - contact_emails_holder.addView(emailHolder) + val emailHolderView = binding.contactEmailsHolder.getChildAt(index) + val emailHolder = if (emailHolderView == null) { + ItemEditEmailBinding.inflate(layoutInflater, binding.contactEmailsHolder, false).also { + binding.contactEmailsHolder.addView(it.root) + } + } else { + ItemEditEmailBinding.bind(emailHolderView) } - emailHolder!!.apply { - contact_email.setText(email.value) - setupEmailTypePicker(contact_email_type, email.type, email.label) + emailHolder.apply { + contactEmail.setText(email.value) + setupEmailTypePicker(contactEmailType, email.type, email.label) if (highlightLastEmail && index == contact!!.emails.size - 1) { - emailViewToColor = contact_email + emailViewToColor = contactEmail } } } @@ -596,40 +611,46 @@ class EditContactActivity : ContactActivity() { private fun setupAddresses() { contact!!.addresses.forEachIndexed { index, address -> - var addressHolder = contact_addresses_holder.getChildAt(index) - if (addressHolder == null) { - addressHolder = layoutInflater.inflate(R.layout.item_edit_address, contact_addresses_holder, false) - contact_addresses_holder.addView(addressHolder) + val addressHolderView = binding.contactAddressesHolder.getChildAt(index) + val addressHolder = if (addressHolderView == null) { + ItemEditAddressBinding.inflate(layoutInflater, binding.contactAddressesHolder, false).also { + binding.contactAddressesHolder.addView(it.root) + } + } else { + ItemEditAddressBinding.bind(addressHolderView) } - addressHolder!!.apply { - contact_address.setText(address.value) - setupAddressTypePicker(contact_address_type, address.type, address.label) + addressHolder.apply { + contactAddress.setText(address.value) + setupAddressTypePicker(contactAddressType, address.type, address.label) } } } private fun setupIMs() { contact!!.IMs.forEachIndexed { index, IM -> - var imHolder = contact_ims_holder.getChildAt(index) - if (imHolder == null) { - imHolder = layoutInflater.inflate(R.layout.item_edit_im, contact_ims_holder, false) - contact_ims_holder.addView(imHolder) + val imHolderView = binding.contactImsHolder.getChildAt(index) + val imHolder = if (imHolderView == null) { + ItemEditImBinding.inflate(layoutInflater, binding.contactImsHolder, false).also { + binding.contactImsHolder.addView(it.root) + } + } else { + ItemEditImBinding.bind(imHolderView) } - imHolder!!.apply { - contact_im.setText(IM.value) - setupIMTypePicker(contact_im_type, IM.type, IM.label) + imHolder.apply { + contactIm.setText(IM.value) + setupIMTypePicker(contactImType, IM.type, IM.label) } } } private fun setupNotes() { - contact_notes.setText(contact!!.notes) + binding.contactNotes.setText(contact!!.notes) } private fun setupRingtone() { - contact_ringtone.setOnClickListener { + binding.contactRingtone.setOnClickListener { hideKeyboard() val ringtonePickerIntent = getRingtonePickerIntent() try { @@ -639,7 +660,7 @@ class EditContactActivity : ContactActivity() { SelectAlarmSoundDialog(this, currentRingtone, AudioManager.STREAM_RING, PICK_RINGTONE_INTENT_ID, RingtoneManager.TYPE_RINGTONE, true, onAlarmPicked = { contact!!.ringtone = it?.uri - contact_ringtone.text = it?.title + binding.contactRingtone.text = it?.title }, onAlarmSoundDeleted = {} ) } @@ -647,46 +668,52 @@ class EditContactActivity : ContactActivity() { val ringtone = contact!!.ringtone if (ringtone?.isEmpty() == true) { - contact_ringtone.text = getString(R.string.no_sound) + binding.contactRingtone.text = getString(com.simplemobiletools.commons.R.string.no_sound) } else if (ringtone?.isNotEmpty() == true) { if (ringtone == SILENT) { - contact_ringtone.text = getString(R.string.no_sound) + binding.contactRingtone.text = getString(com.simplemobiletools.commons.R.string.no_sound) } else { systemRingtoneSelected(Uri.parse(ringtone)) } } else { val default = getDefaultAlarmSound(RingtoneManager.TYPE_RINGTONE) - contact_ringtone.text = default.title + binding.contactRingtone.text = default.title } } private fun setupOrganization() { - contact_organization_company.setText(contact!!.organization.company) - contact_organization_job_position.setText(contact!!.organization.jobPosition) + binding.contactOrganizationCompany.setText(contact!!.organization.company) + binding.contactOrganizationJobPosition.setText(contact!!.organization.jobPosition) } private fun setupWebsites() { contact!!.websites.forEachIndexed { index, website -> - var websitesHolder = contact_websites_holder.getChildAt(index) - if (websitesHolder == null) { - websitesHolder = layoutInflater.inflate(R.layout.item_edit_website, contact_websites_holder, false) - contact_websites_holder.addView(websitesHolder) + val websitesHolderView = binding.contactWebsitesHolder.getChildAt(index) + val websitesHolder = if (websitesHolderView == null) { + ItemEditWebsiteBinding.inflate(layoutInflater, binding.contactWebsitesHolder, false).also { + binding.contactWebsitesHolder.addView(it.root) + } + } else { + ItemEditWebsiteBinding.bind(websitesHolderView) } - websitesHolder!!.contact_website.setText(website) + websitesHolder.contactWebsite.setText(website) } } private fun setupEvents() { contact!!.events.forEachIndexed { index, event -> - var eventHolder = contact_events_holder.getChildAt(index) - if (eventHolder == null) { - eventHolder = layoutInflater.inflate(R.layout.item_event, contact_events_holder, false) - contact_events_holder.addView(eventHolder) + val eventHolderView = binding.contactEventsHolder.getChildAt(index) + val eventHolder = if (eventHolderView == null) { + ItemEventBinding.inflate(layoutInflater, binding.contactEventsHolder, false).also { + binding.contactEventsHolder.addView(it.root) + } + } else { + ItemEventBinding.bind(eventHolderView) } - (eventHolder as ViewGroup).apply { - val contactEvent = contact_event.apply { + eventHolder.apply { + val contactEvent = contactEvent.apply { event.value.getDateTimeFromDateString(true, this) tag = event.value alpha = 1f @@ -694,7 +721,7 @@ class EditContactActivity : ContactActivity() { setupEventTypePicker(this, event.type) - contact_event_remove.apply { + contactEventRemove.apply { beVisible() applyColorFilter(getProperPrimaryColor()) background.applyColorFilter(getProperTextColor()) @@ -707,28 +734,31 @@ class EditContactActivity : ContactActivity() { } private fun setupGroups() { - contact_groups_holder.removeAllViews() + binding.contactGroupsHolder.removeAllViews() val groups = contact!!.groups groups.forEachIndexed { index, group -> - var groupHolder = contact_groups_holder.getChildAt(index) - if (groupHolder == null) { - groupHolder = layoutInflater.inflate(R.layout.item_edit_group, contact_groups_holder, false) - contact_groups_holder.addView(groupHolder) + val groupHolderView = binding.contactGroupsHolder.getChildAt(index) + val groupHolder = if (groupHolderView == null) { + ItemEditGroupBinding.inflate(layoutInflater, binding.contactGroupsHolder, false).also { + binding.contactGroupsHolder.addView(it.root) + } + } else { + ItemEditGroupBinding.bind(groupHolderView) } - (groupHolder as ViewGroup).apply { - contact_group.apply { + groupHolder.apply { + contactGroup.apply { text = group.title setTextColor(getProperTextColor()) tag = group.id alpha = 1f } - setOnClickListener { + root.setOnClickListener { showSelectGroupsDialog() } - contact_group_remove.apply { + contactGroupRemove.apply { beVisible() applyColorFilter(getProperPrimaryColor()) background.applyColorFilter(getProperTextColor()) @@ -740,16 +770,16 @@ class EditContactActivity : ContactActivity() { } if (groups.isEmpty()) { - layoutInflater.inflate(R.layout.item_edit_group, contact_groups_holder, false).apply { - contact_group.apply { + ItemEditGroupBinding.inflate(layoutInflater, binding.contactGroupsHolder, false).apply { + contactGroup.apply { alpha = 0.5f text = getString(R.string.no_groups) setTextColor(getProperTextColor()) } - contact_groups_holder.addView(this) - contact_group_remove.beGone() - setOnClickListener { + contactGroupHolder.addView(root) + contactGroupRemove.beGone() + root.setOnClickListener { showSelectGroupsDialog() } } @@ -759,7 +789,7 @@ class EditContactActivity : ContactActivity() { private fun setupContactSource() { originalContactSource = contact!!.source getPublicContactSource(contact!!.source) { - contact_source.text = if (it == "") getString(R.string.phone_storage) else it + binding.contactSource.text = if (it == "") getString(R.string.phone_storage) else it } } @@ -767,7 +797,7 @@ class EditContactActivity : ContactActivity() { originalContactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE contact = getEmptyContact() getPublicContactSource(contact!!.source) { - contact_source.text = if (it == "") getString(R.string.phone_storage) else it + binding.contactSource.text = if (it == "") getString(R.string.phone_storage) else it } // if the last used contact source is not available anymore, use the first available one. Could happen at ejecting SIM card @@ -777,7 +807,7 @@ class EditContactActivity : ContactActivity() { originalContactSource = sourceNames.first() contact?.source = originalContactSource getPublicContactSource(contact!!.source) { - contact_source.text = if (it == "") getString(R.string.phone_storage) else it + binding.contactSource.text = if (it == "") getString(R.string.phone_storage) else it } } } @@ -785,43 +815,43 @@ class EditContactActivity : ContactActivity() { private fun setupTypePickers() { if (contact!!.phoneNumbers.isEmpty()) { - val numberHolder = contact_numbers_holder.getChildAt(0) - (numberHolder as? ViewGroup)?.contact_number_type?.apply { + val numberHolder = ItemEditPhoneNumberBinding.bind(binding.contactNumbersHolder.getChildAt(0)) + numberHolder.contactNumberType.apply { setupPhoneNumberTypePicker(this, DEFAULT_PHONE_NUMBER_TYPE, "") } } if (contact!!.emails.isEmpty()) { - val emailHolder = contact_emails_holder.getChildAt(0) - (emailHolder as? ViewGroup)?.contact_email_type?.apply { + val emailHolder = ItemEditEmailBinding.bind(binding.contactEmailsHolder.getChildAt(0)) + emailHolder.contactEmailType.apply { setupEmailTypePicker(this, DEFAULT_EMAIL_TYPE, "") } } if (contact!!.addresses.isEmpty()) { - val addressHolder = contact_addresses_holder.getChildAt(0) - (addressHolder as? ViewGroup)?.contact_address_type?.apply { + val addressHolder = ItemEditAddressBinding.bind(binding.contactAddressesHolder.getChildAt(0)) + addressHolder.contactAddressType.apply { setupAddressTypePicker(this, DEFAULT_ADDRESS_TYPE, "") } } if (contact!!.IMs.isEmpty()) { - val IMHolder = contact_ims_holder.getChildAt(0) - (IMHolder as? ViewGroup)?.contact_im_type?.apply { + val IMHolder = ItemEditImBinding.bind(binding.contactImsHolder.getChildAt(0)) + IMHolder.contactImType.apply { setupIMTypePicker(this, DEFAULT_IM_TYPE, "") } } if (contact!!.events.isEmpty()) { - val eventHolder = contact_events_holder.getChildAt(0) - (eventHolder as? ViewGroup)?.apply { + val eventHolder = ItemEventBinding.bind(binding.contactEventsHolder.getChildAt(0)) + eventHolder.apply { setupEventTypePicker(this) } } if (contact!!.groups.isEmpty()) { - val groupsHolder = contact_groups_holder.getChildAt(0) - (groupsHolder as? ViewGroup)?.contact_group?.apply { + val groupsHolder = ItemEditGroupBinding.bind(binding.contactGroupsHolder.getChildAt(0)) + groupsHolder.contactGroup.apply { setupGroupsPicker(this) } } @@ -863,15 +893,15 @@ class EditContactActivity : ContactActivity() { } } - private fun setupEventTypePicker(eventHolder: ViewGroup, type: Int = DEFAULT_EVENT_TYPE) { - eventHolder.contact_event_type.apply { + private fun setupEventTypePicker(eventHolder: ItemEventBinding, type: Int = DEFAULT_EVENT_TYPE) { + eventHolder.contactEventType.apply { setText(getEventTextId(type)) setOnClickListener { showEventTypePicker(it as TextView) } } - val eventField = eventHolder.contact_event + val eventField = eventHolder.contactEvent eventField.setOnClickListener { MyDatePickerDialog(this, eventField.tag?.toString() ?: "") { dateTag -> eventField.apply { @@ -882,7 +912,7 @@ class EditContactActivity : ContactActivity() { } } - eventHolder.contact_event_remove.apply { + eventHolder.contactEventRemove.apply { applyColorFilter(getProperPrimaryColor()) background.applyColorFilter(getProperTextColor()) setOnClickListener { @@ -903,7 +933,7 @@ class EditContactActivity : ContactActivity() { private fun resetContactEvent(contactEvent: TextView, removeContactEventButton: ImageView) { contactEvent.apply { - text = getString(R.string.unknown) + text = getString(com.simplemobiletools.commons.R.string.unknown) tag = "" alpha = 0.5f } @@ -917,15 +947,15 @@ class EditContactActivity : ContactActivity() { private fun showNumberTypePicker(numberTypeField: TextView) { val items = arrayListOf( - RadioItem(Phone.TYPE_MOBILE, getString(R.string.mobile)), - RadioItem(Phone.TYPE_HOME, getString(R.string.home)), - RadioItem(Phone.TYPE_WORK, getString(R.string.work)), - RadioItem(Phone.TYPE_MAIN, getString(R.string.main_number)), - RadioItem(Phone.TYPE_FAX_WORK, getString(R.string.work_fax)), - RadioItem(Phone.TYPE_FAX_HOME, getString(R.string.home_fax)), - RadioItem(Phone.TYPE_PAGER, getString(R.string.pager)), - RadioItem(Phone.TYPE_OTHER, getString(R.string.other)), - RadioItem(Phone.TYPE_CUSTOM, getString(R.string.custom)) + RadioItem(Phone.TYPE_MOBILE, getString(com.simplemobiletools.commons.R.string.mobile)), + RadioItem(Phone.TYPE_HOME, getString(com.simplemobiletools.commons.R.string.home)), + RadioItem(Phone.TYPE_WORK, getString(com.simplemobiletools.commons.R.string.work)), + RadioItem(Phone.TYPE_MAIN, getString(com.simplemobiletools.commons.R.string.main_number)), + RadioItem(Phone.TYPE_FAX_WORK, getString(com.simplemobiletools.commons.R.string.work_fax)), + RadioItem(Phone.TYPE_FAX_HOME, getString(com.simplemobiletools.commons.R.string.home_fax)), + RadioItem(Phone.TYPE_PAGER, getString(com.simplemobiletools.commons.R.string.pager)), + RadioItem(Phone.TYPE_OTHER, getString(com.simplemobiletools.commons.R.string.other)), + RadioItem(Phone.TYPE_CUSTOM, getString(com.simplemobiletools.commons.R.string.custom)) ) val currentNumberTypeId = getPhoneNumberTypeId(numberTypeField.value) @@ -942,11 +972,11 @@ class EditContactActivity : ContactActivity() { private fun showEmailTypePicker(emailTypeField: TextView) { val items = arrayListOf( - RadioItem(CommonDataKinds.Email.TYPE_HOME, getString(R.string.home)), - RadioItem(CommonDataKinds.Email.TYPE_WORK, getString(R.string.work)), - RadioItem(CommonDataKinds.Email.TYPE_MOBILE, getString(R.string.mobile)), - RadioItem(CommonDataKinds.Email.TYPE_OTHER, getString(R.string.other)), - RadioItem(CommonDataKinds.Email.TYPE_CUSTOM, getString(R.string.custom)) + RadioItem(CommonDataKinds.Email.TYPE_HOME, getString(com.simplemobiletools.commons.R.string.home)), + RadioItem(CommonDataKinds.Email.TYPE_WORK, getString(com.simplemobiletools.commons.R.string.work)), + RadioItem(CommonDataKinds.Email.TYPE_MOBILE, getString(com.simplemobiletools.commons.R.string.mobile)), + RadioItem(CommonDataKinds.Email.TYPE_OTHER, getString(com.simplemobiletools.commons.R.string.other)), + RadioItem(CommonDataKinds.Email.TYPE_CUSTOM, getString(com.simplemobiletools.commons.R.string.custom)) ) val currentEmailTypeId = getEmailTypeId(emailTypeField.value) @@ -963,10 +993,10 @@ class EditContactActivity : ContactActivity() { private fun showAddressTypePicker(addressTypeField: TextView) { val items = arrayListOf( - RadioItem(StructuredPostal.TYPE_HOME, getString(R.string.home)), - RadioItem(StructuredPostal.TYPE_WORK, getString(R.string.work)), - RadioItem(StructuredPostal.TYPE_OTHER, getString(R.string.other)), - RadioItem(StructuredPostal.TYPE_CUSTOM, getString(R.string.custom)) + RadioItem(StructuredPostal.TYPE_HOME, getString(com.simplemobiletools.commons.R.string.home)), + RadioItem(StructuredPostal.TYPE_WORK, getString(com.simplemobiletools.commons.R.string.work)), + RadioItem(StructuredPostal.TYPE_OTHER, getString(com.simplemobiletools.commons.R.string.other)), + RadioItem(StructuredPostal.TYPE_CUSTOM, getString(com.simplemobiletools.commons.R.string.custom)) ) val currentAddressTypeId = getAddressTypeId(addressTypeField.value) @@ -991,7 +1021,7 @@ class EditContactActivity : ContactActivity() { RadioItem(Im.PROTOCOL_GOOGLE_TALK, getString(R.string.hangouts)), RadioItem(Im.PROTOCOL_ICQ, getString(R.string.icq)), RadioItem(Im.PROTOCOL_JABBER, getString(R.string.jabber)), - RadioItem(Im.PROTOCOL_CUSTOM, getString(R.string.custom)) + RadioItem(Im.PROTOCOL_CUSTOM, getString(com.simplemobiletools.commons.R.string.custom)) ) val currentIMTypeId = getIMTypeId(imTypeField.value) @@ -1008,9 +1038,9 @@ class EditContactActivity : ContactActivity() { private fun showEventTypePicker(eventTypeField: TextView) { val items = arrayListOf( - RadioItem(CommonDataKinds.Event.TYPE_ANNIVERSARY, getString(R.string.anniversary)), - RadioItem(CommonDataKinds.Event.TYPE_BIRTHDAY, getString(R.string.birthday)), - RadioItem(CommonDataKinds.Event.TYPE_OTHER, getString(R.string.other)) + RadioItem(CommonDataKinds.Event.TYPE_ANNIVERSARY, getString(com.simplemobiletools.commons.R.string.anniversary)), + RadioItem(CommonDataKinds.Event.TYPE_BIRTHDAY, getString(com.simplemobiletools.commons.R.string.birthday)), + RadioItem(CommonDataKinds.Event.TYPE_OTHER, getString(com.simplemobiletools.commons.R.string.other)) ) val currentEventTypeId = getEventTypeId(eventTypeField.value) @@ -1030,7 +1060,7 @@ class EditContactActivity : ContactActivity() { showContactSourcePicker(contact!!.source) { contact!!.source = if (it == getString(R.string.phone_storage_hidden)) SMT_PRIVATE else it getPublicContactSource(it) { - contact_source.text = if (it == "") getString(R.string.phone_storage) else it + binding.contactSource.text = if (it == "") getString(R.string.phone_storage) else it } } } @@ -1041,8 +1071,8 @@ class EditContactActivity : ContactActivity() { } val contactFields = arrayListOf( - contact_prefix, contact_first_name, contact_middle_name, contact_surname, contact_suffix, contact_nickname, - contact_notes, contact_organization_company, contact_organization_job_position + binding.contactPrefix, binding.contactFirstName, binding.contactMiddleName, binding.contactSurname, binding.contactSuffix, binding.contactNickname, + binding.contactNotes, binding.contactOrganizationCompany, binding.contactOrganizationJobPosition ) if (contactFields.all { it.value.isEmpty() }) { @@ -1090,12 +1120,12 @@ class EditContactActivity : ContactActivity() { val filledWebsites = getFilledWebsites() val newContact = contact!!.copy( - prefix = contact_prefix.value, - firstName = contact_first_name.value, - middleName = contact_middle_name.value, - surname = contact_surname.value, - suffix = contact_suffix.value, - nickname = contact_nickname.value, + prefix = binding.contactPrefix.value, + firstName = binding.contactFirstName.value, + middleName = binding.contactMiddleName.value, + surname = binding.contactSurname.value, + suffix = binding.contactSuffix.value, + nickname = binding.contactNickname.value, photoUri = currentContactPhotoPath, phoneNumbers = filledPhoneNumbers, emails = filledEmails, @@ -1103,36 +1133,36 @@ class EditContactActivity : ContactActivity() { IMs = filledIMs, events = filledEvents, starred = if (isContactStarred()) 1 else 0, - notes = contact_notes.value, + notes = binding.contactNotes.value, websites = filledWebsites, ) - val company = contact_organization_company.value - val jobPosition = contact_organization_job_position.value + val company = binding.contactOrganizationCompany.value + val jobPosition = binding.contactOrganizationJobPosition.value newContact.organization = Organization(company, jobPosition) return newContact } private fun getFilledPhoneNumbers(): ArrayList { val phoneNumbers = ArrayList() - val numbersCount = contact_numbers_holder.childCount + val numbersCount = binding.contactNumbersHolder.childCount for (i in 0 until numbersCount) { - val numberHolder = contact_numbers_holder.getChildAt(i) - val number = numberHolder.contact_number.value - val numberType = getPhoneNumberTypeId(numberHolder.contact_number_type.value) - val numberLabel = if (numberType == Phone.TYPE_CUSTOM) numberHolder.contact_number_type.value else "" + val numberHolder = ItemEditPhoneNumberBinding.bind(binding.contactNumbersHolder.getChildAt(i)) + val number = numberHolder.contactNumber.value + val numberType = getPhoneNumberTypeId(numberHolder.contactNumberType.value) + val numberLabel = if (numberType == Phone.TYPE_CUSTOM) numberHolder.contactNumberType.value else "" if (number.isNotEmpty()) { var normalizedNumber = number.normalizePhoneNumber() // fix a glitch when onBackPressed the app thinks that a number changed because we fetched // normalized number +421903123456, then at getting it from the input field we get 0903123456, can happen at WhatsApp contacts - val fetchedNormalizedNumber = numberHolder.contact_number.tag?.toString() ?: "" + val fetchedNormalizedNumber = numberHolder.contactNumber.tag?.toString() ?: "" if (PhoneNumberUtils.compare(number.normalizePhoneNumber(), fetchedNormalizedNumber)) { normalizedNumber = fetchedNormalizedNumber } - val isPrimary = numberHolder.default_toggle_icon.tag == 1 + val isPrimary = numberHolder.defaultToggleIcon.tag == 1 phoneNumbers.add(PhoneNumber(number, numberType, numberLabel, normalizedNumber, isPrimary)) } } @@ -1141,12 +1171,12 @@ class EditContactActivity : ContactActivity() { private fun getFilledEmails(): ArrayList { val emails = ArrayList() - val emailsCount = contact_emails_holder.childCount + val emailsCount = binding.contactEmailsHolder.childCount for (i in 0 until emailsCount) { - val emailHolder = contact_emails_holder.getChildAt(i) - val email = emailHolder.contact_email.value - val emailType = getEmailTypeId(emailHolder.contact_email_type.value) - val emailLabel = if (emailType == CommonDataKinds.Email.TYPE_CUSTOM) emailHolder.contact_email_type.value else "" + val emailHolder = ItemEditEmailBinding.bind(binding.contactEmailsHolder.getChildAt(i)) + val email = emailHolder.contactEmail.value + val emailType = getEmailTypeId(emailHolder.contactEmailType.value) + val emailLabel = if (emailType == CommonDataKinds.Email.TYPE_CUSTOM) emailHolder.contactEmailType.value else "" if (email.isNotEmpty()) { emails.add(Email(email, emailType, emailLabel)) @@ -1157,12 +1187,12 @@ class EditContactActivity : ContactActivity() { private fun getFilledAddresses(): ArrayList
{ val addresses = ArrayList
() - val addressesCount = contact_addresses_holder.childCount + val addressesCount = binding.contactAddressesHolder.childCount for (i in 0 until addressesCount) { - val addressHolder = contact_addresses_holder.getChildAt(i) - val address = addressHolder.contact_address.value - val addressType = getAddressTypeId(addressHolder.contact_address_type.value) - val addressLabel = if (addressType == StructuredPostal.TYPE_CUSTOM) addressHolder.contact_address_type.value else "" + val addressHolder = ItemEditAddressBinding.bind(binding.contactAddressesHolder.getChildAt(i)) + val address = addressHolder.contactAddress.value + val addressType = getAddressTypeId(addressHolder.contactAddressType.value) + val addressLabel = if (addressType == StructuredPostal.TYPE_CUSTOM) addressHolder.contactAddressType.value else "" if (address.isNotEmpty()) { addresses.add(Address(address, addressType, addressLabel)) @@ -1173,12 +1203,12 @@ class EditContactActivity : ContactActivity() { private fun getFilledIMs(): ArrayList { val IMs = ArrayList() - val IMsCount = contact_ims_holder.childCount + val IMsCount = binding.contactImsHolder.childCount for (i in 0 until IMsCount) { - val IMsHolder = contact_ims_holder.getChildAt(i) - val IM = IMsHolder.contact_im.value - val IMType = getIMTypeId(IMsHolder.contact_im_type.value) - val IMLabel = if (IMType == Im.PROTOCOL_CUSTOM) IMsHolder.contact_im_type.value else "" + val IMsHolder = ItemEditImBinding.bind(binding.contactImsHolder.getChildAt(i)) + val IM = IMsHolder.contactIm.value + val IMType = getIMTypeId(IMsHolder.contactImType.value) + val IMLabel = if (IMType == Im.PROTOCOL_CUSTOM) IMsHolder.contactImType.value else "" if (IM.isNotEmpty()) { IMs.add(IM(IM, IMType, IMLabel)) @@ -1188,16 +1218,16 @@ class EditContactActivity : ContactActivity() { } private fun getFilledEvents(): ArrayList { - val unknown = getString(R.string.unknown) + val unknown = getString(com.simplemobiletools.commons.R.string.unknown) val events = ArrayList() - val eventsCount = contact_events_holder.childCount + val eventsCount = binding.contactEventsHolder.childCount for (i in 0 until eventsCount) { - val eventHolder = contact_events_holder.getChildAt(i) - val event = eventHolder.contact_event.value - val eventType = getEventTypeId(eventHolder.contact_event_type.value) + val eventHolder = ItemEventBinding.bind(binding.contactEventsHolder.getChildAt(i)) + val event = eventHolder.contactEvent.value + val eventType = getEventTypeId(eventHolder.contactEventType.value) if (event.isNotEmpty() && event != unknown) { - events.add(Event(eventHolder.contact_event.tag.toString(), eventType)) + events.add(Event(eventHolder.contactEvent.tag.toString(), eventType)) } } return events @@ -1205,10 +1235,10 @@ class EditContactActivity : ContactActivity() { private fun getFilledWebsites(): ArrayList { val websites = ArrayList() - val websitesCount = contact_websites_holder.childCount + val websitesCount = binding.contactWebsitesHolder.childCount for (i in 0 until websitesCount) { - val websiteHolder = contact_websites_holder.getChildAt(i) - val website = websiteHolder.contact_website.value + val websiteHolder = ItemEditWebsiteBinding.bind(binding.contactWebsitesHolder.getChildAt(i)) + val website = websiteHolder.contactWebsite.value if (website.isNotEmpty()) { websites.add(website) } @@ -1236,7 +1266,7 @@ class EditContactActivity : ContactActivity() { finish() } } else { - toast(R.string.unknown_error_occurred) + toast(com.simplemobiletools.commons.R.string.unknown_error_occurred) } } @@ -1256,7 +1286,7 @@ class EditContactActivity : ContactActivity() { finish() } } else { - toast(R.string.unknown_error_occurred) + toast(com.simplemobiletools.commons.R.string.unknown_error_occurred) } } @@ -1322,61 +1352,61 @@ class EditContactActivity : ContactActivity() { } private fun addNewPhoneNumberField() { - val numberHolder = layoutInflater.inflate(R.layout.item_edit_phone_number, contact_numbers_holder, false) as ViewGroup - updateTextColors(numberHolder) - setupPhoneNumberTypePicker(numberHolder.contact_number_type, DEFAULT_PHONE_NUMBER_TYPE, "") - contact_numbers_holder.addView(numberHolder) - contact_numbers_holder.onGlobalLayout { - numberHolder.contact_number.requestFocus() - showKeyboard(numberHolder.contact_number) + val numberHolder = ItemEditPhoneNumberBinding.inflate(layoutInflater, binding.contactNumbersHolder, false) + updateTextColors(numberHolder.root) + setupPhoneNumberTypePicker(numberHolder.contactNumberType, DEFAULT_PHONE_NUMBER_TYPE, "") + binding.contactNumbersHolder.addView(numberHolder.root) + binding.contactNumbersHolder.onGlobalLayout { + numberHolder.contactNumber.requestFocus() + showKeyboard(numberHolder.contactNumber) } - numberHolder.default_toggle_icon.tag = 0 + numberHolder.defaultToggleIcon.tag = 0 initNumberHolders() } private fun addNewEmailField() { - val emailHolder = layoutInflater.inflate(R.layout.item_edit_email, contact_emails_holder, false) as ViewGroup - updateTextColors(emailHolder) - setupEmailTypePicker(emailHolder.contact_email_type, DEFAULT_EMAIL_TYPE, "") - contact_emails_holder.addView(emailHolder) - contact_emails_holder.onGlobalLayout { - emailHolder.contact_email.requestFocus() - showKeyboard(emailHolder.contact_email) + val emailHolder = ItemEditEmailBinding.inflate(layoutInflater, binding.contactEmailsHolder, false) + updateTextColors(emailHolder.root) + setupEmailTypePicker(emailHolder.contactEmailType, DEFAULT_EMAIL_TYPE, "") + binding.contactEmailsHolder.addView(emailHolder.root) + binding.contactEmailsHolder.onGlobalLayout { + emailHolder.contactEmail.requestFocus() + showKeyboard(emailHolder.contactEmail) } } private fun addNewAddressField() { - val addressHolder = layoutInflater.inflate(R.layout.item_edit_address, contact_addresses_holder, false) as ViewGroup - updateTextColors(addressHolder) - setupAddressTypePicker(addressHolder.contact_address_type, DEFAULT_ADDRESS_TYPE, "") - contact_addresses_holder.addView(addressHolder) - contact_addresses_holder.onGlobalLayout { - addressHolder.contact_address.requestFocus() - showKeyboard(addressHolder.contact_address) + val addressHolder = ItemEditAddressBinding.inflate(layoutInflater, binding.contactAddressesHolder, false) + updateTextColors(addressHolder.root) + setupAddressTypePicker(addressHolder.contactAddressType, DEFAULT_ADDRESS_TYPE, "") + binding.contactAddressesHolder.addView(addressHolder.root) + binding.contactAddressesHolder.onGlobalLayout { + addressHolder.contactAddress.requestFocus() + showKeyboard(addressHolder.contactAddress) } } private fun addNewIMField() { - val IMHolder = layoutInflater.inflate(R.layout.item_edit_im, contact_ims_holder, false) as ViewGroup - updateTextColors(IMHolder) - setupIMTypePicker(IMHolder.contact_im_type, DEFAULT_IM_TYPE, "") - contact_ims_holder.addView(IMHolder) - contact_ims_holder.onGlobalLayout { - IMHolder.contact_im.requestFocus() - showKeyboard(IMHolder.contact_im) + val IMHolder = ItemEditImBinding.inflate(layoutInflater, binding.contactImsHolder, false) + updateTextColors(IMHolder.root) + setupIMTypePicker(IMHolder.contactImType, DEFAULT_IM_TYPE, "") + binding.contactImsHolder.addView(IMHolder.root) + binding.contactImsHolder.onGlobalLayout { + IMHolder.contactIm.requestFocus() + showKeyboard(IMHolder.contactIm) } } private fun addNewEventField() { - val eventHolder = layoutInflater.inflate(R.layout.item_event, contact_events_holder, false) as ViewGroup - updateTextColors(eventHolder) + val eventHolder = ItemEventBinding.inflate(layoutInflater, binding.contactEventsHolder, false) + updateTextColors(eventHolder.root) setupEventTypePicker(eventHolder) - contact_events_holder.addView(eventHolder) + binding.contactEventsHolder.addView(eventHolder.root) } private fun toggleFavorite() { val isStarred = isContactStarred() - contact_toggle_favorite.apply { + binding.contactToggleFavorite.apply { setImageDrawable(getStarDrawable(!isStarred)) tag = if (isStarred) 0 else 1 @@ -1385,23 +1415,24 @@ class EditContactActivity : ContactActivity() { } private fun addNewWebsiteField() { - val websitesHolder = layoutInflater.inflate(R.layout.item_edit_website, contact_websites_holder, false) as ViewGroup - updateTextColors(websitesHolder) - contact_websites_holder.addView(websitesHolder) - contact_websites_holder.onGlobalLayout { - websitesHolder.contact_website.requestFocus() - showKeyboard(websitesHolder.contact_website) + val websitesHolder = ItemEditWebsiteBinding.inflate(layoutInflater, binding.contactWebsitesHolder, false) + updateTextColors(websitesHolder.root) + binding.contactWebsitesHolder.addView(websitesHolder.root) + binding.contactWebsitesHolder.onGlobalLayout { + websitesHolder.contactWebsite.requestFocus() + showKeyboard(websitesHolder.contactWebsite) } } - private fun isContactStarred() = contact_toggle_favorite.tag == 1 + private fun isContactStarred() = binding.contactToggleFavorite.tag == 1 - private fun getStarDrawable(on: Boolean) = resources.getDrawable(if (on) R.drawable.ic_star_vector else R.drawable.ic_star_outline_vector) + private fun getStarDrawable(on: Boolean) = + resources.getDrawable(if (on) com.simplemobiletools.commons.R.drawable.ic_star_vector else com.simplemobiletools.commons.R.drawable.ic_star_outline_vector) private fun trySetPhoto() { val items = arrayListOf( - RadioItem(TAKE_PHOTO, getString(R.string.take_photo)), - RadioItem(CHOOSE_PHOTO, getString(R.string.choose_photo)) + RadioItem(TAKE_PHOTO, getString(com.simplemobiletools.commons.R.string.take_photo)), + RadioItem(CHOOSE_PHOTO, getString(com.simplemobiletools.commons.R.string.choose_photo)) ) if (currentContactPhotoPath.isNotEmpty() || contact!!.photo != null) { @@ -1413,8 +1444,8 @@ class EditContactActivity : ContactActivity() { TAKE_PHOTO -> startTakePhotoIntent() CHOOSE_PHOTO -> startChoosePhotoIntent() else -> { - showPhotoPlaceholder(contact_photo) - contact_photo_bottom_shadow.beGone() + showPhotoPlaceholder(binding.contactPhoto) + binding.contactPhotoBottomShadow.beGone() } } } @@ -1481,7 +1512,7 @@ class EditContactActivity : ContactActivity() { try { startActivityForResult(this, INTENT_TAKE_PHOTO) } catch (e: ActivityNotFoundException) { - toast(R.string.no_app_found) + toast(com.simplemobiletools.commons.R.string.no_app_found) } catch (e: Exception) { showErrorToast(e) } @@ -1501,7 +1532,7 @@ class EditContactActivity : ContactActivity() { try { startActivityForResult(this, INTENT_CHOOSE_PHOTO) } catch (e: ActivityNotFoundException) { - toast(R.string.no_app_found) + toast(com.simplemobiletools.commons.R.string.no_app_found) } catch (e: Exception) { showErrorToast(e) } @@ -1510,45 +1541,45 @@ class EditContactActivity : ContactActivity() { override fun customRingtoneSelected(ringtonePath: String) { contact!!.ringtone = ringtonePath - contact_ringtone.text = ringtonePath.getFilenameFromPath() + binding.contactRingtone.text = ringtonePath.getFilenameFromPath() } override fun systemRingtoneSelected(uri: Uri?) { contact!!.ringtone = uri?.toString() ?: "" val contactRingtone = RingtoneManager.getRingtone(this, uri) - contact_ringtone.text = contactRingtone.getTitle(this) + binding.contactRingtone.text = contactRingtone.getTitle(this) } private fun getPhoneNumberTypeId(value: String) = when (value) { - getString(R.string.mobile) -> Phone.TYPE_MOBILE - getString(R.string.home) -> Phone.TYPE_HOME - getString(R.string.work) -> Phone.TYPE_WORK - getString(R.string.main_number) -> Phone.TYPE_MAIN - getString(R.string.work_fax) -> Phone.TYPE_FAX_WORK - getString(R.string.home_fax) -> Phone.TYPE_FAX_HOME - getString(R.string.pager) -> Phone.TYPE_PAGER - getString(R.string.other) -> Phone.TYPE_OTHER + getString(com.simplemobiletools.commons.R.string.mobile) -> Phone.TYPE_MOBILE + getString(com.simplemobiletools.commons.R.string.home) -> Phone.TYPE_HOME + getString(com.simplemobiletools.commons.R.string.work) -> Phone.TYPE_WORK + getString(com.simplemobiletools.commons.R.string.main_number) -> Phone.TYPE_MAIN + getString(com.simplemobiletools.commons.R.string.work_fax) -> Phone.TYPE_FAX_WORK + getString(com.simplemobiletools.commons.R.string.home_fax) -> Phone.TYPE_FAX_HOME + getString(com.simplemobiletools.commons.R.string.pager) -> Phone.TYPE_PAGER + getString(com.simplemobiletools.commons.R.string.other) -> Phone.TYPE_OTHER else -> Phone.TYPE_CUSTOM } private fun getEmailTypeId(value: String) = when (value) { - getString(R.string.home) -> CommonDataKinds.Email.TYPE_HOME - getString(R.string.work) -> CommonDataKinds.Email.TYPE_WORK - getString(R.string.mobile) -> CommonDataKinds.Email.TYPE_MOBILE - getString(R.string.other) -> CommonDataKinds.Email.TYPE_OTHER + getString(com.simplemobiletools.commons.R.string.home) -> CommonDataKinds.Email.TYPE_HOME + getString(com.simplemobiletools.commons.R.string.work) -> CommonDataKinds.Email.TYPE_WORK + getString(com.simplemobiletools.commons.R.string.mobile) -> CommonDataKinds.Email.TYPE_MOBILE + getString(com.simplemobiletools.commons.R.string.other) -> CommonDataKinds.Email.TYPE_OTHER else -> CommonDataKinds.Email.TYPE_CUSTOM } private fun getEventTypeId(value: String) = when (value) { - getString(R.string.anniversary) -> CommonDataKinds.Event.TYPE_ANNIVERSARY - getString(R.string.birthday) -> CommonDataKinds.Event.TYPE_BIRTHDAY + getString(com.simplemobiletools.commons.R.string.anniversary) -> CommonDataKinds.Event.TYPE_ANNIVERSARY + getString(com.simplemobiletools.commons.R.string.birthday) -> CommonDataKinds.Event.TYPE_BIRTHDAY else -> CommonDataKinds.Event.TYPE_OTHER } private fun getAddressTypeId(value: String) = when (value) { - getString(R.string.home) -> StructuredPostal.TYPE_HOME - getString(R.string.work) -> StructuredPostal.TYPE_WORK - getString(R.string.other) -> StructuredPostal.TYPE_OTHER + getString(com.simplemobiletools.commons.R.string.home) -> StructuredPostal.TYPE_HOME + getString(com.simplemobiletools.commons.R.string.work) -> StructuredPostal.TYPE_WORK + getString(com.simplemobiletools.commons.R.string.other) -> StructuredPostal.TYPE_OTHER else -> StructuredPostal.TYPE_CUSTOM } @@ -1573,14 +1604,14 @@ class EditContactActivity : ContactActivity() { view.setOnItemClickListener { _, _, position, _ -> val selectedContact = adapter.resultList[position] - if (contact_first_name.isVisible()) { - contact_first_name.setText(selectedContact.firstName) + if (binding.contactFirstName.isVisible()) { + binding.contactFirstName.setText(selectedContact.firstName) } - if (contact_middle_name.isVisible()) { - contact_middle_name.setText(selectedContact.middleName) + if (binding.contactMiddleName.isVisible()) { + binding.contactMiddleName.setText(selectedContact.middleName) } - if (contact_surname.isVisible()) { - contact_surname.setText(selectedContact.surname) + if (binding.contactSurname.isVisible()) { + binding.contactSurname.setText(selectedContact.surname) } } view.doAfterTextChanged { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt index 5473a1cd..6d365278 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt @@ -14,20 +14,20 @@ import com.simplemobiletools.commons.models.contacts.Contact import com.simplemobiletools.commons.models.contacts.Group import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.adapters.ContactsAdapter +import com.simplemobiletools.contacts.pro.databinding.ActivityGroupContactsBinding import com.simplemobiletools.contacts.pro.dialogs.SelectContactsDialog import com.simplemobiletools.contacts.pro.extensions.handleGenericContactClick import com.simplemobiletools.contacts.pro.helpers.GROUP import com.simplemobiletools.contacts.pro.helpers.LOCATION_GROUP_CONTACTS import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener import com.simplemobiletools.contacts.pro.interfaces.RemoveFromGroupListener -import kotlinx.android.synthetic.main.activity_group_contacts.* -import kotlinx.android.synthetic.main.fragment_layout.fragment_list class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, RefreshContactsListener { private var allContacts = ArrayList() private var groupContacts = ArrayList() private var wasInit = false lateinit var group: Group + private lateinit var binding: ActivityGroupContactsBinding protected val INTENT_SELECT_RINGTONE = 600 @@ -36,42 +36,43 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh override fun onCreate(savedInstanceState: Bundle?) { isMaterialActivity = true super.onCreate(savedInstanceState) - setContentView(R.layout.activity_group_contacts) - updateTextColors(group_contacts_coordinator) + binding = ActivityGroupContactsBinding.inflate(layoutInflater) + setContentView(binding.root) + updateTextColors(binding.groupContactsCoordinator) setupOptionsMenu() - updateMaterialActivityViews(group_contacts_coordinator, group_contacts_list, useTransparentNavigation = true, useTopSearchMenu = false) - setupMaterialScrollListener(group_contacts_list, group_contacts_toolbar) + updateMaterialActivityViews(binding.groupContactsCoordinator, binding.groupContactsList, useTransparentNavigation = true, useTopSearchMenu = false) + setupMaterialScrollListener(binding.groupContactsList, binding.groupContactsToolbar) group = intent.extras?.getSerializable(GROUP) as Group - group_contacts_toolbar.title = group.title + binding.groupContactsToolbar.title = group.title - group_contacts_fab.setOnClickListener { + binding.groupContactsFab.setOnClickListener { if (wasInit) { fabClicked() } } - group_contacts_placeholder_2.setOnClickListener { + binding.groupContactsPlaceholder2.setOnClickListener { fabClicked() } val properPrimaryColor = getProperPrimaryColor() - group_contacts_fastscroller?.updateColors(properPrimaryColor) - group_contacts_placeholder_2.underlineText() - group_contacts_placeholder_2.setTextColor(properPrimaryColor) + binding.groupContactsFastscroller?.updateColors(properPrimaryColor) + binding.groupContactsPlaceholder2.underlineText() + binding.groupContactsPlaceholder2.setTextColor(properPrimaryColor) } override fun onResume() { super.onResume() refreshContacts() - setupToolbar(group_contacts_toolbar, NavigationIcon.Arrow) - (group_contacts_fab.layoutParams as CoordinatorLayout.LayoutParams).bottomMargin = - navigationBarHeight + resources.getDimension(R.dimen.activity_margin).toInt() + setupToolbar(binding.groupContactsToolbar, NavigationIcon.Arrow) + (binding.groupContactsFab.layoutParams as CoordinatorLayout.LayoutParams).bottomMargin = + navigationBarHeight + resources.getDimension(com.simplemobiletools.commons.R.dimen.activity_margin).toInt() } private fun setupOptionsMenu() { - group_contacts_toolbar.setOnMenuItemClickListener { menuItem -> + binding.groupContactsToolbar.setOnMenuItemClickListener { menuItem -> when (menuItem.itemId) { R.id.send_sms_to_group -> sendSMSToGroup() R.id.send_email_to_group -> sendEmailToGroup() @@ -113,16 +114,16 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh allContacts = it groupContacts = it.filter { it.groups.map { it.id }.contains(group.id) } as ArrayList - group_contacts_placeholder_2.beVisibleIf(groupContacts.isEmpty()) - group_contacts_placeholder.beVisibleIf(groupContacts.isEmpty()) - group_contacts_fastscroller.beVisibleIf(groupContacts.isNotEmpty()) + binding.groupContactsPlaceholder2.beVisibleIf(groupContacts.isEmpty()) + binding.groupContactsPlaceholder.beVisibleIf(groupContacts.isEmpty()) + binding.groupContactsFastscroller.beVisibleIf(groupContacts.isNotEmpty()) updateContacts(groupContacts) } } private fun sendSMSToGroup() { if (groupContacts.isEmpty()) { - toast(R.string.no_contacts_found) + toast(com.simplemobiletools.commons.R.string.no_contacts_found) } else { sendSMSToContacts(groupContacts) } @@ -130,7 +131,7 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh private fun sendEmailToGroup() { if (groupContacts.isEmpty()) { - toast(R.string.no_contacts_found) + toast(com.simplemobiletools.commons.R.string.no_contacts_found) } else { sendEmailToContacts(groupContacts) } @@ -146,23 +147,23 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh } private fun updateContacts(contacts: ArrayList) { - val currAdapter = group_contacts_list.adapter + val currAdapter = binding.groupContactsList.adapter if (currAdapter == null) { ContactsAdapter( this, contactItems = contacts, - recyclerView = fragment_list, + recyclerView = binding.groupContactsList, location = LOCATION_GROUP_CONTACTS, removeListener = this, refreshListener = this ) { contactClicked(it as Contact) }.apply { - group_contacts_list.adapter = this + binding.groupContactsList.adapter = this } if (areSystemAnimationsEnabled) { - group_contacts_list.scheduleLayoutAnimation() + binding.groupContactsList.scheduleLayoutAnimation() } } else { (currAdapter as ContactsAdapter).updateItems(contacts) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt index 71773824..6557ff83 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt @@ -8,14 +8,14 @@ import android.os.Bundle import android.provider.ContactsContract import android.provider.ContactsContract.CommonDataKinds.Email import android.provider.ContactsContract.CommonDataKinds.Phone -import android.widget.ImageView -import android.widget.TextView import androidx.viewpager.widget.ViewPager +import com.simplemobiletools.commons.databinding.BottomTablayoutItemBinding import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* -import com.simplemobiletools.commons.models.contacts.* +import com.simplemobiletools.commons.models.contacts.Contact import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.adapters.ViewPagerAdapter +import com.simplemobiletools.contacts.pro.databinding.ActivityInsertEditContactBinding import com.simplemobiletools.contacts.pro.dialogs.ChangeSortingDialog import com.simplemobiletools.contacts.pro.dialogs.FilterContactSourcesDialog import com.simplemobiletools.contacts.pro.extensions.config @@ -24,16 +24,16 @@ import com.simplemobiletools.contacts.pro.helpers.ADD_NEW_CONTACT_NUMBER import com.simplemobiletools.contacts.pro.helpers.KEY_EMAIL import com.simplemobiletools.contacts.pro.helpers.KEY_NAME import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener -import kotlinx.android.synthetic.main.activity_insert_edit_contact.* -import kotlinx.android.synthetic.main.fragment_contacts.* -import kotlinx.android.synthetic.main.fragment_favorites.* class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener { - private val START_INSERT_ACTIVITY = 1 - private val START_EDIT_ACTIVITY = 2 + companion object { + private const val START_INSERT_ACTIVITY = 1 + private const val START_EDIT_ACTIVITY = 2 + } private var isSelectContactIntent = false private var specialMimeType: String? = null + private lateinit var binding: ActivityInsertEditContactBinding private val contactsFavoritesList = arrayListOf( TAB_CONTACTS, @@ -42,10 +42,11 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_insert_edit_contact) + binding = ActivityInsertEditContactBinding.inflate(layoutInflater) + setContentView(binding.root) setupOptionsMenu() isSelectContactIntent = intent.action == Intent.ACTION_PICK - updateMaterialActivityViews(insert_edit_coordinator, insert_edit_contact_holder, useTransparentNavigation = false, useTopSearchMenu = true) + updateMaterialActivityViews(binding.insertEditCoordinator, binding.insertEditContactHolder, useTransparentNavigation = false, useTopSearchMenu = true) if (isSelectContactIntent) { specialMimeType = when (intent.data) { @@ -55,8 +56,8 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener { } } - new_contact_holder.beGoneIf(isSelectContactIntent) - select_contact_label.beGoneIf(isSelectContactIntent) + binding.newContactHolder.beGoneIf(isSelectContactIntent) + binding.selectContactLabel.beGoneIf(isSelectContactIntent) if (checkAppSideloading()) { return @@ -85,21 +86,21 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener { } private fun setupOptionsMenu() { - insert_edit_menu.getToolbar().inflateMenu(R.menu.menu_insert_or_edit) - insert_edit_menu.toggleHideOnScroll(false) - insert_edit_menu.setupMenu() + binding.insertEditMenu.getToolbar().inflateMenu(R.menu.menu_insert_or_edit) + binding.insertEditMenu.toggleHideOnScroll(false) + binding.insertEditMenu.setupMenu() - insert_edit_menu.onSearchClosedListener = { + binding.insertEditMenu.onSearchClosedListener = { getAllFragments().forEach { it?.onSearchClosed() } } - insert_edit_menu.onSearchTextChangedListener = { text -> + binding.insertEditMenu.onSearchTextChangedListener = { text -> getCurrentFragment()?.onSearchQueryChanged(text) } - insert_edit_menu.getToolbar().setOnMenuItemClickListener { menuItem -> + binding.insertEditMenu.getToolbar().setOnMenuItemClickListener { menuItem -> when (menuItem.itemId) { R.id.sort -> showSortingDialog() R.id.filter -> showFilterDialog() @@ -111,7 +112,7 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener { private fun updateMenuColors() { updateStatusbarColor(getProperBackgroundColor()) - insert_edit_menu.updateColors() + binding.insertEditMenu.updateColors() } override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { @@ -123,99 +124,106 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener { } override fun onBackPressed() { - if (insert_edit_menu.isSearchOpen) { - insert_edit_menu.closeSearch() + if (binding.insertEditMenu.isSearchOpen) { + binding.insertEditMenu.closeSearch() } else { super.onBackPressed() } } private fun initFragments() { - view_pager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) {} override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} override fun onPageSelected(position: Int) { - insert_edit_tabs_holder.getTabAt(position)?.select() + binding.insertEditTabsHolder.getTabAt(position)?.select() getAllFragments().forEach { it?.finishActMode() } } }) - view_pager.onGlobalLayout { + binding.viewPager.onGlobalLayout { refreshContacts(getTabsMask()) } - select_contact_label?.setTextColor(getProperPrimaryColor()) - new_contact_tmb?.setImageDrawable(resources.getColoredDrawableWithColor(R.drawable.ic_add_person_vector, getProperTextColor())) - new_contact_name.setTextColor(getProperTextColor()) - new_contact_holder?.setOnClickListener { + binding.selectContactLabel?.setTextColor(getProperPrimaryColor()) + binding.newContactTmb?.setImageDrawable( + resources.getColoredDrawableWithColor( + com.simplemobiletools.commons.R.drawable.ic_add_person_vector, + getProperTextColor() + ) + ) + binding.newContactName.setTextColor(getProperTextColor()) + binding.newContactHolder.setOnClickListener { createNewContact() } } private fun setupTabs() { - insert_edit_tabs_holder.removeAllTabs() + binding.insertEditTabsHolder.removeAllTabs() contactsFavoritesList.forEachIndexed { index, value -> if (config.showTabs and value != 0) { - insert_edit_tabs_holder.newTab().setCustomView(R.layout.bottom_tablayout_item).apply { - customView?.findViewById(R.id.tab_item_icon)?.setImageDrawable(getTabIcon(index)) - customView?.findViewById(R.id.tab_item_label)?.text = getTabLabel(index) - insert_edit_tabs_holder.addTab(this) + binding.insertEditTabsHolder.newTab().setCustomView(com.simplemobiletools.commons.R.layout.bottom_tablayout_item).apply tab@{ + customView?.let { BottomTablayoutItemBinding.bind(it) }?.apply { + tabItemIcon.setImageDrawable(getTabIcon(index)) + tabItemLabel.text = getTabLabel(index) + binding.insertEditTabsHolder.addTab(this@tab) + } } } } - insert_edit_tabs_holder.onTabSelectionChanged( + binding.insertEditTabsHolder.onTabSelectionChanged( tabUnselectedAction = { updateBottomTabItemColors(it.customView, false, getDeselectedTabDrawableIds()[it.position]) }, tabSelectedAction = { - insert_edit_menu.closeSearch() - view_pager.currentItem = it.position + binding.insertEditMenu.closeSearch() + binding.viewPager.currentItem = it.position updateBottomTabItemColors(it.customView, true, getSelectedTabDrawableIds()[it.position]) } ) - insert_edit_tabs_holder.beGoneIf(insert_edit_tabs_holder.tabCount == 1) + binding.insertEditTabsHolder.beGoneIf(binding.insertEditTabsHolder.tabCount == 1) } - private fun getCurrentFragment(): MyViewPagerFragment? { - return if (view_pager.currentItem == 0) { - contacts_fragment + private fun getCurrentFragment(): MyViewPagerFragment<*>? { + return if (binding.viewPager.currentItem == 0) { + findViewById(R.id.contacts_fragment) } else { - favorites_fragment + findViewById(R.id.favorites_fragment) } } - private fun getAllFragments() = arrayListOf(contacts_fragment, favorites_fragment) + private fun getAllFragments() = arrayListOf>(findViewById(R.id.contacts_fragment), findViewById(R.id.favorites_fragment)) private fun setupTabColors() { - val activeView = insert_edit_tabs_holder.getTabAt(view_pager.currentItem)?.customView - updateBottomTabItemColors(activeView, true, getSelectedTabDrawableIds()[view_pager.currentItem]) + val activeView = binding.insertEditTabsHolder.getTabAt(binding.viewPager.currentItem)?.customView + updateBottomTabItemColors(activeView, true, getSelectedTabDrawableIds()[binding.viewPager.currentItem]) - getInactiveTabIndexes(view_pager.currentItem).forEach { index -> - val inactiveView = insert_edit_tabs_holder.getTabAt(index)?.customView + getInactiveTabIndexes(binding.viewPager.currentItem).forEach { index -> + val inactiveView = binding.insertEditTabsHolder.getTabAt(index)?.customView updateBottomTabItemColors(inactiveView, false, getDeselectedTabDrawableIds()[index]) } val bottomBarColor = getBottomNavigationBackgroundColor() - insert_edit_tabs_holder.setBackgroundColor(bottomBarColor) + binding.insertEditTabsHolder.setBackgroundColor(bottomBarColor) updateNavigationBarColor(bottomBarColor) } - private fun getInactiveTabIndexes(activeIndex: Int) = (0 until insert_edit_tabs_holder.tabCount).filter { it != activeIndex } + private fun getInactiveTabIndexes(activeIndex: Int) = (0 until binding.insertEditTabsHolder.tabCount).filter { it != activeIndex } private fun getSelectedTabDrawableIds() = arrayOf( - R.drawable.ic_person_vector, - R.drawable.ic_star_vector + com.simplemobiletools.commons.R.drawable.ic_person_vector, + com.simplemobiletools.commons.R.drawable.ic_star_vector ) private fun getDeselectedTabDrawableIds() = arrayOf( - R.drawable.ic_person_outline_vector, - R.drawable.ic_star_outline_vector + com.simplemobiletools.commons.R.drawable.ic_person_outline_vector, + com.simplemobiletools.commons.R.drawable.ic_star_outline_vector ) override fun refreshContacts(refreshTabsMask: Int) { @@ -223,8 +231,8 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener { return } - if (view_pager.adapter == null) { - view_pager.adapter = ViewPagerAdapter(this, contactsFavoritesList, getTabsMask()) + if (binding.viewPager.adapter == null) { + binding.viewPager.adapter = ViewPagerAdapter(this, contactsFavoritesList, getTabsMask()) } ContactsHelper(this).getContacts { @@ -252,13 +260,17 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener { } if (refreshTabsMask and TAB_CONTACTS != 0) { - contacts_fragment?.skipHashComparing = true - contacts_fragment?.refreshContacts(contacts, placeholderText) + findViewById>(R.id.contacts_fragment)?.apply { + skipHashComparing = true + refreshContacts(contacts, placeholderText) + } } if (refreshTabsMask and TAB_FAVORITES != 0) { - favorites_fragment?.skipHashComparing = true - favorites_fragment?.refreshContacts(contacts, placeholderText) + findViewById>(R.id.favorites_fragment)?.apply { + skipHashComparing = true + refreshContacts(contacts, placeholderText) + } } } } @@ -299,6 +311,7 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener { val contactId = ContactsHelper(this).getContactMimeTypeId(contact.id.toString(), specialMimeType!!) Uri.withAppendedPath(ContactsContract.Data.CONTENT_URI, contactId) } + else -> getContactPublicUri(contact) } } @@ -327,7 +340,7 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener { try { startActivityForResult(this, START_INSERT_ACTIVITY) } catch (e: ActivityNotFoundException) { - toast(R.string.no_app_found) + toast(com.simplemobiletools.commons.R.string.no_app_found) } catch (e: Exception) { showErrorToast(e) } @@ -342,7 +355,7 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener { fun showFilterDialog() { FilterContactSourcesDialog(this) { - contacts_fragment?.forceListRedraw = true + findViewById>(R.id.contacts_fragment)?.forceListRedraw = true refreshContacts(getTabsMask()) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index adb3a1d3..d299e497 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -10,11 +10,10 @@ import android.graphics.drawable.Icon import android.graphics.drawable.LayerDrawable import android.net.Uri import android.os.Bundle -import android.widget.ImageView -import android.widget.TextView import android.widget.Toast import androidx.viewpager.widget.ViewPager import com.simplemobiletools.commons.databases.ContactsDatabase +import com.simplemobiletools.commons.databinding.BottomTablayoutItemBinding import com.simplemobiletools.commons.dialogs.ChangeViewTypeDialog import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.FilePickerDialog @@ -28,6 +27,7 @@ import com.simplemobiletools.commons.models.contacts.Contact import com.simplemobiletools.contacts.pro.BuildConfig import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.adapters.ViewPagerAdapter +import com.simplemobiletools.contacts.pro.databinding.ActivityMainBinding import com.simplemobiletools.contacts.pro.dialogs.ChangeSortingDialog import com.simplemobiletools.contacts.pro.dialogs.ExportContactsDialog import com.simplemobiletools.contacts.pro.dialogs.FilterContactSourcesDialog @@ -40,18 +40,16 @@ import com.simplemobiletools.contacts.pro.helpers.ALL_TABS_MASK import com.simplemobiletools.contacts.pro.helpers.VcfExporter import com.simplemobiletools.contacts.pro.helpers.tabsList import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener -import kotlinx.android.synthetic.main.activity_main.* -import kotlinx.android.synthetic.main.fragment_contacts.* -import kotlinx.android.synthetic.main.fragment_favorites.* -import kotlinx.android.synthetic.main.fragment_groups.* import me.grantland.widget.AutofitHelper import java.io.FileOutputStream import java.io.OutputStream import java.util.* class MainActivity : SimpleActivity(), RefreshContactsListener { - private val PICK_IMPORT_SOURCE_INTENT = 1 - private val PICK_EXPORT_FILE_INTENT = 2 + companion object { + private const val PICK_IMPORT_SOURCE_INTENT = 1 + private const val PICK_EXPORT_FILE_INTENT = 2 + } private var werePermissionsHandled = false private var isFirstResume = true @@ -63,22 +61,24 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { private var storedStartNameWithSurname = false private var storedFontSize = 0 private var storedShowTabs = 0 + private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) appLaunched(BuildConfig.APPLICATION_ID) setupOptionsMenu() refreshMenuItems() - updateMaterialActivityViews(main_coordinator, main_holder, useTransparentNavigation = false, useTopSearchMenu = true) + updateMaterialActivityViews(binding.mainCoordinator, binding.mainHolder, useTransparentNavigation = false, useTopSearchMenu = true) storeStateVariables() setupTabs() checkContactPermissions() checkWhatsNewDialog() if (isPackageInstalled("com.simplemobiletools.contacts")) { - val dialogText = getString(R.string.upgraded_from_free_contacts, getString(R.string.phone_storage_hidden)) - ConfirmationDialog(this, dialogText, 0, R.string.ok, 0, false) {} + val dialogText = getString(com.simplemobiletools.commons.R.string.upgraded_from_free_contacts, getString(R.string.phone_storage_hidden)) + ConfirmationDialog(this, dialogText, 0, com.simplemobiletools.commons.R.string.ok, 0, false) {} } } @@ -119,8 +119,8 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } val properPrimaryColor = getProperPrimaryColor() - main_tabs_holder.background = ColorDrawable(getProperBackgroundColor()) - main_tabs_holder.setSelectedTabIndicatorColor(properPrimaryColor) + binding.mainTabsHolder.background = ColorDrawable(getProperBackgroundColor()) + binding.mainTabsHolder.setSelectedTabIndicatorColor(properPrimaryColor) getAllFragments().forEach { it?.setupColors(getProperTextColor(), properPrimaryColor) } @@ -130,8 +130,8 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { val configStartNameWithSurname = config.startNameWithSurname if (storedStartNameWithSurname != configStartNameWithSurname) { - contacts_fragment?.startNameWithSurnameChanged(configStartNameWithSurname) - favorites_fragment?.startNameWithSurnameChanged(configStartNameWithSurname) + findViewById>(R.id.contacts_fragment)?.startNameWithSurnameChanged(configStartNameWithSurname) + findViewById>(R.id.favorites_fragment)?.startNameWithSurnameChanged(configStartNameWithSurname) } val configFontSize = config.fontSize @@ -142,15 +142,16 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } if (werePermissionsHandled && !isFirstResume) { - if (view_pager.adapter == null) { + if (binding.viewPager.adapter == null) { initFragments() } else { refreshContacts(ALL_TABS_MASK) } } - val dialpadIcon = resources.getColoredDrawableWithColor(R.drawable.ic_dialpad_vector, properPrimaryColor.getContrastColor()) - main_dialpad_button.apply { + val dialpadIcon = + resources.getColoredDrawableWithColor(com.simplemobiletools.commons.R.drawable.ic_dialpad_vector, properPrimaryColor.getContrastColor()) + binding.mainDialpadButton.apply { setImageDrawable(dialpadIcon) background.applyColorFilter(properPrimaryColor) beVisibleIf(config.showDialpadButton) @@ -163,7 +164,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { override fun onPause() { super.onPause() storeStateVariables() - config.lastUsedViewPagerPage = view_pager.currentItem + config.lastUsedViewPagerPage = binding.viewPager.currentItem } override fun onDestroy() { @@ -188,8 +189,8 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } override fun onBackPressed() { - if (main_menu.isSearchOpen) { - main_menu.closeSearch() + if (binding.mainMenu.isSearchOpen) { + binding.mainMenu.closeSearch() } else { super.onBackPressed() } @@ -197,32 +198,32 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { private fun refreshMenuItems() { val currentFragment = getCurrentFragment() - main_menu.getToolbar().menu.apply { - findItem(R.id.sort).isVisible = currentFragment != groups_fragment - findItem(R.id.filter).isVisible = currentFragment != groups_fragment + binding.mainMenu.getToolbar().menu.apply { + findItem(R.id.sort).isVisible = currentFragment != findViewById(R.id.groups_fragment) + findItem(R.id.filter).isVisible = currentFragment != findViewById(R.id.groups_fragment) findItem(R.id.dialpad).isVisible = !config.showDialpadButton - findItem(R.id.change_view_type).isVisible = currentFragment == favorites_fragment - findItem(R.id.column_count).isVisible = currentFragment == favorites_fragment && config.viewType == VIEW_TYPE_GRID - findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(R.bool.hide_google_relations) + findItem(R.id.change_view_type).isVisible = currentFragment == findViewById(R.id.favorites_fragment) + findItem(R.id.column_count).isVisible = currentFragment == findViewById(R.id.favorites_fragment) && config.viewType == VIEW_TYPE_GRID + findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(com.simplemobiletools.commons.R.bool.hide_google_relations) } } private fun setupOptionsMenu() { - main_menu.getToolbar().inflateMenu(R.menu.menu) - main_menu.toggleHideOnScroll(false) - main_menu.setupMenu() + binding.mainMenu.getToolbar().inflateMenu(R.menu.menu) + binding.mainMenu.toggleHideOnScroll(false) + binding.mainMenu.setupMenu() - main_menu.onSearchClosedListener = { + binding.mainMenu.onSearchClosedListener = { getAllFragments().forEach { it?.onSearchClosed() } } - main_menu.onSearchTextChangedListener = { text -> + binding.mainMenu.onSearchTextChangedListener = { text -> getCurrentFragment()?.onSearchQueryChanged(text) } - main_menu.getToolbar().setOnMenuItemClickListener { menuItem -> + binding.mainMenu.getToolbar().setOnMenuItemClickListener { menuItem -> when (menuItem.itemId) { R.id.sort -> showSortingDialog(showCustomSorting = getCurrentFragment() is FavoritesFragment) R.id.filter -> showFilterDialog() @@ -243,14 +244,14 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { private fun changeViewType() { ChangeViewTypeDialog(this) { refreshMenuItems() - favorites_fragment?.updateFavouritesAdapter() + findViewById(R.id.favorites_fragment)?.updateFavouritesAdapter() } } private fun changeColumnCount() { val items = ArrayList() for (i in 1..CONTACTS_GRID_MAX_COLUMNS_COUNT) { - items.add(RadioItem(i, resources.getQuantityString(R.plurals.column_counts, i, i))) + items.add(RadioItem(i, resources.getQuantityString(com.simplemobiletools.commons.R.plurals.column_counts, i, i))) } val currentColumnCount = config.contactsGridColumnCount @@ -258,14 +259,14 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { val newColumnCount = it as Int if (currentColumnCount != newColumnCount) { config.contactsGridColumnCount = newColumnCount - favorites_fragment?.columnCountChanged() + findViewById(R.id.favorites_fragment)?.columnCountChanged() } } } private fun updateMenuColors() { updateStatusbarColor(getProperBackgroundColor()) - main_menu.updateColors() + binding.mainMenu.updateColors() } private fun storeStateVariables() { @@ -294,9 +295,9 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { @SuppressLint("NewApi") private fun getCreateNewContactShortcut(appIconColor: Int): ShortcutInfo { - val newEvent = getString(R.string.create_new_contact) - val drawable = resources.getDrawable(R.drawable.shortcut_plus) - (drawable as LayerDrawable).findDrawableByLayerId(R.id.shortcut_plus_background).applyColorFilter(appIconColor) + val newEvent = getString(com.simplemobiletools.commons.R.string.create_new_contact) + val drawable = resources.getDrawable(com.simplemobiletools.commons.R.drawable.shortcut_plus) + (drawable as LayerDrawable).findDrawableByLayerId(com.simplemobiletools.commons.R.id.shortcut_plus_background).applyColorFilter(appIconColor) val bmp = drawable.convertToBitmap() val intent = Intent(this, EditContactActivity::class.java) @@ -309,54 +310,54 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { .build() } - private fun getCurrentFragment(): MyViewPagerFragment? { + private fun getCurrentFragment(): MyViewPagerFragment<*>? { val showTabs = config.showTabs - val fragments = arrayListOf() + val fragments = arrayListOf>() if (showTabs and TAB_CONTACTS != 0) { - fragments.add(contacts_fragment) + fragments.add(findViewById(R.id.contacts_fragment)) } if (showTabs and TAB_FAVORITES != 0) { - fragments.add(favorites_fragment) + fragments.add(findViewById(R.id.favorites_fragment)) } if (showTabs and TAB_GROUPS != 0) { - fragments.add(groups_fragment) + fragments.add(findViewById(R.id.groups_fragment)) } - return fragments.getOrNull(view_pager.currentItem) + return fragments.getOrNull(binding.viewPager.currentItem) } private fun setupTabColors() { - val activeView = main_tabs_holder.getTabAt(view_pager.currentItem)?.customView - updateBottomTabItemColors(activeView, true, getSelectedTabDrawableIds()[view_pager.currentItem]) + val activeView = binding.mainTabsHolder.getTabAt(binding.viewPager.currentItem)?.customView + updateBottomTabItemColors(activeView, true, getSelectedTabDrawableIds()[binding.viewPager.currentItem]) - getInactiveTabIndexes(view_pager.currentItem).forEach { index -> - val inactiveView = main_tabs_holder.getTabAt(index)?.customView + getInactiveTabIndexes(binding.viewPager.currentItem).forEach { index -> + val inactiveView = binding.mainTabsHolder.getTabAt(index)?.customView updateBottomTabItemColors(inactiveView, false, getDeselectedTabDrawableIds()[index]) } val bottomBarColor = getBottomNavigationBackgroundColor() - main_tabs_holder.setBackgroundColor(bottomBarColor) + binding.mainTabsHolder.setBackgroundColor(bottomBarColor) updateNavigationBarColor(bottomBarColor) } - private fun getInactiveTabIndexes(activeIndex: Int) = (0 until main_tabs_holder.tabCount).filter { it != activeIndex } + private fun getInactiveTabIndexes(activeIndex: Int) = (0 until binding.mainTabsHolder.tabCount).filter { it != activeIndex } private fun getSelectedTabDrawableIds(): ArrayList { val showTabs = config.showTabs val icons = ArrayList() if (showTabs and TAB_CONTACTS != 0) { - icons.add(R.drawable.ic_person_vector) + icons.add(com.simplemobiletools.commons.R.drawable.ic_person_vector) } if (showTabs and TAB_FAVORITES != 0) { - icons.add(R.drawable.ic_star_vector) + icons.add(com.simplemobiletools.commons.R.drawable.ic_star_vector) } if (showTabs and TAB_GROUPS != 0) { - icons.add(R.drawable.ic_people_vector) + icons.add(com.simplemobiletools.commons.R.drawable.ic_people_vector) } return icons @@ -367,29 +368,29 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { val icons = ArrayList() if (showTabs and TAB_CONTACTS != 0) { - icons.add(R.drawable.ic_person_outline_vector) + icons.add(com.simplemobiletools.commons.R.drawable.ic_person_outline_vector) } if (showTabs and TAB_FAVORITES != 0) { - icons.add(R.drawable.ic_star_outline_vector) + icons.add(com.simplemobiletools.commons.R.drawable.ic_star_outline_vector) } if (showTabs and TAB_GROUPS != 0) { - icons.add(R.drawable.ic_people_outline_vector) + icons.add(com.simplemobiletools.commons.R.drawable.ic_people_outline_vector) } return icons } private fun initFragments() { - view_pager.offscreenPageLimit = tabsList.size - 1 - view_pager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.viewPager.offscreenPageLimit = tabsList.size - 1 + binding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) {} override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} override fun onPageSelected(position: Int) { - main_tabs_holder.getTabAt(position)?.select() + binding.mainTabsHolder.getTabAt(position)?.select() getAllFragments().forEach { it?.finishActMode() } @@ -397,7 +398,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } }) - view_pager.onGlobalLayout { + binding.viewPager.onGlobalLayout { refreshContacts(ALL_TABS_MASK) refreshMenuItems() } @@ -407,36 +408,38 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { intent.data = null } - main_dialpad_button.setOnClickListener { + binding.mainDialpadButton.setOnClickListener { launchDialpad() } } private fun setupTabs() { - main_tabs_holder.removeAllTabs() + binding.mainTabsHolder.removeAllTabs() tabsList.forEachIndexed { index, value -> if (config.showTabs and value != 0) { - main_tabs_holder.newTab().setCustomView(R.layout.bottom_tablayout_item).apply { - customView?.findViewById(R.id.tab_item_icon)?.setImageDrawable(getTabIcon(index)) - customView?.findViewById(R.id.tab_item_label)?.text = getTabLabel(index) - AutofitHelper.create(customView?.findViewById(R.id.tab_item_label)) - main_tabs_holder.addTab(this) + binding.mainTabsHolder.newTab().setCustomView(com.simplemobiletools.commons.R.layout.bottom_tablayout_item).apply tab@{ + customView?.let { BottomTablayoutItemBinding.bind(it) }?.apply { + tabItemIcon.setImageDrawable(getTabIcon(index)) + tabItemLabel.text = getTabLabel(index) + AutofitHelper.create(tabItemLabel) + binding.mainTabsHolder.addTab(this@tab) + } } } } - main_tabs_holder.onTabSelectionChanged( + binding.mainTabsHolder.onTabSelectionChanged( tabUnselectedAction = { updateBottomTabItemColors(it.customView, false, getDeselectedTabDrawableIds()[it.position]) }, tabSelectedAction = { - main_menu.closeSearch() - view_pager.currentItem = it.position + binding.mainMenu.closeSearch() + binding.viewPager.currentItem = it.position updateBottomTabItemColors(it.customView, true, getSelectedTabDrawableIds()[it.position]) } ) - main_tabs_holder.beGoneIf(main_tabs_holder.tabCount == 1) + binding.mainTabsHolder.beGoneIf(binding.mainTabsHolder.tabCount == 1) } private fun showSortingDialog(showCustomSorting: Boolean) { @@ -447,7 +450,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { fun showFilterDialog() { FilterContactSourcesDialog(this) { - contacts_fragment?.forceListRedraw = true + findViewById>(R.id.contacts_fragment)?.forceListRedraw = true refreshContacts(TAB_CONTACTS or TAB_FAVORITES) } } @@ -458,7 +461,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { try { startActivity(this) } catch (e: ActivityNotFoundException) { - toast(R.string.no_app_found) + toast(com.simplemobiletools.commons.R.string.no_app_found) } catch (e: Exception) { showErrorToast(e) } @@ -474,7 +477,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { try { startActivityForResult(this, PICK_IMPORT_SOURCE_INTENT) } catch (e: ActivityNotFoundException) { - toast(R.string.system_service_disabled, Toast.LENGTH_LONG) + toast(com.simplemobiletools.commons.R.string.system_service_disabled, Toast.LENGTH_LONG) } catch (e: Exception) { showErrorToast(e) } @@ -510,7 +513,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { uri.scheme == "content" -> { val tempFile = getTempFile() if (tempFile == null) { - toast(R.string.unknown_error_occurred) + toast(com.simplemobiletools.commons.R.string.unknown_error_occurred) return } @@ -523,7 +526,8 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { showErrorToast(e) } } - else -> toast(R.string.invalid_file_format) + + else -> toast(com.simplemobiletools.commons.R.string.invalid_file_format) } } @@ -540,7 +544,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { try { startActivityForResult(this, PICK_EXPORT_FILE_INTENT) } catch (e: ActivityNotFoundException) { - toast(R.string.no_app_found, Toast.LENGTH_LONG) + toast(com.simplemobiletools.commons.R.string.no_app_found, Toast.LENGTH_LONG) } catch (e: Exception) { showErrorToast(e) } @@ -562,14 +566,14 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { private fun exportContactsTo(ignoredContactSources: HashSet, outputStream: OutputStream?) { ContactsHelper(this).getContacts(true, false, ignoredContactSources) { contacts -> if (contacts.isEmpty()) { - toast(R.string.no_entries_for_exporting) + toast(com.simplemobiletools.commons.R.string.no_entries_for_exporting) } else { VcfExporter().exportContacts(this, outputStream, contacts, true) { result -> toast( when (result) { - VcfExporter.ExportResult.EXPORT_OK -> R.string.exporting_successful - VcfExporter.ExportResult.EXPORT_PARTIAL -> R.string.exporting_some_entries_failed - else -> R.string.exporting_failed + VcfExporter.ExportResult.EXPORT_OK -> com.simplemobiletools.commons.R.string.exporting_successful + VcfExporter.ExportResult.EXPORT_PARTIAL -> com.simplemobiletools.commons.R.string.exporting_some_entries_failed + else -> com.simplemobiletools.commons.R.string.exporting_failed } ) } @@ -587,13 +591,13 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { val faqItems = arrayListOf( FAQItem(R.string.faq_1_title, R.string.faq_1_text), - FAQItem(R.string.faq_9_title_commons, R.string.faq_9_text_commons) + FAQItem(com.simplemobiletools.commons.R.string.faq_9_title_commons, com.simplemobiletools.commons.R.string.faq_9_text_commons) ) - if (!resources.getBoolean(R.bool.hide_google_relations)) { - faqItems.add(FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons)) - faqItems.add(FAQItem(R.string.faq_6_title_commons, R.string.faq_6_text_commons)) - faqItems.add(FAQItem(R.string.faq_7_title_commons, R.string.faq_7_text_commons)) + if (!resources.getBoolean(com.simplemobiletools.commons.R.bool.hide_google_relations)) { + faqItems.add(FAQItem(com.simplemobiletools.commons.R.string.faq_2_title_commons, com.simplemobiletools.commons.R.string.faq_2_text_commons)) + faqItems.add(FAQItem(com.simplemobiletools.commons.R.string.faq_6_title_commons, com.simplemobiletools.commons.R.string.faq_6_text_commons)) + faqItems.add(FAQItem(com.simplemobiletools.commons.R.string.faq_7_title_commons, com.simplemobiletools.commons.R.string.faq_7_text_commons)) } startAboutActivity(R.string.app_name, licenses, BuildConfig.VERSION_NAME, faqItems, true) @@ -606,9 +610,9 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { isGettingContacts = true - if (view_pager.adapter == null) { - view_pager.adapter = ViewPagerAdapter(this, tabsList, config.showTabs) - view_pager.currentItem = getDefaultTab() + if (binding.viewPager.adapter == null) { + binding.viewPager.adapter = ViewPagerAdapter(this, tabsList, config.showTabs) + binding.viewPager.currentItem = getDefaultTab() } ContactsHelper(this).getContacts { contacts -> @@ -618,24 +622,30 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } if (refreshTabsMask and TAB_CONTACTS != 0) { - contacts_fragment?.skipHashComparing = true - contacts_fragment?.refreshContacts(contacts) + findViewById>(R.id.contacts_fragment)?.apply { + skipHashComparing = true + refreshContacts(contacts) + } } if (refreshTabsMask and TAB_FAVORITES != 0) { - favorites_fragment?.skipHashComparing = true - favorites_fragment?.refreshContacts(contacts) + findViewById>(R.id.favorites_fragment)?.apply { + skipHashComparing = true + refreshContacts(contacts) + } } if (refreshTabsMask and TAB_GROUPS != 0) { - if (refreshTabsMask == TAB_GROUPS) { - groups_fragment.skipHashComparing = true + findViewById>(R.id.groups_fragment)?.apply { + if (refreshTabsMask == TAB_GROUPS) { + skipHashComparing = true + } + refreshContacts(contacts) } - groups_fragment?.refreshContacts(contacts) } - if (main_menu.isSearchOpen) { - getCurrentFragment()?.onSearchQueryChanged(main_menu.getCurrentQuery()) + if (binding.mainMenu.isSearchOpen) { + getCurrentFragment()?.onSearchQueryChanged(binding.mainMenu.getCurrentQuery()) } } } @@ -644,7 +654,11 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { handleGenericContactClick(contact) } - private fun getAllFragments() = arrayListOf(contacts_fragment, favorites_fragment, groups_fragment) + private fun getAllFragments() = arrayListOf?>( + findViewById(R.id.contacts_fragment), + findViewById(R.id.favorites_fragment), + findViewById(R.id.groups_fragment) + ) private fun getDefaultTab(): Int { val showTabsMask = config.showTabs diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt index 5b4d9011..44f241cd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt @@ -6,29 +6,32 @@ import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.databinding.ActivitySettingsBinding import com.simplemobiletools.contacts.pro.dialogs.ManageAutoBackupsDialog import com.simplemobiletools.contacts.pro.dialogs.ManageVisibleFieldsDialog import com.simplemobiletools.contacts.pro.dialogs.ManageVisibleTabsDialog import com.simplemobiletools.contacts.pro.extensions.cancelScheduledAutomaticBackup import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.extensions.scheduleNextAutomaticBackup -import kotlinx.android.synthetic.main.activity_settings.* import java.util.Locale import kotlin.system.exitProcess class SettingsActivity : SimpleActivity() { + private lateinit var binding: ActivitySettingsBinding + override fun onCreate(savedInstanceState: Bundle?) { isMaterialActivity = true super.onCreate(savedInstanceState) - setContentView(R.layout.activity_settings) - updateMaterialActivityViews(settings_coordinator, settings_holder, useTransparentNavigation = true, useTopSearchMenu = false) - setupMaterialScrollListener(settings_nested_scrollview, settings_toolbar) + binding = ActivitySettingsBinding.inflate(layoutInflater) + setContentView(binding.root) + updateMaterialActivityViews(binding.settingsCoordinator, binding.settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false) + setupMaterialScrollListener(binding.settingsNestedScrollview, binding.settingsToolbar) } override fun onResume() { super.onResume() - setupToolbar(settings_toolbar, NavigationIcon.Arrow) + setupToolbar(binding.settingsToolbar, NavigationIcon.Arrow) setupCustomizeColors() setupManageShownContactFields() @@ -48,149 +51,149 @@ class SettingsActivity : SimpleActivity() { setupDefaultTab() setupEnableAutomaticBackups() setupManageAutomaticBackups() - updateTextColors(settings_holder) + updateTextColors(binding.settingsHolder) arrayOf( - settings_color_customization_section_label, - settings_general_settings_label, - settings_main_screen_label, - settings_list_view_label, - settings_backups_label + binding.settingsColorCustomizationSectionLabel, + binding.settingsGeneralSettingsLabel, + binding.settingsMainScreenLabel, + binding.settingsListViewLabel, + binding.settingsBackupsLabel ).forEach { it.setTextColor(getProperPrimaryColor()) } } private fun setupCustomizeColors() { - settings_color_customization_holder.setOnClickListener { + binding.settingsColorCustomizationHolder.setOnClickListener { startCustomizationActivity() } } private fun setupManageShownContactFields() { - settings_manage_contact_fields_holder.setOnClickListener { + binding.settingsManageContactFieldsHolder.setOnClickListener { ManageVisibleFieldsDialog(this) {} } } private fun setupManageShownTabs() { - settings_manage_shown_tabs_holder.setOnClickListener { + binding.settingsManageShownTabsHolder.setOnClickListener { ManageVisibleTabsDialog(this) } } private fun setupDefaultTab() { - settings_default_tab.text = getDefaultTabText() - settings_default_tab_holder.setOnClickListener { + binding.settingsDefaultTab.text = getDefaultTabText() + binding.settingsDefaultTabHolder.setOnClickListener { val items = arrayListOf( - RadioItem(TAB_CONTACTS, getString(R.string.contacts_tab)), - RadioItem(TAB_FAVORITES, getString(R.string.favorites_tab)), - RadioItem(TAB_GROUPS, getString(R.string.groups_tab)), - RadioItem(TAB_LAST_USED, getString(R.string.last_used_tab)) + RadioItem(TAB_CONTACTS, getString(com.simplemobiletools.commons.R.string.contacts_tab)), + RadioItem(TAB_FAVORITES, getString(com.simplemobiletools.commons.R.string.favorites_tab)), + RadioItem(TAB_GROUPS, getString(com.simplemobiletools.commons.R.string.groups_tab)), + RadioItem(TAB_LAST_USED, getString(com.simplemobiletools.commons.R.string.last_used_tab)) ) RadioGroupDialog(this@SettingsActivity, items, config.defaultTab) { config.defaultTab = it as Int - settings_default_tab.text = getDefaultTabText() + binding.settingsDefaultTab.text = getDefaultTabText() } } } private fun getDefaultTabText() = getString( when (baseConfig.defaultTab) { - TAB_CONTACTS -> R.string.contacts_tab - TAB_FAVORITES -> R.string.favorites_tab - TAB_GROUPS -> R.string.groups_tab - else -> R.string.last_used_tab + TAB_CONTACTS -> com.simplemobiletools.commons.R.string.contacts_tab + TAB_FAVORITES -> com.simplemobiletools.commons.R.string.favorites_tab + TAB_GROUPS -> com.simplemobiletools.commons.R.string.groups_tab + else -> com.simplemobiletools.commons.R.string.last_used_tab } ) private fun setupFontSize() { - settings_font_size.text = getFontSizeText() - settings_font_size_holder.setOnClickListener { + binding.settingsFontSize.text = getFontSizeText() + binding.settingsFontSizeHolder.setOnClickListener { val items = arrayListOf( - RadioItem(FONT_SIZE_SMALL, getString(R.string.small)), - RadioItem(FONT_SIZE_MEDIUM, getString(R.string.medium)), - RadioItem(FONT_SIZE_LARGE, getString(R.string.large)), - RadioItem(FONT_SIZE_EXTRA_LARGE, getString(R.string.extra_large)) + RadioItem(FONT_SIZE_SMALL, getString(com.simplemobiletools.commons.R.string.small)), + RadioItem(FONT_SIZE_MEDIUM, getString(com.simplemobiletools.commons.R.string.medium)), + RadioItem(FONT_SIZE_LARGE, getString(com.simplemobiletools.commons.R.string.large)), + RadioItem(FONT_SIZE_EXTRA_LARGE, getString(com.simplemobiletools.commons.R.string.extra_large)) ) RadioGroupDialog(this@SettingsActivity, items, config.fontSize) { config.fontSize = it as Int - settings_font_size.text = getFontSizeText() + binding.settingsFontSize.text = getFontSizeText() } } } private fun setupUseEnglish() { - settings_use_english_holder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus()) - settings_use_english.isChecked = config.useEnglish - settings_use_english_holder.setOnClickListener { - settings_use_english.toggle() - config.useEnglish = settings_use_english.isChecked + binding.settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus()) + binding.settingsUseEnglish.isChecked = config.useEnglish + binding.settingsUseEnglishHolder.setOnClickListener { + binding.settingsUseEnglish.toggle() + config.useEnglish = binding.settingsUseEnglish.isChecked exitProcess(0) } } private fun setupLanguage() { - settings_language.text = Locale.getDefault().displayLanguage - settings_language_holder.beVisibleIf(isTiramisuPlus()) - settings_language_holder.setOnClickListener { + binding.settingsLanguage.text = Locale.getDefault().displayLanguage + binding.settingsLanguageHolder.beVisibleIf(isTiramisuPlus()) + binding.settingsLanguageHolder.setOnClickListener { launchChangeAppLanguageIntent() } } private fun setupShowContactThumbnails() { - settings_show_contact_thumbnails.isChecked = config.showContactThumbnails - settings_show_contact_thumbnails_holder.setOnClickListener { - settings_show_contact_thumbnails.toggle() - config.showContactThumbnails = settings_show_contact_thumbnails.isChecked + binding.settingsShowContactThumbnails.isChecked = config.showContactThumbnails + binding.settingsShowContactThumbnailsHolder.setOnClickListener { + binding.settingsShowContactThumbnails.toggle() + config.showContactThumbnails = binding.settingsShowContactThumbnails.isChecked } } private fun setupShowPhoneNumbers() { - settings_show_phone_numbers.isChecked = config.showPhoneNumbers - settings_show_phone_numbers_holder.setOnClickListener { - settings_show_phone_numbers.toggle() - config.showPhoneNumbers = settings_show_phone_numbers.isChecked + binding.settingsShowPhoneNumbers.isChecked = config.showPhoneNumbers + binding.settingsShowPhoneNumbersHolder.setOnClickListener { + binding.settingsShowPhoneNumbers.toggle() + config.showPhoneNumbers = binding.settingsShowPhoneNumbers.isChecked } } private fun setupShowContactsWithNumbers() { - settings_show_only_contacts_with_numbers.isChecked = config.showOnlyContactsWithNumbers - settings_show_only_contacts_with_numbers_holder.setOnClickListener { - settings_show_only_contacts_with_numbers.toggle() - config.showOnlyContactsWithNumbers = settings_show_only_contacts_with_numbers.isChecked + binding.settingsShowOnlyContactsWithNumbers.isChecked = config.showOnlyContactsWithNumbers + binding.settingsShowOnlyContactsWithNumbersHolder.setOnClickListener { + binding.settingsShowOnlyContactsWithNumbers.toggle() + config.showOnlyContactsWithNumbers = binding.settingsShowOnlyContactsWithNumbers.isChecked } } private fun setupStartNameWithSurname() { - settings_start_name_with_surname.isChecked = config.startNameWithSurname - settings_start_name_with_surname_holder.setOnClickListener { - settings_start_name_with_surname.toggle() - config.startNameWithSurname = settings_start_name_with_surname.isChecked + binding.settingsStartNameWithSurname.isChecked = config.startNameWithSurname + binding.settingsStartNameWithSurnameHolder.setOnClickListener { + binding.settingsStartNameWithSurname.toggle() + config.startNameWithSurname = binding.settingsStartNameWithSurname.isChecked } } private fun setupShowDialpadButton() { - settings_show_dialpad_button.isChecked = config.showDialpadButton - settings_show_dialpad_button_holder.setOnClickListener { - settings_show_dialpad_button.toggle() - config.showDialpadButton = settings_show_dialpad_button.isChecked + binding.settingsShowDialpadButton.isChecked = config.showDialpadButton + binding.settingsShowDialpadButtonHolder.setOnClickListener { + binding.settingsShowDialpadButton.toggle() + config.showDialpadButton = binding.settingsShowDialpadButton.isChecked } } private fun setupShowPrivateContacts() { - settings_show_private_contacts.isChecked = config.showPrivateContacts - settings_show_private_contacts_holder.setOnClickListener { - settings_show_private_contacts.toggle() - config.showPrivateContacts = settings_show_private_contacts.isChecked + binding.settingsShowPrivateContacts.isChecked = config.showPrivateContacts + binding.settingsShowPrivateContactsHolder.setOnClickListener { + binding.settingsShowPrivateContacts.toggle() + config.showPrivateContacts = binding.settingsShowPrivateContacts.isChecked } } private fun setupOnContactClick() { - settings_on_contact_click.text = getOnContactClickText() - settings_on_contact_click_holder.setOnClickListener { + binding.settingsOnContactClick.text = getOnContactClickText() + binding.settingsOnContactClickHolder.setOnClickListener { val items = arrayListOf( RadioItem(ON_CLICK_CALL_CONTACT, getString(R.string.call_contact)), RadioItem(ON_CLICK_VIEW_CONTACT, getString(R.string.view_contact)), @@ -199,7 +202,7 @@ class SettingsActivity : SimpleActivity() { RadioGroupDialog(this@SettingsActivity, items, config.onContactClick) { config.onContactClick = it as Int - settings_on_contact_click.text = getOnContactClickText() + binding.settingsOnContactClick.text = getOnContactClickText() } } } @@ -213,26 +216,26 @@ class SettingsActivity : SimpleActivity() { ) private fun setupShowCallConfirmation() { - settings_show_call_confirmation.isChecked = config.showCallConfirmation - settings_show_call_confirmation_holder.setOnClickListener { - settings_show_call_confirmation.toggle() - config.showCallConfirmation = settings_show_call_confirmation.isChecked + binding.settingsShowCallConfirmation.isChecked = config.showCallConfirmation + binding.settingsShowCallConfirmationHolder.setOnClickListener { + binding.settingsShowCallConfirmation.toggle() + config.showCallConfirmation = binding.settingsShowCallConfirmation.isChecked } } private fun setupMergeDuplicateContacts() { - settings_merge_duplicate_contacts.isChecked = config.mergeDuplicateContacts - settings_merge_duplicate_contacts_holder.setOnClickListener { - settings_merge_duplicate_contacts.toggle() - config.mergeDuplicateContacts = settings_merge_duplicate_contacts.isChecked + binding.settingsMergeDuplicateContacts.isChecked = config.mergeDuplicateContacts + binding.settingsMergeDuplicateContactsHolder.setOnClickListener { + binding.settingsMergeDuplicateContacts.toggle() + config.mergeDuplicateContacts = binding.settingsMergeDuplicateContacts.isChecked } } private fun setupEnableAutomaticBackups() { - settings_backups_label.beVisibleIf(isRPlus()) - settings_enable_automatic_backups_holder.beVisibleIf(isRPlus()) - settings_enable_automatic_backups.isChecked = config.autoBackup - settings_enable_automatic_backups_holder.setOnClickListener { + binding.settingsBackupsLabel.beVisibleIf(isRPlus()) + binding.settingsEnableAutomaticBackupsHolder.beVisibleIf(isRPlus()) + binding.settingsEnableAutomaticBackups.isChecked = config.autoBackup + binding.settingsEnableAutomaticBackupsHolder.setOnClickListener { val wasBackupDisabled = !config.autoBackup if (wasBackupDisabled) { ManageAutoBackupsDialog( @@ -250,8 +253,8 @@ class SettingsActivity : SimpleActivity() { } private fun setupManageAutomaticBackups() { - settings_manage_automatic_backups_holder.beVisibleIf(isRPlus() && config.autoBackup) - settings_manage_automatic_backups_holder.setOnClickListener { + binding.settingsManageAutomaticBackupsHolder.beVisibleIf(isRPlus() && config.autoBackup) + binding.settingsManageAutomaticBackupsHolder.setOnClickListener { ManageAutoBackupsDialog( activity = this, onSuccess = { @@ -263,7 +266,7 @@ class SettingsActivity : SimpleActivity() { private fun enableOrDisableAutomaticBackups(enable: Boolean) { config.autoBackup = enable - settings_enable_automatic_backups.isChecked = enable - settings_manage_automatic_backups_holder.beVisibleIf(enable) + binding.settingsEnableAutomaticBackups.isChecked = enable + binding.settingsManageAutomaticBackupsHolder.beVisibleIf(enable) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SimpleActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SimpleActivity.kt index 89653274..450a420d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SimpleActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SimpleActivity.kt @@ -65,9 +65,9 @@ open class SimpleActivity : BaseSimpleActivity() { protected fun getTabIcon(position: Int): Drawable { val drawableId = when (position) { - LOCATION_CONTACTS_TAB -> R.drawable.ic_person_vector - LOCATION_FAVORITES_TAB -> R.drawable.ic_star_vector - else -> R.drawable.ic_people_vector + LOCATION_CONTACTS_TAB -> com.simplemobiletools.commons.R.drawable.ic_person_vector + LOCATION_FAVORITES_TAB -> com.simplemobiletools.commons.R.drawable.ic_star_vector + else -> com.simplemobiletools.commons.R.drawable.ic_people_vector } return resources.getColoredDrawableWithColor(drawableId, getProperTextColor()) @@ -75,9 +75,9 @@ open class SimpleActivity : BaseSimpleActivity() { protected fun getTabLabel(position: Int): String { val stringId = when (position) { - LOCATION_CONTACTS_TAB -> R.string.contacts_tab - LOCATION_FAVORITES_TAB -> R.string.favorites_tab - else -> R.string.groups_tab + LOCATION_CONTACTS_TAB -> com.simplemobiletools.commons.R.string.contacts_tab + LOCATION_FAVORITES_TAB -> com.simplemobiletools.commons.R.string.favorites_tab + else -> com.simplemobiletools.commons.R.string.groups_tab } return resources.getString(stringId) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index a14b2373..d2f5007e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -24,19 +24,14 @@ import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.PhoneNumber import com.simplemobiletools.commons.models.contacts.* import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.databinding.* import com.simplemobiletools.contacts.pro.dialogs.ChooseSocialDialog import com.simplemobiletools.contacts.pro.dialogs.ManageVisibleFieldsDialog -import com.simplemobiletools.contacts.pro.extensions.* +import com.simplemobiletools.contacts.pro.extensions.config +import com.simplemobiletools.contacts.pro.extensions.editContact +import com.simplemobiletools.contacts.pro.extensions.getPackageDrawable +import com.simplemobiletools.contacts.pro.extensions.startCallIntent import com.simplemobiletools.contacts.pro.helpers.* -import kotlinx.android.synthetic.main.activity_view_contact.* -import kotlinx.android.synthetic.main.item_view_address.view.* -import kotlinx.android.synthetic.main.item_view_contact_source.view.* -import kotlinx.android.synthetic.main.item_view_email.view.* -import kotlinx.android.synthetic.main.item_view_event.view.* -import kotlinx.android.synthetic.main.item_view_group.view.* -import kotlinx.android.synthetic.main.item_view_im.view.* -import kotlinx.android.synthetic.main.item_view_phone_number.view.* -import kotlinx.android.synthetic.main.item_website.view.* class ViewContactActivity : ContactActivity() { private var isViewIntent = false @@ -47,20 +42,24 @@ class ViewContactActivity : ContactActivity() { private var fullContact: Contact? = null // contact with all fields filled from duplicates private var duplicateInitialized = false private val mergeDuplicate: Boolean get() = config.mergeDuplicateContacts + private lateinit var binding: ActivityViewContactBinding - private val COMPARABLE_PHONE_NUMBER_LENGTH = 9 + companion object { + private const val COMPARABLE_PHONE_NUMBER_LENGTH = 9 + } override fun onCreate(savedInstanceState: Bundle?) { showTransparentTop = true super.onCreate(savedInstanceState) - setContentView(R.layout.activity_view_contact) + binding = ActivityViewContactBinding.inflate(layoutInflater) + setContentView(binding.root) if (checkAppSideloading()) { return } showFields = config.showContactFields - contact_wrapper.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + binding.contactWrapper.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN setupMenu() } @@ -74,7 +73,7 @@ class ViewContactActivity : ContactActivity() { initContact() } } else { - toast(R.string.no_contacts_permission) + toast(com.simplemobiletools.commons.R.string.no_contacts_permission) finish() } } @@ -86,7 +85,7 @@ class ViewContactActivity : ContactActivity() { } override fun onBackPressed() { - if (contact_photo_big.alpha == 1f) { + if (binding.contactPhotoBig.alpha == 1f) { hideBigContactPhoto() } else { super.onBackPressed() @@ -94,8 +93,8 @@ class ViewContactActivity : ContactActivity() { } private fun setupMenu() { - (contact_appbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight - contact_toolbar.menu.apply { + (binding.contactAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight + binding.contactToolbar.menu.apply { findItem(R.id.share).setOnMenuItemClickListener { if (fullContact != null) { shareContact(fullContact!!) @@ -131,7 +130,7 @@ class ViewContactActivity : ContactActivity() { } } - contact_toolbar.setNavigationOnClickListener { + binding.contactToolbar.setNavigationOnClickListener { finish() } } @@ -173,7 +172,7 @@ class ViewContactActivity : ContactActivity() { if (contact == null) { if (!wasEditLaunched) { - toast(R.string.unknown_error_occurred) + toast(com.simplemobiletools.commons.R.string.unknown_error_occurred) } finish() } else { @@ -197,54 +196,55 @@ class ViewContactActivity : ContactActivity() { return } - contact_scrollview.beVisible() + binding.contactScrollview.beVisible() setupViewContact() - contact_send_sms.beVisibleIf(contact!!.phoneNumbers.isNotEmpty()) - contact_start_call.beVisibleIf(contact!!.phoneNumbers.isNotEmpty()) - contact_send_email.beVisibleIf(contact!!.emails.isNotEmpty()) + binding.contactSendSms.beVisibleIf(contact!!.phoneNumbers.isNotEmpty()) + binding.contactStartCall.beVisibleIf(contact!!.phoneNumbers.isNotEmpty()) + binding.contactSendEmail.beVisibleIf(contact!!.emails.isNotEmpty()) if (contact!!.photoUri.isEmpty() && contact!!.photo == null) { - showPhotoPlaceholder(contact_photo) - contact_photo_bottom_shadow.beGone() + showPhotoPlaceholder(binding.contactPhoto) + binding.contactPhotoBottomShadow.beGone() } else { - updateContactPhoto(contact!!.photoUri, contact_photo, contact_photo_bottom_shadow, contact!!.photo) + updateContactPhoto(contact!!.photoUri, binding.contactPhoto, binding.contactPhotoBottomShadow, contact!!.photo) val options = RequestOptions() - .transform(FitCenter(), RoundedCorners(resources.getDimension(R.dimen.normal_margin).toInt())) + .transform(FitCenter(), RoundedCorners(resources.getDimension(com.simplemobiletools.commons.R.dimen.normal_margin).toInt())) Glide.with(this) .load(contact!!.photo ?: currentContactPhotoPath) .apply(options) - .into(contact_photo_big) + .into(binding.contactPhotoBig) - contact_photo.setOnClickListener { - contact_photo_big.alpha = 0f - contact_photo_big.beVisible() - contact_photo_big.animate().alpha(1f).start() + binding.contactPhoto.setOnClickListener { + binding.contactPhotoBig.alpha = 0f + binding.contactPhotoBig.beVisible() + binding.contactPhotoBig.animate().alpha(1f).start() } - contact_photo_big.setOnClickListener { + binding.contactPhotoBig.setOnClickListener { hideBigContactPhoto() } } val textColor = getProperTextColor() arrayOf( - contact_name_image, contact_numbers_image, contact_emails_image, contact_addresses_image, contact_ims_image, contact_events_image, - contact_source_image, contact_notes_image, contact_ringtone_image, contact_organization_image, contact_websites_image, contact_groups_image + binding.contactNameImage, binding.contactNumbersImage, binding.contactEmailsImage, binding.contactAddressesImage, binding.contactImsImage, + binding.contactEventsImage, binding.contactSourceImage, binding.contactNotesImage, binding.contactRingtoneImage, binding.contactOrganizationImage, + binding.contactWebsitesImage, binding.contactGroupsImage ).forEach { it.applyColorFilter(textColor) } - contact_send_sms.setOnClickListener { trySendSMS() } - contact_start_call.setOnClickListener { tryInitiateCall(contact!!) { startCallIntent(it) } } - contact_send_email.setOnClickListener { trySendEmail() } + binding.contactSendSms.setOnClickListener { trySendSMS() } + binding.contactStartCall.setOnClickListener { tryInitiateCall(contact!!) { startCallIntent(it) } } + binding.contactSendEmail.setOnClickListener { trySendEmail() } - contact_send_sms.setOnLongClickListener { toast(R.string.send_sms); true; } - contact_start_call.setOnLongClickListener { toast(R.string.call_contact); true; } - contact_send_email.setOnLongClickListener { toast(R.string.send_email); true; } + binding.contactSendSms.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.send_sms); true; } + binding.contactStartCall.setOnLongClickListener { toast(R.string.call_contact); true; } + binding.contactSendEmail.setOnLongClickListener { toast(com.simplemobiletools.commons.R.string.send_email); true; } - updateTextColors(contact_scrollview) - contact_toolbar.menu.findItem(R.id.open_with).isVisible = contact?.isPrivate() == false + updateTextColors(binding.contactScrollview) + binding.contactToolbar.menu.findItem(R.id.open_with).isVisible = contact?.isPrivate() == false } private fun setupViewContact() { @@ -281,7 +281,7 @@ class ViewContactActivity : ContactActivity() { setupNotes() setupRingtone() setupOrganization() - updateTextColors(contact_scrollview) + updateTextColors(binding.contactScrollview) } private fun launchEditContact(contact: Contact) { @@ -298,7 +298,7 @@ class ViewContactActivity : ContactActivity() { } private fun setupFavorite() { - contact_toggle_favorite.apply { + binding.contactToggleFavorite.apply { beVisible() tag = contact!!.starred setImageDrawable(getStarDrawable(tag == 1)) @@ -331,10 +331,10 @@ class ViewContactActivity : ContactActivity() { val showNameFields = showFields and SHOW_PREFIX_FIELD != 0 || showFields and SHOW_FIRST_NAME_FIELD != 0 || showFields and SHOW_MIDDLE_NAME_FIELD != 0 || showFields and SHOW_SURNAME_FIELD != 0 || showFields and SHOW_SUFFIX_FIELD != 0 - contact_name.text = displayName - contact_name.copyOnLongClick(displayName) - contact_name.beVisibleIf(displayName.isNotEmpty() && !contact!!.isABusinessContact() && showNameFields) - contact_name_image.beInvisibleIf(contact_name.isGone()) + binding.contactName.text = displayName + binding.contactName.copyOnLongClick(displayName) + binding.contactName.beVisibleIf(displayName.isNotEmpty() && !contact!!.isABusinessContact() && showNameFields) + binding.contactNameImage.beInvisibleIf(binding.contactName.isGone()) } private fun setupPhoneNumbers() { @@ -377,17 +377,17 @@ class ViewContactActivity : ContactActivity() { phoneNumbers = phoneNumbers.sortedBy { it.type }.toMutableSet() as LinkedHashSet fullContact!!.phoneNumbers = phoneNumbers.toMutableList() as ArrayList - contact_numbers_holder.removeAllViews() + binding.contactNumbersHolder.removeAllViews() if (phoneNumbers.isNotEmpty() && showFields and SHOW_PHONE_NUMBERS_FIELD != 0) { phoneNumbers.forEach { phoneNumber -> - layoutInflater.inflate(R.layout.item_view_phone_number, contact_numbers_holder, false).apply { - contact_numbers_holder.addView(this) - contact_number.text = phoneNumber.value - contact_number_type.text = getPhoneNumberTypeText(phoneNumber.type, phoneNumber.label) - copyOnLongClick(phoneNumber.value) + ItemViewPhoneNumberBinding.inflate(layoutInflater, binding.contactNumbersHolder, false).apply { + binding.contactNumbersHolder.addView(root) + contactNumber.text = phoneNumber.value + contactNumberType.text = getPhoneNumberTypeText(phoneNumber.type, phoneNumber.label) + root.copyOnLongClick(phoneNumber.value) - setOnClickListener { + root.setOnClickListener { if (config.showCallConfirmation) { CallConfirmationDialog(this@ViewContactActivity, phoneNumber.value) { startCallIntent(phoneNumber.value) @@ -397,46 +397,46 @@ class ViewContactActivity : ContactActivity() { } } - contact_number_holder.default_toggle_icon.isVisible = phoneNumber.isPrimary + defaultToggleIcon.isVisible = phoneNumber.isPrimary } } - contact_numbers_image.beVisible() - contact_numbers_holder.beVisible() + binding.contactNumbersImage.beVisible() + binding.contactNumbersHolder.beVisible() } else { - contact_numbers_image.beGone() - contact_numbers_holder.beGone() + binding.contactNumbersImage.beGone() + binding.contactNumbersHolder.beGone() } // make sure the Call and SMS buttons are visible if any phone number is shown if (phoneNumbers.isNotEmpty()) { - contact_send_sms.beVisible() - contact_start_call.beVisible() + binding.contactSendSms.beVisible() + binding.contactStartCall.beVisible() } } // a contact cannot have different emails per contact source. Such contacts are handled as separate ones, not duplicates of each other private fun setupEmails() { - contact_emails_holder.removeAllViews() + binding.contactEmailsHolder.removeAllViews() val emails = contact!!.emails if (emails.isNotEmpty() && showFields and SHOW_EMAILS_FIELD != 0) { emails.forEach { - layoutInflater.inflate(R.layout.item_view_email, contact_emails_holder, false).apply { + ItemViewEmailBinding.inflate(layoutInflater, binding.contactEmailsHolder, false).apply { val email = it - contact_emails_holder.addView(this) - contact_email.text = email.value - contact_email_type.text = getEmailTypeText(email.type, email.label) - copyOnLongClick(email.value) + binding.contactEmailsHolder.addView(root) + contactEmail.text = email.value + contactEmailType.text = getEmailTypeText(email.type, email.label) + root.copyOnLongClick(email.value) - setOnClickListener { + root.setOnClickListener { sendEmailIntent(email.value) } } } - contact_emails_image.beVisible() - contact_emails_holder.beVisible() + binding.contactEmailsImage.beVisible() + binding.contactEmailsHolder.beVisible() } else { - contact_emails_image.beGone() - contact_emails_holder.beGone() + binding.contactEmailsImage.beGone() + binding.contactEmailsHolder.beGone() } } @@ -451,27 +451,27 @@ class ViewContactActivity : ContactActivity() { addresses = addresses.sortedBy { it.type }.toMutableSet() as LinkedHashSet
fullContact!!.addresses = addresses.toMutableList() as ArrayList
- contact_addresses_holder.removeAllViews() + binding.contactAddressesHolder.removeAllViews() if (addresses.isNotEmpty() && showFields and SHOW_ADDRESSES_FIELD != 0) { addresses.forEach { - layoutInflater.inflate(R.layout.item_view_address, contact_addresses_holder, false).apply { + ItemViewAddressBinding.inflate(layoutInflater, binding.contactAddressesHolder, false).apply { val address = it - contact_addresses_holder.addView(this) - contact_address.text = address.value - contact_address_type.text = getAddressTypeText(address.type, address.label) - copyOnLongClick(address.value) + binding.contactAddressesHolder.addView(root) + contactAddress.text = address.value + contactAddressType.text = getAddressTypeText(address.type, address.label) + root.copyOnLongClick(address.value) - setOnClickListener { + root.setOnClickListener { sendAddressIntent(address.value) } } } - contact_addresses_image.beVisible() - contact_addresses_holder.beVisible() + binding.contactAddressesImage.beVisible() + binding.contactAddressesHolder.beVisible() } else { - contact_addresses_image.beGone() - contact_addresses_holder.beGone() + binding.contactAddressesImage.beGone() + binding.contactAddressesHolder.beGone() } } @@ -486,23 +486,23 @@ class ViewContactActivity : ContactActivity() { IMs = IMs.sortedBy { it.type }.toMutableSet() as LinkedHashSet fullContact!!.IMs = IMs.toMutableList() as ArrayList - contact_ims_holder.removeAllViews() + binding.contactImsHolder.removeAllViews() if (IMs.isNotEmpty() && showFields and SHOW_IMS_FIELD != 0) { IMs.forEach { - layoutInflater.inflate(R.layout.item_view_im, contact_ims_holder, false).apply { + ItemViewImBinding.inflate(layoutInflater, binding.contactImsHolder, false).apply { val IM = it - contact_ims_holder.addView(this) - contact_im.text = IM.value - contact_im_type.text = getIMTypeText(IM.type, IM.label) - copyOnLongClick(IM.value) + binding.contactImsHolder.addView(root) + contactIm.text = IM.value + contactImType.text = getIMTypeText(IM.type, IM.label) + root.copyOnLongClick(IM.value) } } - contact_ims_image.beVisible() - contact_ims_holder.beVisible() + binding.contactImsImage.beVisible() + binding.contactImsHolder.beVisible() } else { - contact_ims_image.beGone() - contact_ims_holder.beGone() + binding.contactImsImage.beGone() + binding.contactImsHolder.beGone() } } @@ -517,22 +517,22 @@ class ViewContactActivity : ContactActivity() { events = events.sortedBy { it.type }.toMutableSet() as LinkedHashSet fullContact!!.events = events.toMutableList() as ArrayList - contact_events_holder.removeAllViews() + binding.contactEventsHolder.removeAllViews() if (events.isNotEmpty() && showFields and SHOW_EVENTS_FIELD != 0) { events.forEach { - layoutInflater.inflate(R.layout.item_view_event, contact_events_holder, false).apply { - contact_events_holder.addView(this) - it.value.getDateTimeFromDateString(true, contact_event) - contact_event_type.setText(getEventTextId(it.type)) - copyOnLongClick(it.value) + ItemViewEventBinding.inflate(layoutInflater, binding.contactEventsHolder, false).apply { + binding.contactEventsHolder.addView(root) + it.value.getDateTimeFromDateString(true, contactEvent) + contactEventType.setText(getEventTextId(it.type)) + root.copyOnLongClick(it.value) } } - contact_events_image.beVisible() - contact_events_holder.beVisible() + binding.contactEventsImage.beVisible() + binding.contactEventsHolder.beVisible() } else { - contact_events_image.beGone() - contact_events_holder.beGone() + binding.contactEventsImage.beGone() + binding.contactEventsHolder.beGone() } } @@ -547,26 +547,26 @@ class ViewContactActivity : ContactActivity() { websites = websites.sorted().toMutableSet() as LinkedHashSet fullContact!!.websites = websites.toMutableList() as ArrayList - contact_websites_holder.removeAllViews() + binding.contactWebsitesHolder.removeAllViews() if (websites.isNotEmpty() && showFields and SHOW_WEBSITES_FIELD != 0) { websites.forEach { val url = it - layoutInflater.inflate(R.layout.item_website, contact_websites_holder, false).apply { - contact_websites_holder.addView(this) - contact_website.text = url - copyOnLongClick(url) + ItemWebsiteBinding.inflate(layoutInflater, binding.contactWebsitesHolder, false).apply { + binding.contactWebsitesHolder.addView(root) + contactWebsite.text = url + root.copyOnLongClick(url) - setOnClickListener { + root.setOnClickListener { openWebsiteIntent(url) } } } - contact_websites_image.beVisible() - contact_websites_holder.beVisible() + binding.contactWebsitesImage.beVisible() + binding.contactWebsitesHolder.beVisible() } else { - contact_websites_image.beGone() - contact_websites_holder.beGone() + binding.contactWebsitesImage.beGone() + binding.contactWebsitesHolder.beGone() } } @@ -581,27 +581,27 @@ class ViewContactActivity : ContactActivity() { groups = groups.sortedBy { it.title }.toMutableSet() as LinkedHashSet fullContact!!.groups = groups.toMutableList() as ArrayList - contact_groups_holder.removeAllViews() + binding.contactGroupsHolder.removeAllViews() if (groups.isNotEmpty() && showFields and SHOW_GROUPS_FIELD != 0) { groups.forEach { - layoutInflater.inflate(R.layout.item_view_group, contact_groups_holder, false).apply { + ItemViewGroupBinding.inflate(layoutInflater, binding.contactGroupsHolder, false).apply { val group = it - contact_groups_holder.addView(this) - contact_group.text = group.title - copyOnLongClick(group.title) + binding.contactGroupsHolder.addView(root) + contactGroup.text = group.title + root.copyOnLongClick(group.title) } } - contact_groups_image.beVisible() - contact_groups_holder.beVisible() + binding.contactGroupsImage.beVisible() + binding.contactGroupsHolder.beVisible() } else { - contact_groups_image.beGone() - contact_groups_holder.beGone() + binding.contactGroupsImage.beGone() + binding.contactGroupsHolder.beGone() } } private fun setupContactSources() { - contact_sources_holder.removeAllViews() + binding.contactSourcesHolder.removeAllViews() if (showFields and SHOW_CONTACT_SOURCE_FIELD != 0) { var sources = HashMap() sources[contact!!] = getPublicContactSourceSync(contact!!.source, contactSources) @@ -617,101 +617,101 @@ class ViewContactActivity : ContactActivity() { } for ((key, value) in sources) { - layoutInflater.inflate(R.layout.item_view_contact_source, contact_sources_holder, false).apply { - contact_source.text = if (value == "") getString(R.string.phone_storage) else value - contact_source.copyOnLongClick(value) - contact_sources_holder.addView(this) + ItemViewContactSourceBinding.inflate(layoutInflater, binding.contactSourcesHolder, false).apply { + contactSource.text = if (value == "") getString(R.string.phone_storage) else value + contactSource.copyOnLongClick(value) + binding.contactSourcesHolder.addView(root) - contact_source.setOnClickListener { + contactSource.setOnClickListener { launchEditContact(key) } if (value.toLowerCase() == WHATSAPP) { - contact_source_image.setImageDrawable(getPackageDrawable(WHATSAPP_PACKAGE)) - contact_source_image.beVisible() - contact_source_image.setOnClickListener { + contactSourceImage.setImageDrawable(getPackageDrawable(WHATSAPP_PACKAGE)) + contactSourceImage.beVisible() + contactSourceImage.setOnClickListener { showSocialActions(key.id) } } if (value.toLowerCase() == SIGNAL) { - contact_source_image.setImageDrawable(getPackageDrawable(SIGNAL_PACKAGE)) - contact_source_image.beVisible() - contact_source_image.setOnClickListener { + contactSourceImage.setImageDrawable(getPackageDrawable(SIGNAL_PACKAGE)) + contactSourceImage.beVisible() + contactSourceImage.setOnClickListener { showSocialActions(key.id) } } if (value.toLowerCase() == VIBER) { - contact_source_image.setImageDrawable(getPackageDrawable(VIBER_PACKAGE)) - contact_source_image.beVisible() - contact_source_image.setOnClickListener { + contactSourceImage.setImageDrawable(getPackageDrawable(VIBER_PACKAGE)) + contactSourceImage.beVisible() + contactSourceImage.setOnClickListener { showSocialActions(key.id) } } if (value.toLowerCase() == TELEGRAM) { - contact_source_image.setImageDrawable(getPackageDrawable(TELEGRAM_PACKAGE)) - contact_source_image.beVisible() - contact_source_image.setOnClickListener { + contactSourceImage.setImageDrawable(getPackageDrawable(TELEGRAM_PACKAGE)) + contactSourceImage.beVisible() + contactSourceImage.setOnClickListener { showSocialActions(key.id) } } if (value.toLowerCase() == THREEMA) { - contact_source_image.setImageDrawable(getPackageDrawable(THREEMA_PACKAGE)) - contact_source_image.beVisible() - contact_source_image.setOnClickListener { + contactSourceImage.setImageDrawable(getPackageDrawable(THREEMA_PACKAGE)) + contactSourceImage.beVisible() + contactSourceImage.setOnClickListener { showSocialActions(key.id) } } } } - contact_source_image.beVisible() - contact_sources_holder.beVisible() + binding.contactSourceImage.beVisible() + binding.contactSourcesHolder.beVisible() } else { - contact_source_image.beGone() - contact_sources_holder.beGone() + binding.contactSourceImage.beGone() + binding.contactSourcesHolder.beGone() } } private fun setupNotes() { val notes = contact!!.notes if (notes.isNotEmpty() && showFields and SHOW_NOTES_FIELD != 0) { - contact_notes.text = notes - contact_notes_image.beVisible() - contact_notes.beVisible() - contact_notes.copyOnLongClick(notes) + binding.contactNotes.text = notes + binding.contactNotesImage.beVisible() + binding.contactNotes.beVisible() + binding.contactNotes.copyOnLongClick(notes) } else { - contact_notes_image.beGone() - contact_notes.beGone() + binding.contactNotesImage.beGone() + binding.contactNotes.beGone() } } private fun setupRingtone() { if (showFields and SHOW_RINGTONE_FIELD != 0) { - contact_ringtone_image.beVisible() - contact_ringtone.beVisible() + binding.contactRingtoneImage.beVisible() + binding.contactRingtone.beVisible() val ringtone = contact!!.ringtone if (ringtone?.isEmpty() == true) { - contact_ringtone.text = getString(R.string.no_sound) + binding.contactRingtone.text = getString(com.simplemobiletools.commons.R.string.no_sound) } else if (ringtone?.isNotEmpty() == true && ringtone != getDefaultRingtoneUri().toString()) { if (ringtone == SILENT) { - contact_ringtone.text = getString(R.string.no_sound) + binding.contactRingtone.text = getString(com.simplemobiletools.commons.R.string.no_sound) } else { systemRingtoneSelected(Uri.parse(ringtone)) } } else { - contact_ringtone_image.beGone() - contact_ringtone.beGone() + binding.contactRingtoneImage.beGone() + binding.contactRingtone.beGone() return } - contact_ringtone.copyOnLongClick(contact_ringtone.text.toString()) + binding.contactRingtone.copyOnLongClick(binding.contactRingtone.text.toString()) - contact_ringtone.setOnClickListener { + binding.contactRingtone.setOnClickListener { val ringtonePickerIntent = getRingtonePickerIntent() try { startActivityForResult(ringtonePickerIntent, INTENT_SELECT_RINGTONE) @@ -724,7 +724,7 @@ class ViewContactActivity : ContactActivity() { RingtoneManager.TYPE_RINGTONE, true, onAlarmPicked = { - contact_ringtone.text = it?.title + binding.contactRingtone.text = it?.title ringtoneUpdated(it?.uri) }, onAlarmSoundDeleted = {} @@ -732,29 +732,32 @@ class ViewContactActivity : ContactActivity() { } } } else { - contact_ringtone_image.beGone() - contact_ringtone.beGone() + binding.contactRingtoneImage.beGone() + binding.contactRingtone.beGone() } } private fun setupOrganization() { val organization = contact!!.organization if (organization.isNotEmpty() && showFields and SHOW_ORGANIZATION_FIELD != 0) { - contact_organization_company.text = organization.company - contact_organization_job_position.text = organization.jobPosition - contact_organization_image.beGoneIf(organization.isEmpty()) - contact_organization_company.beGoneIf(organization.company.isEmpty()) - contact_organization_job_position.beGoneIf(organization.jobPosition.isEmpty()) - contact_organization_company.copyOnLongClick(contact_organization_company.value) - contact_organization_job_position.copyOnLongClick(contact_organization_job_position.value) + binding.contactOrganizationCompany.text = organization.company + binding.contactOrganizationJobPosition.text = organization.jobPosition + binding.contactOrganizationImage.beGoneIf(organization.isEmpty()) + binding.contactOrganizationCompany.beGoneIf(organization.company.isEmpty()) + binding.contactOrganizationJobPosition.beGoneIf(organization.jobPosition.isEmpty()) + binding.contactOrganizationCompany.copyOnLongClick(binding.contactOrganizationCompany.value) + binding.contactOrganizationJobPosition.copyOnLongClick(binding.contactOrganizationJobPosition.value) if (organization.company.isEmpty() && organization.jobPosition.isNotEmpty()) { - (contact_organization_image.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.ALIGN_TOP, contact_organization_job_position.id) + (binding.contactOrganizationImage.layoutParams as RelativeLayout.LayoutParams).addRule( + RelativeLayout.ALIGN_TOP, + binding.contactOrganizationJobPosition.id + ) } } else { - contact_organization_image.beGone() - contact_organization_company.beGone() - contact_organization_job_position.beGone() + binding.contactOrganizationImage.beGone() + binding.contactOrganizationCompany.beGone() + binding.contactOrganizationJobPosition.beGone() } } @@ -775,11 +778,11 @@ class ViewContactActivity : ContactActivity() { if (success) { startActivity(this) } else { - toast(R.string.no_phone_call_permission) + toast(com.simplemobiletools.commons.R.string.no_phone_call_permission) } } } catch (e: ActivityNotFoundException) { - toast(R.string.no_app_found) + toast(com.simplemobiletools.commons.R.string.no_app_found) } catch (e: Exception) { showErrorToast(e) } @@ -791,13 +794,13 @@ class ViewContactActivity : ContactActivity() { } override fun customRingtoneSelected(ringtonePath: String) { - contact_ringtone.text = ringtonePath.getFilenameFromPath() + binding.contactRingtone.text = ringtonePath.getFilenameFromPath() ringtoneUpdated(ringtonePath) } override fun systemRingtoneSelected(uri: Uri?) { val contactRingtone = RingtoneManager.getRingtone(this, uri) - contact_ringtone.text = contactRingtone.getTitle(this) + binding.contactRingtone.text = contactRingtone.getTitle(this) ringtoneUpdated(uri?.toString() ?: "") } @@ -833,13 +836,13 @@ class ViewContactActivity : ContactActivity() { } private fun deleteContactFromAllSources() { - val addition = if (contact_sources_holder.childCount > 1) { + val addition = if (binding.contactSourcesHolder.childCount > 1) { "\n\n${getString(R.string.delete_from_all_sources)}" } else { "" } - val message = "${getString(R.string.proceed_with_deletion)}$addition" + val message = "${getString(com.simplemobiletools.commons.R.string.proceed_with_deletion)}$addition" ConfirmationDialog(this, message) { if (contact != null) { ContactsHelper(this).deleteContact(contact!!, true) { @@ -849,10 +852,11 @@ class ViewContactActivity : ContactActivity() { } } - private fun getStarDrawable(on: Boolean) = resources.getDrawable(if (on) R.drawable.ic_star_vector else R.drawable.ic_star_outline_vector) + private fun getStarDrawable(on: Boolean) = + resources.getDrawable(if (on) com.simplemobiletools.commons.R.drawable.ic_star_vector else com.simplemobiletools.commons.R.drawable.ic_star_outline_vector) private fun hideBigContactPhoto() { - contact_photo_big.animate().alpha(0f).withEndAction { contact_photo_big.beGone() }.start() + binding.contactPhotoBig.animate().alpha(0f).withEndAction { binding.contactPhotoBig.beGone() }.start() } private fun View.copyOnLongClick(value: String) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt index d630502b..55044124 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt @@ -1,7 +1,6 @@ package com.simplemobiletools.contacts.pro.adapters import android.graphics.drawable.BitmapDrawable -import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter @@ -16,11 +15,8 @@ import com.simplemobiletools.commons.extensions.getProperTextColor import com.simplemobiletools.commons.extensions.normalizeString import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.commons.models.contacts.Contact -import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.SimpleActivity -import kotlinx.android.synthetic.main.item_autocomplete_name_number.view.item_autocomplete_image -import kotlinx.android.synthetic.main.item_autocomplete_name_number.view.item_autocomplete_name -import kotlinx.android.synthetic.main.item_autocomplete_name_number.view.item_autocomplete_number +import com.simplemobiletools.contacts.pro.databinding.ItemAutocompleteNameNumberBinding class AutoCompleteTextViewAdapter( val activity: SimpleActivity, @@ -34,23 +30,23 @@ class AutoCompleteTextViewAdapter( var listItem = convertView val nameToUse = contact.getNameToDisplay() if (listItem == null || listItem.tag != nameToUse.isNotEmpty()) { - listItem = LayoutInflater.from(activity).inflate(R.layout.item_autocomplete_name_number, parent, false) + listItem = ItemAutocompleteNameNumberBinding.inflate(activity.layoutInflater, parent, false).root } val placeholder = BitmapDrawable(activity.resources, SimpleContactsHelper(context).getContactLetterIcon(nameToUse)) - listItem!!.apply { - setBackgroundColor(context.getProperBackgroundColor()) - item_autocomplete_name.setTextColor(context.getProperTextColor()) - item_autocomplete_number.setTextColor(context.getProperTextColor()) + ItemAutocompleteNameNumberBinding.bind(listItem).apply { + root.setBackgroundColor(context.getProperBackgroundColor()) + itemAutocompleteName.setTextColor(context.getProperTextColor()) + itemAutocompleteNumber.setTextColor(context.getProperTextColor()) - tag = nameToUse.isNotEmpty() - item_autocomplete_name.text = nameToUse + root.tag = nameToUse.isNotEmpty() + itemAutocompleteName.text = nameToUse contact.phoneNumbers.apply { val phoneNumber = firstOrNull { it.isPrimary }?.normalizedNumber ?: firstOrNull()?.normalizedNumber if (phoneNumber.isNullOrEmpty()) { - item_autocomplete_number.beGone() + itemAutocompleteNumber.beGone() } else { - item_autocomplete_number.text = phoneNumber + itemAutocompleteNumber.text = phoneNumber } } @@ -65,7 +61,7 @@ class AutoCompleteTextViewAdapter( .placeholder(placeholder) .apply(options) .apply(RequestOptions.circleCropTransform()) - .into(item_autocomplete_image) + .into(itemAutocompleteImage) } return listItem diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt index 89069483..8f11fd12 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt @@ -146,10 +146,11 @@ class ContactsAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val layout = when (viewType) { VIEW_TYPE_GRID -> { - if (showPhoneNumbers) R.layout.item_contact_with_number_grid else R.layout.item_contact_without_number_grid + if (showPhoneNumbers) com.simplemobiletools.commons.R.layout.item_contact_with_number_grid else com.simplemobiletools.commons.R.layout.item_contact_without_number_grid } + else -> { - if (showPhoneNumbers) R.layout.item_contact_with_number else R.layout.item_contact_without_number + if (showPhoneNumbers) com.simplemobiletools.commons.R.layout.item_contact_with_number else com.simplemobiletools.commons.R.layout.item_contact_without_number } } return createViewHolder(layout, parent) @@ -194,10 +195,10 @@ class ContactsAdapter( val items = if (itemsCnt == 1) { "\"${getSelectedItems().first().getNameToDisplay()}\"" } else { - resources.getQuantityString(R.plurals.delete_contacts, itemsCnt, itemsCnt) + resources.getQuantityString(com.simplemobiletools.commons.R.plurals.delete_contacts, itemsCnt, itemsCnt) } - val baseString = R.string.deletion_confirmation + val baseString = com.simplemobiletools.commons.R.string.deletion_confirmation val question = String.format(resources.getString(baseString), items) ConfirmationDialog(activity, question) { @@ -345,7 +346,7 @@ class ContactsAdapter( .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .error(placeholderImage) - val size = activity.resources.getDimension(R.dimen.shortcut_size).toInt() + val size = activity.resources.getDimension(com.simplemobiletools.commons.R.dimen.shortcut_size).toInt() val itemToLoad: Any? = if (contact.photoUri.isNotEmpty()) { contact.photoUri } else { @@ -377,16 +378,16 @@ class ContactsAdapter( override fun onViewRecycled(holder: ViewHolder) { super.onViewRecycled(holder) if (!activity.isDestroyed && !activity.isFinishing) { - Glide.with(activity).clear(holder.itemView.findViewById(R.id.item_contact_image)) + Glide.with(activity).clear(holder.itemView.findViewById(com.simplemobiletools.commons.R.id.item_contact_image)) } } private fun setupView(view: View, contact: Contact, holder: ViewHolder) { view.apply { setupViewBackground(activity) - findViewById(R.id.item_contact_frame)?.isSelected = selectedKeys.contains(contact.id) + findViewById(com.simplemobiletools.commons.R.id.item_contact_frame)?.isSelected = selectedKeys.contains(contact.id) val fullName = contact.getNameToDisplay() - findViewById(R.id.item_contact_name).text = if (textToHighlight.isEmpty()) fullName else { + findViewById(com.simplemobiletools.commons.R.id.item_contact_name).text = if (textToHighlight.isEmpty()) fullName else { if (fullName.contains(textToHighlight, true)) { fullName.highlightTextPart(textToHighlight, properPrimaryColor) } else { @@ -394,12 +395,12 @@ class ContactsAdapter( } } - findViewById(R.id.item_contact_name).apply { + findViewById(com.simplemobiletools.commons.R.id.item_contact_name).apply { setTextColor(textColor) setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) } - if (findViewById(R.id.item_contact_number) != null) { + if (findViewById(com.simplemobiletools.commons.R.id.item_contact_number) != null) { val phoneNumberToUse = if (textToHighlight.isEmpty()) { contact.phoneNumbers.firstOrNull() } else { @@ -407,19 +408,19 @@ class ContactsAdapter( } val numberText = phoneNumberToUse?.value ?: "" - findViewById(R.id.item_contact_number).apply { + findViewById(com.simplemobiletools.commons.R.id.item_contact_number).apply { text = if (textToHighlight.isEmpty()) numberText else numberText.highlightTextPart(textToHighlight, properPrimaryColor, false, true) setTextColor(textColor) setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) } } - findViewById(R.id.item_contact_image).beVisibleIf(showContactThumbnails) + findViewById(com.simplemobiletools.commons.R.id.item_contact_image).beVisibleIf(showContactThumbnails) if (showContactThumbnails) { val placeholderImage = BitmapDrawable(resources, SimpleContactsHelper(context).getContactLetterIcon(fullName)) if (contact.photoUri.isEmpty() && contact.photo == null) { - findViewById(R.id.item_contact_image).setImageDrawable(placeholderImage) + findViewById(com.simplemobiletools.commons.R.id.item_contact_image).setImageDrawable(placeholderImage) } else { val options = RequestOptions() .signature(ObjectKey(contact.getSignatureKey())) @@ -437,11 +438,11 @@ class ContactsAdapter( .load(itemToLoad) .apply(options) .apply(RequestOptions.circleCropTransform()) - .into(findViewById(R.id.item_contact_image)) + .into(findViewById(com.simplemobiletools.commons.R.id.item_contact_image)) } } - val dragIcon = findViewById(R.id.drag_handle_icon) + val dragIcon = findViewById(com.simplemobiletools.commons.R.id.drag_handle_icon) if (enableDrag && textToHighlight.isEmpty()) { dragIcon.apply { beVisibleIf(selectedKeys.isNotEmpty()) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt index 3af91af1..abd7a187 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt @@ -8,9 +8,8 @@ import com.simplemobiletools.commons.extensions.getProperPrimaryColor import com.simplemobiletools.commons.extensions.getProperTextColor import com.simplemobiletools.commons.helpers.SMT_PRIVATE import com.simplemobiletools.commons.models.contacts.ContactSource -import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.SimpleActivity -import kotlinx.android.synthetic.main.item_filter_contact_source.view.* +import com.simplemobiletools.contacts.pro.databinding.ItemFilterContactSourceBinding class FilterContactSourcesAdapter( val activity: SimpleActivity, @@ -45,8 +44,7 @@ class FilterContactSourcesAdapter( fun getSelectedContactSources() = contactSources.filter { selectedKeys.contains(it.hashCode()) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view = activity.layoutInflater.inflate(R.layout.item_filter_contact_source, parent, false) - return ViewHolder(view) + return ViewHolder(ItemFilterContactSourceBinding.inflate(activity.layoutInflater, parent, false).root) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { @@ -59,13 +57,13 @@ class FilterContactSourcesAdapter( inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { fun bindView(contactSource: ContactSource): View { val isSelected = selectedKeys.contains(contactSource.hashCode()) - itemView.apply { - filter_contact_source_checkbox.isChecked = isSelected - filter_contact_source_checkbox.setColors(activity.getProperTextColor(), activity.getProperPrimaryColor(), activity.getProperBackgroundColor()) + ItemFilterContactSourceBinding.bind(itemView).apply { + filterContactSourceCheckbox.isChecked = isSelected + filterContactSourceCheckbox.setColors(activity.getProperTextColor(), activity.getProperPrimaryColor(), activity.getProperBackgroundColor()) val countText = if (contactSource.count >= 0) " (${contactSource.count})" else "" val displayName = "${contactSource.publicName}$countText" - filter_contact_source_checkbox.text = displayName - filter_contact_source_holder.setOnClickListener { viewClicked(!isSelected, contactSource) } + filterContactSourceCheckbox.text = displayName + filterContactSourceHolder.setOnClickListener { viewClicked(!isSelected, contactSource) } } return itemView diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/GroupsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/GroupsAdapter.kt index 91948e64..8634679b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/GroupsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/GroupsAdapter.kt @@ -7,20 +7,22 @@ import android.view.ViewGroup import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.dialogs.ConfirmationDialog -import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.extensions.beVisibleIf +import com.simplemobiletools.commons.extensions.getTextSize +import com.simplemobiletools.commons.extensions.groupsDB +import com.simplemobiletools.commons.extensions.highlightTextPart +import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.commons.helpers.TAB_GROUPS import com.simplemobiletools.commons.helpers.ensureBackgroundThread +import com.simplemobiletools.commons.models.contacts.Group import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.SimpleActivity +import com.simplemobiletools.contacts.pro.databinding.ItemGroupBinding import com.simplemobiletools.contacts.pro.dialogs.RenameGroupDialog -import com.simplemobiletools.commons.helpers.ContactsHelper -import com.simplemobiletools.commons.models.contacts.Group import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener -import kotlinx.android.synthetic.main.item_group.view.* -import java.util.* class GroupsAdapter( activity: SimpleActivity, var groups: ArrayList, val refreshListener: RefreshContactsListener?, recyclerView: MyRecyclerView, @@ -67,7 +69,9 @@ class GroupsAdapter( override fun onActionModeDestroyed() {} - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_group, parent) + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return createViewHolder(ItemGroupBinding.inflate(layoutInflater, parent, false).root) + } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val group = groups[position] @@ -110,7 +114,7 @@ class GroupsAdapter( resources.getQuantityString(R.plurals.delete_groups, itemsCnt, itemsCnt) } - val baseString = R.string.deletion_confirmation + val baseString = com.simplemobiletools.commons.R.string.deletion_confirmation val question = String.format(resources.getString(baseString), items) ConfirmationDialog(activity, question) { @@ -149,8 +153,8 @@ class GroupsAdapter( private fun getSelectedItems() = groups.filter { selectedKeys.contains(it.id?.toInt()) } as ArrayList private fun setupView(view: View, group: Group) { - view.apply { - group_frame?.isSelected = selectedKeys.contains(group.id!!.toInt()) + ItemGroupBinding.bind(view).apply { + groupFrame.isSelected = selectedKeys.contains(group.id!!.toInt()) val titleWithCnt = "${group.title} (${group.contactsCount})" val groupTitle = if (textToHighlight.isEmpty()) { titleWithCnt @@ -158,15 +162,15 @@ class GroupsAdapter( titleWithCnt.highlightTextPart(textToHighlight, properPrimaryColor) } - group_name.apply { + groupName.apply { setTextColor(textColor) setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) text = groupTitle } - group_tmb.beVisibleIf(showContactThumbnails) + groupTmb.beVisibleIf(showContactThumbnails) if (showContactThumbnails) { - group_tmb.setImageDrawable(SimpleContactsHelper(activity).getColoredGroupIcon(group.title)) + groupTmb.setImageDrawable(SimpleContactsHelper(activity).getColoredGroupIcon(group.title)) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SelectContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SelectContactsAdapter.kt index d7e64b07..39e68eec 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SelectContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SelectContactsAdapter.kt @@ -3,21 +3,26 @@ package com.simplemobiletools.contacts.pro.adapters import android.graphics.drawable.BitmapDrawable import android.util.SparseArray import android.util.TypedValue +import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView import androidx.recyclerview.widget.RecyclerView +import androidx.viewbinding.ViewBinding import com.bumptech.glide.Glide import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.signature.ObjectKey import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.SimpleContactsHelper -import com.simplemobiletools.commons.models.contacts.* +import com.simplemobiletools.commons.models.contacts.Contact +import com.simplemobiletools.commons.views.MyAppCompatCheckbox import com.simplemobiletools.commons.views.MyRecyclerView -import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.SimpleActivity +import com.simplemobiletools.contacts.pro.databinding.ItemAddFavoriteWithNumberBinding +import com.simplemobiletools.contacts.pro.databinding.ItemAddFavoriteWithoutNumberBinding import com.simplemobiletools.contacts.pro.extensions.config -import kotlinx.android.synthetic.main.item_add_favorite_with_number.view.* class SelectContactsAdapter( val activity: SimpleActivity, var contacts: ArrayList, private val selectedContacts: ArrayList, private val allowPickMultiple: Boolean, @@ -32,7 +37,7 @@ class SelectContactsAdapter( private val showContactThumbnails = config.showContactThumbnails private val showPhoneNumbers = config.showPhoneNumbers - private val itemLayout = if (showPhoneNumbers) R.layout.item_add_favorite_with_number else R.layout.item_add_favorite_without_number + private val itemBindingClass = if (showPhoneNumbers) Binding.WithNumber else Binding.WithoutNumber private var textToHighlight = "" init { @@ -56,7 +61,7 @@ class SelectContactsAdapter( selectedPositions.remove(pos) } - itemViews[pos]?.contact_checkbox?.isChecked = select + itemBindingClass.bind(itemViews[pos]).contactCheckbox.isChecked = select } fun getSelectedItemsSet(): HashSet { @@ -66,8 +71,8 @@ class SelectContactsAdapter( } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view = activity.layoutInflater.inflate(itemLayout, parent, false) - return ViewHolder(view) + val binding = itemBindingClass.inflate(activity.layoutInflater, parent, false) + return ViewHolder(binding.root) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { @@ -81,19 +86,19 @@ class SelectContactsAdapter( override fun onViewRecycled(holder: ViewHolder) { super.onViewRecycled(holder) if (!activity.isDestroyed && !activity.isFinishing) { - Glide.with(activity).clear(holder.itemView.contact_tmb) + Glide.with(activity).clear(itemBindingClass.bind(holder.itemView).contactTmb) } } inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { fun bindView(contact: Contact): View { - itemView.apply { - contact_checkbox.beVisibleIf(allowPickMultiple) - contact_checkbox.setColors(context.getProperTextColor(), context.getProperPrimaryColor(), context.getProperBackgroundColor()) - val textColor = context.getProperTextColor() + itemBindingClass.bind(itemView).apply { + contactCheckbox.beVisibleIf(allowPickMultiple) + contactCheckbox.setColors(root.context.getProperTextColor(), root.context.getProperPrimaryColor(), root.context.getProperBackgroundColor()) + val textColor = root.context.getProperTextColor() val fullName = contact.getNameToDisplay() - contact_name.text = if (textToHighlight.isEmpty()) fullName else { + contactName.text = if (textToHighlight.isEmpty()) fullName else { if (fullName.contains(textToHighlight, true)) { fullName.highlightTextPart(textToHighlight, adjustedPrimaryColor) } else { @@ -101,10 +106,10 @@ class SelectContactsAdapter( } } - contact_name.setTextColor(textColor) - contact_name.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) + contactName.setTextColor(textColor) + contactName.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) - if (contact_number != null) { + contactNumber?.apply { val phoneNumberToUse = if (textToHighlight.isEmpty()) { contact.phoneNumbers.firstOrNull() } else { @@ -112,21 +117,20 @@ class SelectContactsAdapter( } val numberText = phoneNumberToUse?.value ?: "" - contact_number.text = - if (textToHighlight.isEmpty()) numberText else numberText.highlightTextPart(textToHighlight, adjustedPrimaryColor, false, true) - contact_number.setTextColor(textColor) - contact_number.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) + text = if (textToHighlight.isEmpty()) numberText else numberText.highlightTextPart(textToHighlight, adjustedPrimaryColor, false, true) + setTextColor(textColor) + setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) } - contact_frame.setOnClickListener { + root.setOnClickListener { if (itemClick != null) { itemClick.invoke(contact) } else { - viewClicked(!contact_checkbox.isChecked) + viewClicked(!contactCheckbox.isChecked) } } - contact_tmb.beVisibleIf(showContactThumbnails) + contactTmb.beVisibleIf(showContactThumbnails) if (showContactThumbnails) { val avatarName = when { @@ -135,10 +139,10 @@ class SelectContactsAdapter( else -> contact.firstName } - val placeholderImage = BitmapDrawable(resources, SimpleContactsHelper(context).getContactLetterIcon(avatarName)) + val placeholderImage = BitmapDrawable(root.resources, SimpleContactsHelper(root.context).getContactLetterIcon(avatarName)) if (contact.photoUri.isEmpty() && contact.photo == null) { - contact_tmb.setImageDrawable(placeholderImage) + contactTmb.setImageDrawable(placeholderImage) } else { val options = RequestOptions() .signature(ObjectKey(contact.getSignatureKey())) @@ -156,7 +160,7 @@ class SelectContactsAdapter( .load(itemToLoad) .apply(options) .apply(RequestOptions.circleCropTransform()) - .into(contact_tmb) + .into(contactTmb) } } } @@ -168,4 +172,56 @@ class SelectContactsAdapter( toggleItemSelection(select, adapterPosition) } } + + private sealed interface Binding { + + fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemAddFavoriteBinding + fun bind(view: View): ItemAddFavoriteBinding + + + data object WithNumber : Binding { + override fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemAddFavoriteBinding { + return ItemAddFavoriteWithNumberBindingAdapter(ItemAddFavoriteWithNumberBinding.inflate(layoutInflater, viewGroup, attachToRoot)) + } + + override fun bind(view: View): ItemAddFavoriteBinding { + return ItemAddFavoriteWithNumberBindingAdapter(ItemAddFavoriteWithNumberBinding.bind(view)) + } + + } + + data object WithoutNumber : Binding { + override fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemAddFavoriteBinding { + return ItemAddFavoriteWithoutNumberBindingAdapter(ItemAddFavoriteWithoutNumberBinding.inflate(layoutInflater, viewGroup, attachToRoot)) + } + + override fun bind(view: View): ItemAddFavoriteBinding { + return ItemAddFavoriteWithoutNumberBindingAdapter(ItemAddFavoriteWithoutNumberBinding.bind(view)) + } + + } + } + + private interface ItemAddFavoriteBinding : ViewBinding { + val contactName: TextView + val contactNumber: TextView? + val contactTmb: ImageView + val contactCheckbox: MyAppCompatCheckbox + } + + private class ItemAddFavoriteWithoutNumberBindingAdapter(val binding: ItemAddFavoriteWithoutNumberBinding) : ItemAddFavoriteBinding { + override val contactName: TextView = binding.contactName + override val contactNumber: TextView? = null + override val contactTmb: ImageView = binding.contactTmb + override val contactCheckbox: MyAppCompatCheckbox = binding.contactCheckbox + override fun getRoot(): View = binding.root + } + + private class ItemAddFavoriteWithNumberBindingAdapter(val binding: ItemAddFavoriteWithNumberBinding) : ItemAddFavoriteBinding { + override val contactName: TextView = binding.contactName + override val contactNumber: TextView = binding.contactNumber + override val contactTmb: ImageView = binding.contactTmb + override val contactCheckbox: MyAppCompatCheckbox = binding.contactCheckbox + override fun getRoot(): View = binding.root + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ViewPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ViewPagerAdapter.kt index 592de5a7..a928017c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ViewPagerAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ViewPagerAdapter.kt @@ -19,7 +19,7 @@ class ViewPagerAdapter(val activity: SimpleActivity, val currTabsList: ArrayList val view = activity.layoutInflater.inflate(layout, container, false) container.addView(view) - (view as MyViewPagerFragment).apply { + (view as MyViewPagerFragment<*>).apply { setupFragment(activity) setupColors(activity.getProperTextColor(), activity.getProperPrimaryColor()) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/contentproviders/MyContactsContentProvider.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/contentproviders/MyContactsContentProvider.kt index eb54f45d..3bca6fb0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/contentproviders/MyContactsContentProvider.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/contentproviders/MyContactsContentProvider.kt @@ -6,8 +6,8 @@ import android.database.Cursor import android.database.MatrixCursor import android.net.Uri import com.google.gson.Gson -import com.simplemobiletools.commons.helpers.MyContactsContentProvider import com.simplemobiletools.commons.helpers.LocalContactsHelper +import com.simplemobiletools.commons.helpers.MyContactsContentProvider import com.simplemobiletools.contacts.pro.extensions.config class MyContactsContentProvider : ContentProvider() { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChangeSortingDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChangeSortingDialog.kt index 2f05b66c..8dd0f3b6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChangeSortingDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChangeSortingDialog.kt @@ -6,20 +6,20 @@ import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.databinding.DialogChangeSortingBinding import com.simplemobiletools.contacts.pro.extensions.config -import kotlinx.android.synthetic.main.dialog_change_sorting.view.* class ChangeSortingDialog(val activity: BaseSimpleActivity, private val showCustomSorting: Boolean = false, private val callback: () -> Unit) { private var currSorting = 0 private var config = activity.config - private var view = activity.layoutInflater.inflate(R.layout.dialog_change_sorting, null) + private val binding = DialogChangeSortingBinding.inflate(activity.layoutInflater) init { activity.getAlertDialogBuilder() - .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } - .setNegativeButton(R.string.cancel, null) + .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() } + .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) .apply { - activity.setupDialogStuff(view, this, R.string.sort_by) + activity.setupDialogStuff(binding.root, this, com.simplemobiletools.commons.R.string.sort_by) } currSorting = if (showCustomSorting && config.isCustomOrderSelected) { @@ -33,42 +33,41 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, private val showCust } private fun setupSortRadio() { - val sortingRadio = view.sorting_dialog_radio_sorting + val sortingRadio = binding.sortingDialogRadioSorting sortingRadio.setOnCheckedChangeListener { group, checkedId -> - val isCustomSorting = checkedId == sortingRadio.sorting_dialog_radio_custom.id - view.sorting_dialog_radio_order.beGoneIf(isCustomSorting) - view.divider.beGoneIf(isCustomSorting) + val isCustomSorting = checkedId == binding.sortingDialogRadioCustom.id + binding.sortingDialogRadioOrder.beGoneIf(isCustomSorting) + binding.divider.beGoneIf(isCustomSorting) } val sortBtn = when { - currSorting and SORT_BY_FIRST_NAME != 0 -> sortingRadio.sorting_dialog_radio_first_name - currSorting and SORT_BY_MIDDLE_NAME != 0 -> sortingRadio.sorting_dialog_radio_middle_name - currSorting and SORT_BY_SURNAME != 0 -> sortingRadio.sorting_dialog_radio_surname - currSorting and SORT_BY_FULL_NAME != 0 -> sortingRadio.sorting_dialog_radio_full_name - currSorting and SORT_BY_CUSTOM != 0 -> sortingRadio.sorting_dialog_radio_custom - else -> sortingRadio.sorting_dialog_radio_date_created + currSorting and SORT_BY_FIRST_NAME != 0 -> binding.sortingDialogRadioFirstName + currSorting and SORT_BY_MIDDLE_NAME != 0 -> binding.sortingDialogRadioMiddleName + currSorting and SORT_BY_SURNAME != 0 -> binding.sortingDialogRadioSurname + currSorting and SORT_BY_FULL_NAME != 0 -> binding.sortingDialogRadioFullName + currSorting and SORT_BY_CUSTOM != 0 -> binding.sortingDialogRadioCustom + else -> binding.sortingDialogRadioDateCreated } sortBtn.isChecked = true if (showCustomSorting) { - sortingRadio.sorting_dialog_radio_custom.isChecked = config.isCustomOrderSelected + binding.sortingDialogRadioCustom.isChecked = config.isCustomOrderSelected } - view.sorting_dialog_radio_custom.beGoneIf(!showCustomSorting) + binding.sortingDialogRadioCustom.beGoneIf(!showCustomSorting) } private fun setupOrderRadio() { - val orderRadio = view.sorting_dialog_radio_order - var orderBtn = orderRadio.sorting_dialog_radio_ascending + var orderBtn = binding.sortingDialogRadioAscending if (currSorting and SORT_DESCENDING != 0) { - orderBtn = orderRadio.sorting_dialog_radio_descending + orderBtn = binding.sortingDialogRadioDescending } orderBtn.isChecked = true } private fun dialogConfirmed() { - val sortingRadio = view.sorting_dialog_radio_sorting + val sortingRadio = binding.sortingDialogRadioSorting var sorting = when (sortingRadio.checkedRadioButtonId) { R.id.sorting_dialog_radio_first_name -> SORT_BY_FIRST_NAME R.id.sorting_dialog_radio_middle_name -> SORT_BY_MIDDLE_NAME @@ -78,7 +77,7 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, private val showCust else -> SORT_BY_DATE_CREATED } - if (sorting != SORT_BY_CUSTOM && view.sorting_dialog_radio_order.checkedRadioButtonId == R.id.sorting_dialog_radio_descending) { + if (sorting != SORT_BY_CUSTOM && binding.sortingDialogRadioOrder.checkedRadioButtonId == R.id.sorting_dialog_radio_descending) { sorting = sorting or SORT_DESCENDING } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChooseSocialDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChooseSocialDialog.kt index 7b7b56a1..7295fcc9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChooseSocialDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChooseSocialDialog.kt @@ -3,46 +3,44 @@ package com.simplemobiletools.contacts.pro.dialogs import android.app.Activity import android.view.ViewGroup import android.widget.RadioGroup -import android.widget.RelativeLayout import androidx.appcompat.app.AlertDialog import com.simplemobiletools.commons.extensions.beGone import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.models.contacts.SocialAction -import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.databinding.DialogChooseSocialBinding +import com.simplemobiletools.contacts.pro.databinding.ItemChooseSocialBinding import com.simplemobiletools.contacts.pro.extensions.getPackageDrawable -import kotlinx.android.synthetic.main.dialog_choose_social.view.* -import kotlinx.android.synthetic.main.item_choose_social.view.* class ChooseSocialDialog(val activity: Activity, actions: ArrayList, val callback: (action: SocialAction) -> Unit) { private lateinit var dialog: AlertDialog init { - val view = activity.layoutInflater.inflate(R.layout.dialog_choose_social, null) + val binding = DialogChooseSocialBinding.inflate(activity.layoutInflater) actions.sortBy { it.type } actions.forEach { action -> - val item = (activity.layoutInflater.inflate(R.layout.item_choose_social, null) as RelativeLayout).apply { - item_social_label.text = action.label - setOnClickListener { + val item = ItemChooseSocialBinding.inflate(activity.layoutInflater).apply { + itemSocialLabel.text = action.label + root.setOnClickListener { callback(action) dialog.dismiss() } val drawable = activity.getPackageDrawable(action.packageName) if (drawable == null) { - item_social_image.beGone() + itemSocialImage.beGone() } else { - item_social_image.setImageDrawable(drawable) + itemSocialImage.setImageDrawable(drawable) } } - view.dialog_choose_social.addView(item, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) + binding.dialogChooseSocial.addView(item.root, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) } val builder = activity.getAlertDialogBuilder() builder.apply { - activity.setupDialogStuff(view, this) { alertDialog -> + activity.setupDialogStuff(binding.root, this) { alertDialog -> dialog = alertDialog } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/CreateNewGroupDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/CreateNewGroupDialog.kt index df44401d..b7cd6eff 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/CreateNewGroupDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/CreateNewGroupDialog.kt @@ -11,22 +11,22 @@ import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.contacts.ContactSource import com.simplemobiletools.commons.models.contacts.Group import com.simplemobiletools.contacts.pro.R -import kotlinx.android.synthetic.main.dialog_create_new_group.view.* +import com.simplemobiletools.contacts.pro.databinding.DialogCreateNewGroupBinding class CreateNewGroupDialog(val activity: BaseSimpleActivity, val callback: (newGroup: Group) -> Unit) { init { - val view = activity.layoutInflater.inflate(R.layout.dialog_create_new_group, null) + val binding = DialogCreateNewGroupBinding.inflate(activity.layoutInflater) activity.getAlertDialogBuilder() - .setPositiveButton(R.string.ok, null) - .setNegativeButton(R.string.cancel, null) + .setPositiveButton(com.simplemobiletools.commons.R.string.ok, null) + .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) .apply { - activity.setupDialogStuff(view, this, R.string.create_new_group) { alertDialog -> - alertDialog.showKeyboard(view.group_name) + activity.setupDialogStuff(binding.root, this, R.string.create_new_group) { alertDialog -> + alertDialog.showKeyboard(binding.groupName) alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(View.OnClickListener { - val name = view.group_name.value + val name = binding.groupName.value if (name.isEmpty()) { - activity.toast(R.string.empty_name) + activity.toast(com.simplemobiletools.commons.R.string.empty_name) return@OnClickListener } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/CustomLabelDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/CustomLabelDialog.kt index 036dcd72..9f65a187 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/CustomLabelDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/CustomLabelDialog.kt @@ -3,23 +3,22 @@ package com.simplemobiletools.contacts.pro.dialogs import androidx.appcompat.app.AlertDialog import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.extensions.* -import com.simplemobiletools.contacts.pro.R -import kotlinx.android.synthetic.main.dialog_custom_label.view.* +import com.simplemobiletools.contacts.pro.databinding.DialogCustomLabelBinding class CustomLabelDialog(val activity: BaseSimpleActivity, val callback: (label: String) -> Unit) { init { - val view = activity.layoutInflater.inflate(R.layout.dialog_custom_label, null) + val binding = DialogCustomLabelBinding.inflate(activity.layoutInflater) activity.getAlertDialogBuilder() - .setPositiveButton(R.string.ok, null) - .setNegativeButton(R.string.cancel, null) + .setPositiveButton(com.simplemobiletools.commons.R.string.ok, null) + .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) .apply { - activity.setupDialogStuff(view, this, R.string.label) { alertDialog -> - alertDialog.showKeyboard(view.custom_label_edittext) + activity.setupDialogStuff(binding.root, this, com.simplemobiletools.commons.R.string.label) { alertDialog -> + alertDialog.showKeyboard(binding.customLabelEdittext) alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { - val label = view.custom_label_edittext.value + val label = binding.customLabelEdittext.value if (label.isEmpty()) { - activity.toast(R.string.empty_name) + activity.toast(com.simplemobiletools.commons.R.string.empty_name) return@setOnClickListener } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/DateTimePatternInfoDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/DateTimePatternInfoDialog.kt index ad5cd722..09e9af37 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/DateTimePatternInfoDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/DateTimePatternInfoDialog.kt @@ -10,7 +10,7 @@ class DateTimePatternInfoDialog(activity: BaseSimpleActivity) { init { val view = activity.layoutInflater.inflate(R.layout.datetime_pattern_info_layout, null) activity.getAlertDialogBuilder() - .setPositiveButton(R.string.ok) { _, _ -> { } } + .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { _, _ -> { } } .apply { activity.setupDialogStuff(view, this) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ExportContactsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ExportContactsDialog.kt index fdbab186..1cd58a77 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ExportContactsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ExportContactsDialog.kt @@ -1,18 +1,17 @@ package com.simplemobiletools.contacts.pro.dialogs -import android.view.View -import android.view.ViewGroup import androidx.appcompat.app.AlertDialog import com.simplemobiletools.commons.dialogs.FilePickerDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.ensureBackgroundThread -import com.simplemobiletools.commons.models.contacts.* +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 com.simplemobiletools.contacts.pro.databinding.DialogExportContactsBinding import com.simplemobiletools.contacts.pro.extensions.config -import kotlinx.android.synthetic.main.dialog_export_contacts.view.* import java.io.File class ExportContactsDialog( @@ -27,17 +26,17 @@ class ExportContactsDialog( private var isContactsReady = false init { - val view = (activity.layoutInflater.inflate(R.layout.dialog_export_contacts, null) as ViewGroup).apply { - export_contacts_folder.setText(activity.humanizePath(realPath)) - export_contacts_filename.setText("contacts_${activity.getCurrentFormattedDateTime()}") + val binding = DialogExportContactsBinding.inflate(activity.layoutInflater).apply { + exportContactsFolder.setText(activity.humanizePath(realPath)) + exportContactsFilename.setText("contacts_${activity.getCurrentFormattedDateTime()}") if (hidePath) { - export_contacts_folder_hint.beGone() + exportContactsFolderHint.beGone() } else { - export_contacts_folder.setOnClickListener { - activity.hideKeyboard(export_contacts_filename) + exportContactsFolder.setOnClickListener { + activity.hideKeyboard(exportContactsFilename) FilePickerDialog(activity, realPath, false, showFAB = true) { - export_contacts_folder.setText(activity.humanizePath(it)) + exportContactsFolder.setText(activity.humanizePath(it)) realPath = it } } @@ -57,29 +56,29 @@ class ExportContactsDialog( } activity.getAlertDialogBuilder() - .setPositiveButton(R.string.ok, null) - .setNegativeButton(R.string.cancel, null) + .setPositiveButton(com.simplemobiletools.commons.R.string.ok, null) + .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) .apply { - activity.setupDialogStuff(view, this, R.string.export_contacts) { alertDialog -> + activity.setupDialogStuff(binding.root, this, R.string.export_contacts) { alertDialog -> alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { - if (view.export_contacts_list.adapter == null || ignoreClicks) { + if (binding.exportContactsList.adapter == null || ignoreClicks) { return@setOnClickListener } - val filename = view.export_contacts_filename.value + val filename = binding.exportContactsFilename.value when { - filename.isEmpty() -> activity.toast(R.string.empty_name) + filename.isEmpty() -> activity.toast(com.simplemobiletools.commons.R.string.empty_name) filename.isAValidFilename() -> { val file = File(realPath, "$filename.vcf") if (!hidePath && file.exists()) { - activity.toast(R.string.name_taken) + activity.toast(com.simplemobiletools.commons.R.string.name_taken) return@setOnClickListener } ignoreClicks = true ensureBackgroundThread { activity.config.lastExportPath = file.absolutePath.getParentPath() - val selectedSources = (view.export_contacts_list.adapter as FilterContactSourcesAdapter).getSelectedContactSources() + val selectedSources = (binding.exportContactsList.adapter as FilterContactSourcesAdapter).getSelectedContactSources() val ignoredSources = contactSources .filter { !selectedSources.contains(it) } .map { it.getFullIdentifier() } @@ -88,14 +87,15 @@ class ExportContactsDialog( alertDialog.dismiss() } } - else -> activity.toast(R.string.invalid_name) + + else -> activity.toast(com.simplemobiletools.commons.R.string.invalid_name) } } } } } - private fun processDataIfReady(view: View) { + private fun processDataIfReady(binding: DialogExportContactsBinding) { if (!isContactSourcesReady || !isContactsReady) { return } @@ -110,7 +110,7 @@ class ExportContactsDialog( contactSources.addAll(contactSourcesWithCount) activity.runOnUiThread { - view.export_contacts_list.adapter = FilterContactSourcesAdapter(activity, contactSourcesWithCount, activity.getVisibleContactSources()) + binding.exportContactsList.adapter = FilterContactSourcesAdapter(activity, contactSourcesWithCount, activity.getVisibleContactSources()) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt index 014c9947..0ac3638f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt @@ -2,20 +2,20 @@ package com.simplemobiletools.contacts.pro.dialogs import androidx.appcompat.app.AlertDialog import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.getVisibleContactSources import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.SMT_PRIVATE -import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.commons.models.contacts.Contact +import com.simplemobiletools.commons.models.contacts.ContactSource import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.adapters.FilterContactSourcesAdapter -import com.simplemobiletools.commons.extensions.getVisibleContactSources -import com.simplemobiletools.commons.helpers.ContactsHelper -import com.simplemobiletools.commons.models.contacts.* +import com.simplemobiletools.contacts.pro.databinding.DialogFilterContactSourcesBinding import com.simplemobiletools.contacts.pro.extensions.config -import kotlinx.android.synthetic.main.dialog_filter_contact_sources.view.* class FilterContactSourcesDialog(val activity: SimpleActivity, private val callback: () -> Unit) { private var dialog: AlertDialog? = null - private val view = activity.layoutInflater.inflate(R.layout.dialog_filter_contact_sources, null) + private val binding = DialogFilterContactSourcesBinding.inflate(activity.layoutInflater) private var contactSources = ArrayList() private var contacts = ArrayList() private var isContactSourcesReady = false @@ -55,14 +55,14 @@ class FilterContactSourcesDialog(val activity: SimpleActivity, private val callb activity.runOnUiThread { val selectedSources = activity.getVisibleContactSources() - view.filter_contact_sources_list.adapter = FilterContactSourcesAdapter(activity, contactSourcesWithCount, selectedSources) + binding.filterContactSourcesList.adapter = FilterContactSourcesAdapter(activity, contactSourcesWithCount, selectedSources) if (dialog == null) { activity.getAlertDialogBuilder() - .setPositiveButton(R.string.ok) { dialogInterface, i -> confirmContactSources() } - .setNegativeButton(R.string.cancel, null) + .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialogInterface, i -> confirmContactSources() } + .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) .apply { - activity.setupDialogStuff(view, this) { alertDialog -> + activity.setupDialogStuff(binding.root, this) { alertDialog -> dialog = alertDialog } } @@ -71,7 +71,7 @@ class FilterContactSourcesDialog(val activity: SimpleActivity, private val callb } private fun confirmContactSources() { - val selectedContactSources = (view.filter_contact_sources_list.adapter as FilterContactSourcesAdapter).getSelectedContactSources() + val selectedContactSources = (binding.filterContactSourcesList.adapter as FilterContactSourcesAdapter).getSelectedContactSources() val ignoredContactSources = contactSources.filter { !selectedContactSources.contains(it) }.map { if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.getFullIdentifier() }.toHashSet() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ImportContactsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ImportContactsDialog.kt index cc73aa0d..4130f784 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ImportContactsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ImportContactsDialog.kt @@ -1,64 +1,66 @@ package com.simplemobiletools.contacts.pro.dialogs -import android.view.ViewGroup import androidx.appcompat.app.AlertDialog -import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.getPublicContactSource +import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.SMT_PRIVATE import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.SimpleActivity +import com.simplemobiletools.contacts.pro.databinding.DialogImportContactsBinding import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.extensions.showContactSourcePicker import com.simplemobiletools.contacts.pro.helpers.VcfImporter import com.simplemobiletools.contacts.pro.helpers.VcfImporter.ImportResult.IMPORT_FAIL -import kotlinx.android.synthetic.main.dialog_import_contacts.view.* class ImportContactsDialog(val activity: SimpleActivity, val path: String, private val callback: (refreshView: Boolean) -> Unit) { private var targetContactSource = "" private var ignoreClicks = false init { - val view = (activity.layoutInflater.inflate(R.layout.dialog_import_contacts, null) as ViewGroup).apply { + val binding = DialogImportContactsBinding.inflate(activity.layoutInflater).apply { targetContactSource = activity.config.lastUsedContactSource activity.getPublicContactSource(targetContactSource) { - import_contacts_title.setText(it) + importContactsTitle.setText(it) if (it.isEmpty()) { ContactsHelper(activity).getContactSources { val localSource = it.firstOrNull { it.name == SMT_PRIVATE } if (localSource != null) { targetContactSource = localSource.name activity.runOnUiThread { - import_contacts_title.setText(localSource.publicName) + importContactsTitle.setText(localSource.publicName) } } } } } - import_contacts_title.setOnClickListener { + importContactsTitle.setOnClickListener { activity.showContactSourcePicker(targetContactSource) { targetContactSource = if (it == activity.getString(R.string.phone_storage_hidden)) SMT_PRIVATE else it activity.getPublicContactSource(it) { val title = if (it == "") activity.getString(R.string.phone_storage) else it - import_contacts_title.setText(title) + importContactsTitle.setText(title) } } } } activity.getAlertDialogBuilder() - .setPositiveButton(R.string.ok, null) - .setNegativeButton(R.string.cancel, null) + .setPositiveButton(com.simplemobiletools.commons.R.string.ok, null) + .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) .apply { - activity.setupDialogStuff(view, this, R.string.import_contacts) { alertDialog -> + activity.setupDialogStuff(binding.root, this, R.string.import_contacts) { alertDialog -> alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { if (ignoreClicks) { return@setOnClickListener } ignoreClicks = true - activity.toast(R.string.importing) + activity.toast(com.simplemobiletools.commons.R.string.importing) ensureBackgroundThread { val result = VcfImporter(activity).importContacts(path, targetContactSource) handleParseResult(result) @@ -72,9 +74,9 @@ class ImportContactsDialog(val activity: SimpleActivity, val path: String, priva private fun handleParseResult(result: VcfImporter.ImportResult) { activity.toast( when (result) { - VcfImporter.ImportResult.IMPORT_OK -> R.string.importing_successful - VcfImporter.ImportResult.IMPORT_PARTIAL -> R.string.importing_some_entries_failed - else -> R.string.importing_failed + VcfImporter.ImportResult.IMPORT_OK -> com.simplemobiletools.commons.R.string.importing_successful + VcfImporter.ImportResult.IMPORT_PARTIAL -> com.simplemobiletools.commons.R.string.importing_some_entries_failed + else -> com.simplemobiletools.commons.R.string.importing_failed } ) callback(result != IMPORT_FAIL) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ManageAutoBackupsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ManageAutoBackupsDialog.kt index 9e999647..7e7494cc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ManageAutoBackupsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ManageAutoBackupsDialog.kt @@ -1,7 +1,5 @@ package com.simplemobiletools.contacts.pro.dialogs -import android.view.View -import android.view.ViewGroup import androidx.appcompat.app.AlertDialog import com.simplemobiletools.commons.dialogs.FilePickerDialog import com.simplemobiletools.commons.extensions.* @@ -12,15 +10,12 @@ 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 com.simplemobiletools.contacts.pro.databinding.DialogManageAutomaticBackupsBinding import com.simplemobiletools.contacts.pro.extensions.config -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_contacts_filename -import kotlinx.android.synthetic.main.dialog_manage_automatic_backups.view.backup_contacts_filename_hint -import kotlinx.android.synthetic.main.dialog_manage_automatic_backups.view.backup_contacts_folder import java.io.File 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 binding = DialogManageAutomaticBackupsBinding.inflate(activity.layoutInflater) private val config = activity.config private var backupFolder = config.autoBackupFolder private var contactSources = mutableListOf() @@ -30,23 +25,23 @@ class ManageAutoBackupsDialog(private val activity: SimpleActivity, onSuccess: ( private var isContactsReady = false init { - view.apply { - backup_contacts_folder.setText(activity.humanizePath(backupFolder)) + binding.apply { + backupContactsFolder.setText(activity.humanizePath(backupFolder)) val filename = config.autoBackupFilename.ifEmpty { "${activity.getString(R.string.contacts)}_%Y%M%D_%h%m%s" } - backup_contacts_filename.setText(filename) - backup_contacts_filename_hint.setEndIconOnClickListener { + backupContactsFilename.setText(filename) + backupContactsFilenameHint.setEndIconOnClickListener { DateTimePatternInfoDialog(activity) } - backup_contacts_filename_hint.setEndIconOnLongClickListener { + backupContactsFilenameHint.setEndIconOnLongClickListener { DateTimePatternInfoDialog(activity) true } - backup_contacts_folder.setOnClickListener { + backupContactsFolder.setOnClickListener { selectBackupFolder() } @@ -64,27 +59,27 @@ class ManageAutoBackupsDialog(private val activity: SimpleActivity, onSuccess: ( } activity.getAlertDialogBuilder() - .setPositiveButton(R.string.ok, null) - .setNegativeButton(R.string.cancel, null) + .setPositiveButton(com.simplemobiletools.commons.R.string.ok, null) + .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) .apply { - activity.setupDialogStuff(view, this, R.string.manage_automatic_backups) { dialog -> + activity.setupDialogStuff(binding.root, this, com.simplemobiletools.commons.R.string.manage_automatic_backups) { dialog -> dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { - if (view.backup_contact_sources_list.adapter == null) { + if (binding.backupContactSourcesList.adapter == null) { return@setOnClickListener } - val filename = view.backup_contacts_filename.value + val filename = binding.backupContactsFilename.value when { - filename.isEmpty() -> activity.toast(R.string.empty_name) + filename.isEmpty() -> activity.toast(com.simplemobiletools.commons.R.string.empty_name) filename.isAValidFilename() -> { val file = File(backupFolder, "$filename.vcf") if (file.exists() && !file.canWrite()) { - activity.toast(R.string.name_taken) + activity.toast(com.simplemobiletools.commons.R.string.name_taken) return@setOnClickListener } - val selectedSources = (view.backup_contact_sources_list.adapter as FilterContactSourcesAdapter).getSelectedContactSources() + val selectedSources = (binding.backupContactSourcesList.adapter as FilterContactSourcesAdapter).getSelectedContactSources() if (selectedSources.isEmpty()) { - activity.toast(R.string.no_entries_for_exporting) + activity.toast(com.simplemobiletools.commons.R.string.no_entries_for_exporting) return@setOnClickListener } @@ -104,14 +99,14 @@ class ManageAutoBackupsDialog(private val activity: SimpleActivity, onSuccess: ( } } - else -> activity.toast(R.string.invalid_name) + else -> activity.toast(com.simplemobiletools.commons.R.string.invalid_name) } } } } } - private fun processDataIfReady(view: View) { + private fun processDataIfReady(binding: DialogManageAutomaticBackupsBinding) { if (!isContactSourcesReady || !isContactsReady) { return } @@ -130,12 +125,12 @@ class ManageAutoBackupsDialog(private val activity: SimpleActivity, onSuccess: ( contactSources.addAll(contactSourcesWithCount) activity.runOnUiThread { - view.backup_contact_sources_list.adapter = FilterContactSourcesAdapter(activity, contactSourcesWithCount, selectedContactSources.toList()) + binding.backupContactSourcesList.adapter = FilterContactSourcesAdapter(activity, contactSourcesWithCount, selectedContactSources.toList()) } } private fun selectBackupFolder() { - activity.hideKeyboard(view.backup_contacts_filename) + activity.hideKeyboard(binding.backupContactsFilename) FilePickerDialog(activity, backupFolder, false, showFAB = true) { path -> activity.handleSAFDialog(path) { grantedSAF -> if (!grantedSAF) { @@ -148,7 +143,7 @@ class ManageAutoBackupsDialog(private val activity: SimpleActivity, onSuccess: ( } backupFolder = path - view.backup_contacts_folder.setText(activity.humanizePath(path)) + binding.backupContactsFolder.setText(activity.humanizePath(path)) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ManageVisibleFieldsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ManageVisibleFieldsDialog.kt index b0b16161..9f750e58 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ManageVisibleFieldsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ManageVisibleFieldsDialog.kt @@ -3,9 +3,9 @@ package com.simplemobiletools.contacts.pro.dialogs import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.views.MyAppCompatCheckbox import com.simplemobiletools.contacts.pro.R -import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.contacts.pro.extensions.config class ManageVisibleFieldsDialog(val activity: BaseSimpleActivity, val callback: (hasSomethingChanged: Boolean) -> Unit) { @@ -39,8 +39,8 @@ class ManageVisibleFieldsDialog(val activity: BaseSimpleActivity, val callback: } activity.getAlertDialogBuilder() - .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } - .setNegativeButton(R.string.cancel, null) + .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() } + .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) .apply { activity.setupDialogStuff(view, this) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ManageVisibleTabsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ManageVisibleTabsDialog.kt index 5806242d..53a7490e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ManageVisibleTabsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ManageVisibleTabsDialog.kt @@ -28,8 +28,8 @@ class ManageVisibleTabsDialog(val activity: BaseSimpleActivity) { } activity.getAlertDialogBuilder() - .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } - .setNegativeButton(R.string.cancel, null) + .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() } + .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) .apply { activity.setupDialogStuff(view, this) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/MyDatePickerDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/MyDatePickerDialog.kt index 2eb37a9f..76ae1b40 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/MyDatePickerDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/MyDatePickerDialog.kt @@ -4,21 +4,20 @@ import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.helpers.isSPlus -import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.databinding.DialogDatePickerBinding import com.simplemobiletools.contacts.pro.extensions.config -import kotlinx.android.synthetic.main.dialog_date_picker.view.* import org.joda.time.DateTime -import java.util.* +import java.util.Calendar class MyDatePickerDialog(val activity: BaseSimpleActivity, val defaultDate: String, val callback: (dateTag: String) -> Unit) { - private var view = activity.layoutInflater.inflate(R.layout.dialog_date_picker, null) + private val binding = DialogDatePickerBinding.inflate(activity.layoutInflater) init { activity.getAlertDialogBuilder() - .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } - .setNegativeButton(R.string.cancel, null) + .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() } + .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) .apply { - activity.setupDialogStuff(view, this) { alertDialog -> + activity.setupDialogStuff(binding.root, this) { alertDialog -> val today = Calendar.getInstance() var year = today.get(Calendar.YEAR) var month = today.get(Calendar.MONTH) @@ -26,7 +25,7 @@ class MyDatePickerDialog(val activity: BaseSimpleActivity, val defaultDate: Stri if (defaultDate.isNotEmpty()) { val ignoreYear = defaultDate.startsWith("-") - view.hide_year.isChecked = ignoreYear + binding.hideYear.isChecked = ignoreYear if (ignoreYear) { month = defaultDate.substring(2, 4).toInt() - 1 @@ -39,23 +38,23 @@ class MyDatePickerDialog(val activity: BaseSimpleActivity, val defaultDate: Stri } if (activity.config.isUsingSystemTheme && isSPlus()) { - val dialogBackgroundColor = activity.getColor(R.color.you_dialog_background_color) - view.dialog_holder.setBackgroundColor(dialogBackgroundColor) - view.date_picker.setBackgroundColor(dialogBackgroundColor) + val dialogBackgroundColor = activity.getColor(com.simplemobiletools.commons.R.color.you_dialog_background_color) + binding.dialogHolder.setBackgroundColor(dialogBackgroundColor) + binding.datePicker.setBackgroundColor(dialogBackgroundColor) } - view.date_picker.updateDate(year, month, day) + binding.datePicker.updateDate(year, month, day) } } } private fun dialogConfirmed() { - val year = view.date_picker.year - val month = view.date_picker.month + 1 - val day = view.date_picker.dayOfMonth + val year = binding.datePicker.year + val month = binding.datePicker.month + 1 + val day = binding.datePicker.dayOfMonth val date = DateTime().withDate(year, month, day).withTimeAtStartOfDay() - val tag = if (view.hide_year.isChecked) { + val tag = if (binding.hideYear.isChecked) { date.toString("--MM-dd") } else { date.toString("yyyy-MM-dd") diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/RenameGroupDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/RenameGroupDialog.kt index ab7c411b..7aee2407 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/RenameGroupDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/RenameGroupDialog.kt @@ -6,30 +6,29 @@ import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.models.contacts.Group -import com.simplemobiletools.contacts.pro.R -import kotlinx.android.synthetic.main.dialog_rename_group.view.* +import com.simplemobiletools.contacts.pro.databinding.DialogRenameGroupBinding class RenameGroupDialog(val activity: BaseSimpleActivity, val group: Group, val callback: () -> Unit) { init { - val view = activity.layoutInflater.inflate(R.layout.dialog_rename_group, null).apply { - rename_group_title.setText(group.title) + val binding = DialogRenameGroupBinding.inflate(activity.layoutInflater).apply { + renameGroupTitle.setText(group.title) } activity.getAlertDialogBuilder() - .setPositiveButton(R.string.ok, null) - .setNegativeButton(R.string.cancel, null) + .setPositiveButton(com.simplemobiletools.commons.R.string.ok, null) + .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) .apply { - activity.setupDialogStuff(view, this, R.string.rename) { alertDialog -> - alertDialog.showKeyboard(view.rename_group_title) + activity.setupDialogStuff(binding.root, this, com.simplemobiletools.commons.R.string.rename) { alertDialog -> + alertDialog.showKeyboard(binding.renameGroupTitle) alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { - val newTitle = view.rename_group_title.value + val newTitle = binding.renameGroupTitle.value if (newTitle.isEmpty()) { - activity.toast(R.string.empty_name) + activity.toast(com.simplemobiletools.commons.R.string.empty_name) return@setOnClickListener } if (!newTitle.isAValidFilename()) { - activity.toast(R.string.invalid_name) + activity.toast(com.simplemobiletools.commons.R.string.invalid_name) return@setOnClickListener } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt index 14287a76..397af71d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt @@ -4,19 +4,18 @@ import androidx.appcompat.app.AlertDialog import com.reddit.indicatorfastscroll.FastScrollItemIndicator import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.ensureBackgroundThread -import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.commons.models.contacts.Contact import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.adapters.SelectContactsAdapter -import com.simplemobiletools.commons.models.contacts.* -import kotlinx.android.synthetic.main.dialog_select_contact.view.* -import java.util.* +import com.simplemobiletools.contacts.pro.databinding.DialogSelectContactBinding +import java.util.Locale class SelectContactsDialog( val activity: SimpleActivity, initialContacts: ArrayList, val allowSelectMultiple: Boolean, val showOnlyContactsWithNumber: Boolean, selectContacts: ArrayList? = null, val callback: (addedContacts: ArrayList, removedContacts: ArrayList) -> Unit ) { private var dialog: AlertDialog? = null - private var view = activity.layoutInflater.inflate(R.layout.dialog_select_contact, null) + private val binding = DialogSelectContactBinding.inflate(activity.layoutInflater) private var initiallySelectedContacts = ArrayList() init { @@ -42,30 +41,30 @@ class SelectContactsDialog( dialog!!.dismiss() } - view.apply { - select_contact_list.adapter = SelectContactsAdapter( + binding.apply { + selectContactList.adapter = SelectContactsAdapter( activity, allContacts, initiallySelectedContacts, allowSelectMultiple, - select_contact_list, contactClickCallback + selectContactList, contactClickCallback ) - if (context.areSystemAnimationsEnabled) { - select_contact_list.scheduleLayoutAnimation() + if (root.context.areSystemAnimationsEnabled) { + selectContactList.scheduleLayoutAnimation() } - select_contact_list.beVisibleIf(allContacts.isNotEmpty()) - select_contact_placeholder.beVisibleIf(allContacts.isEmpty()) + selectContactList.beVisibleIf(allContacts.isNotEmpty()) + selectContactPlaceholder.beVisibleIf(allContacts.isEmpty()) } setupFastscroller(allContacts) val builder = activity.getAlertDialogBuilder() if (allowSelectMultiple) { - builder.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } + builder.setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() } } - builder.setNegativeButton(R.string.cancel, null) + builder.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) builder.apply { - activity.setupDialogStuff(view, this) { alertDialog -> + activity.setupDialogStuff(binding.root, this) { alertDialog -> dialog = alertDialog } } @@ -73,7 +72,7 @@ class SelectContactsDialog( private fun dialogConfirmed() { ensureBackgroundThread { - val adapter = view?.select_contact_list?.adapter as? SelectContactsAdapter + val adapter = binding.selectContactList.adapter as? SelectContactsAdapter val selectedContacts = adapter?.getSelectedItemsSet()?.toList() ?: ArrayList() val newlySelectedContacts = selectedContacts.filter { !initiallySelectedContacts.contains(it) } as ArrayList @@ -84,16 +83,16 @@ class SelectContactsDialog( private fun setupFastscroller(allContacts: ArrayList) { val adjustedPrimaryColor = activity.getProperPrimaryColor() - view.apply { - letter_fastscroller?.textColor = context.getProperTextColor().getColorStateList() - letter_fastscroller?.pressedTextColor = adjustedPrimaryColor - letter_fastscroller_thumb?.fontSize = context.getTextSize() - letter_fastscroller_thumb?.textColor = adjustedPrimaryColor.getContrastColor() - letter_fastscroller_thumb?.thumbColor = adjustedPrimaryColor.getColorStateList() - letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller) + binding.apply { + letterFastscroller.textColor = root.context.getProperTextColor().getColorStateList() + letterFastscroller.pressedTextColor = adjustedPrimaryColor + letterFastscrollerThumb.fontSize = root.context.getTextSize() + letterFastscrollerThumb.textColor = adjustedPrimaryColor.getContrastColor() + letterFastscrollerThumb.thumbColor = adjustedPrimaryColor.getColorStateList() + letterFastscrollerThumb.setupWithFastScroller(letterFastscroller) } - view.letter_fastscroller.setupWithRecyclerView(view.select_contact_list, { position -> + binding.letterFastscroller.setupWithRecyclerView(binding.selectContactList, { position -> try { val name = allContacts[position].getNameToDisplay() val character = if (name.isNotEmpty()) name.substring(0, 1) else "" diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectGroupsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectGroupsDialog.kt index 29afcbb7..3c5eaa36 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectGroupsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectGroupsDialog.kt @@ -1,6 +1,5 @@ package com.simplemobiletools.contacts.pro.dialogs -import android.view.ViewGroup import androidx.appcompat.app.AlertDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.ContactsHelper @@ -8,12 +7,12 @@ import com.simplemobiletools.commons.models.contacts.Group import com.simplemobiletools.commons.views.MyAppCompatCheckbox import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.SimpleActivity -import kotlinx.android.synthetic.main.dialog_select_groups.view.* -import kotlinx.android.synthetic.main.item_checkbox.view.* -import kotlinx.android.synthetic.main.item_textview.view.* +import com.simplemobiletools.contacts.pro.databinding.DialogSelectGroupsBinding +import com.simplemobiletools.contacts.pro.databinding.ItemCheckboxBinding +import com.simplemobiletools.contacts.pro.databinding.ItemTextviewBinding class SelectGroupsDialog(val activity: SimpleActivity, val selectedGroups: ArrayList, val callback: (newGroups: ArrayList) -> Unit) { - private val view = activity.layoutInflater.inflate(R.layout.dialog_select_groups, null) as ViewGroup + private val binding = DialogSelectGroupsBinding.inflate(activity.layoutInflater) private val checkboxes = ArrayList() private var groups = ArrayList() private var dialog: AlertDialog? = null @@ -35,44 +34,44 @@ class SelectGroupsDialog(val activity: SimpleActivity, val selectedGroups: Array addCreateNewGroupButton() activity.getAlertDialogBuilder() - .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } - .setNegativeButton(R.string.cancel, null) + .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() } + .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) .apply { - activity.setupDialogStuff(view, this) { alertDialog -> + activity.setupDialogStuff(binding.root, this) { alertDialog -> dialog = alertDialog } } } private fun addGroupCheckbox(group: Group) { - activity.layoutInflater.inflate(R.layout.item_checkbox, null, false).apply { - checkboxes.add(item_checkbox) - item_checkbox_holder.setOnClickListener { - item_checkbox.toggle() + ItemCheckboxBinding.inflate(activity.layoutInflater, null, false).apply { + checkboxes.add(itemCheckbox) + itemCheckboxHolder.setOnClickListener { + itemCheckbox.toggle() } - item_checkbox.apply { + itemCheckbox.apply { isChecked = selectedGroups.contains(group) text = group.title tag = group.id setColors(activity.getProperTextColor(), activity.getProperPrimaryColor(), activity.getProperBackgroundColor()) } - view.dialog_groups_holder.addView(this) + binding.dialogGroupsHolder.addView(this.root) } } private fun addCreateNewGroupButton() { val newGroup = Group(0, activity.getString(R.string.create_new_group)) - activity.layoutInflater.inflate(R.layout.item_textview, null, false).item_textview.apply { + ItemTextviewBinding.inflate(activity.layoutInflater, null, false).itemTextview.apply { text = newGroup.title tag = newGroup.id setTextColor(activity.getProperTextColor()) - view.dialog_groups_holder.addView(this) + binding.dialogGroupsHolder.addView(this) setOnClickListener { CreateNewGroupDialog(activity) { selectedGroups.add(it) groups.add(it) - view.dialog_groups_holder.removeViewAt(view.dialog_groups_holder.childCount - 1) + binding.dialogGroupsHolder.removeViewAt(binding.dialogGroupsHolder.childCount - 1) addGroupCheckbox(it) addCreateNewGroupButton() } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt index 6b68e2fb..7e15115d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt @@ -59,7 +59,7 @@ fun BaseSimpleActivity.shareContacts(contacts: ArrayList) { val file = getTempFile(filename) if (file == null) { - toast(R.string.unknown_error_occurred) + toast(com.simplemobiletools.commons.R.string.unknown_error_occurred) return } @@ -89,7 +89,7 @@ fun SimpleActivity.callContact(contact: Contact) { if (contact.phoneNumbers.isNotEmpty()) { tryInitiateCall(contact) { startCallIntent(it) } } else { - toast(R.string.no_phone_number_found) + toast(com.simplemobiletools.commons.R.string.no_phone_number_found) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 1ed82973..718629c7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -78,7 +78,7 @@ fun Context.backupContacts() { val config = config ContactsHelper(this).getContactsToExport(selectedContactSources = config.autoBackupContactSources) { contactsToBackup -> if (contactsToBackup.isEmpty()) { - toast(R.string.no_entries_for_exporting) + toast(com.simplemobiletools.commons.R.string.no_entries_for_exporting) config.lastAutoBackupTime = DateTime.now().millis scheduleNextAutomaticBackup() return@getContactsToExport @@ -136,8 +136,8 @@ fun Context.backupContacts() { } when (exportResult) { - ExportResult.EXPORT_OK -> toast(R.string.exporting_successful) - else -> toast(R.string.exporting_failed) + ExportResult.EXPORT_OK -> toast(com.simplemobiletools.commons.R.string.exporting_successful) + else -> toast(com.simplemobiletools.commons.R.string.exporting_failed) } config.lastAutoBackupTime = DateTime.now().millis diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/ContactsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/ContactsFragment.kt index f8b0555f..a52448ee 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/ContactsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/ContactsFragment.kt @@ -11,12 +11,22 @@ import com.simplemobiletools.contacts.pro.activities.InsertOrEditContactActivity import com.simplemobiletools.contacts.pro.activities.MainActivity import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.adapters.ContactsAdapter +import com.simplemobiletools.contacts.pro.databinding.FragmentContactsBinding +import com.simplemobiletools.contacts.pro.databinding.FragmentLettersLayoutBinding import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.helpers.LOCATION_CONTACTS_TAB import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener -import kotlinx.android.synthetic.main.fragment_layout.view.fragment_list -class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { +class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { + + private lateinit var binding: FragmentContactsBinding + + override fun onFinishInflate() { + super.onFinishInflate() + binding = FragmentContactsBinding.bind(this) + innerBinding = LetterLayout(FragmentLettersLayoutBinding.bind(binding.root)) + } + override fun fabClicked() { activity?.hideKeyboard() Intent(context, EditContactActivity::class.java).apply { @@ -34,7 +44,7 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag fun setupContactsAdapter(contacts: List) { setupViewVisibility(contacts.isNotEmpty()) - val currAdapter = fragment_list.adapter + val currAdapter = innerBinding.fragmentList.adapter if (currAdapter == null || forceListRedraw) { forceListRedraw = false @@ -46,16 +56,16 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag refreshListener = activity as RefreshContactsListener, location = location, removeListener = null, - recyclerView = fragment_list, + recyclerView = innerBinding.fragmentList, enableDrag = false, ) { (activity as RefreshContactsListener).contactClicked(it as Contact) }.apply { - fragment_list.adapter = this + innerBinding.fragmentList.adapter = this } if (context.areSystemAnimationsEnabled) { - fragment_list.scheduleLayoutAnimation() + innerBinding.fragmentList.scheduleLayoutAnimation() } } else { (currAdapter as ContactsAdapter).apply { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt index 1de96142..1f9fd738 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt @@ -17,17 +17,23 @@ import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.contacts.pro.activities.MainActivity import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.adapters.ContactsAdapter +import com.simplemobiletools.contacts.pro.databinding.FragmentFavoritesBinding +import com.simplemobiletools.contacts.pro.databinding.FragmentLettersLayoutBinding import com.simplemobiletools.contacts.pro.dialogs.SelectContactsDialog import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.helpers.LOCATION_FAVORITES_TAB import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener -import kotlinx.android.synthetic.main.dialog_select_contact.view.letter_fastscroller -import kotlinx.android.synthetic.main.fragment_favorites.view.favorites_fragment -import kotlinx.android.synthetic.main.fragment_layout.view.fragment_list -class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { +class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { private var favouriteContacts = listOf() private var zoomListener: MyRecyclerView.MyZoomListener? = null + lateinit var binding: FragmentFavoritesBinding + + override fun onFinishInflate() { + super.onFinishInflate() + binding = FragmentFavoritesBinding.bind(this) + innerBinding = LetterLayout(FragmentLettersLayoutBinding.bind(binding.root)) + } override fun fabClicked() { finishActMode() @@ -38,7 +44,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa showAddFavoritesDialog() } - private fun getRecyclerAdapter() = fragment_list.adapter as? ContactsAdapter + private fun getRecyclerAdapter() = innerBinding.fragmentList.adapter as? ContactsAdapter private fun showAddFavoritesDialog() { SelectContactsDialog(activity!!, allContacts, true, false) { addedContacts, removedContacts -> @@ -71,15 +77,15 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa location = location, viewType = viewType, removeListener = null, - recyclerView = fragment_list, + recyclerView = innerBinding.fragmentList, enableDrag = true, ) { (activity as RefreshContactsListener).contactClicked(it as Contact) }.apply { - fragment_list.adapter = this + innerBinding.fragmentList.adapter = this setupZoomListener(zoomListener) onDragEndListener = { - val adapter = fragment_list?.adapter + val adapter = innerBinding.fragmentList.adapter if (adapter is ContactsAdapter) { val items = adapter.contactItems saveCustomOrderToPrefs(items) @@ -89,7 +95,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa } if (context.areSystemAnimationsEnabled) { - fragment_list.scheduleLayoutAnimation() + innerBinding.fragmentList.scheduleLayoutAnimation() } } else { currAdapter.apply { @@ -110,17 +116,17 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa val spanCount = context.config.contactsGridColumnCount if (viewType == VIEW_TYPE_GRID) { - favorites_fragment.letter_fastscroller.beGone() - fragment_list.layoutManager = MyGridLayoutManager(context, spanCount) + innerBinding.letterFastscroller.beGone() + innerBinding.fragmentList.layoutManager = MyGridLayoutManager(context, spanCount) } else { - favorites_fragment.letter_fastscroller.beVisible() - fragment_list.layoutManager = MyLinearLayoutManager(context) + innerBinding.letterFastscroller.beVisible() + innerBinding.fragmentList.layoutManager = MyLinearLayoutManager(context) } } private fun initZoomListener(viewType: Int) { if (viewType == VIEW_TYPE_GRID) { - val layoutManager = fragment_list.layoutManager as MyGridLayoutManager + val layoutManager = innerBinding.fragmentList.layoutManager as MyGridLayoutManager zoomListener = object : MyRecyclerView.MyZoomListener { override fun zoomIn() { if (layoutManager.spanCount > 1) { @@ -156,7 +162,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa } fun columnCountChanged() { - (fragment_list.layoutManager as? MyGridLayoutManager)?.spanCount = context!!.config.contactsGridColumnCount + (innerBinding.fragmentList.layoutManager as? MyGridLayoutManager)?.spanCount = context!!.config.contactsGridColumnCount getRecyclerAdapter()?.apply { notifyItemRangeChanged(0, favouriteContacts.size) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/GroupsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/GroupsFragment.kt index 23f1bf37..b7ba5be4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/GroupsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/GroupsFragment.kt @@ -5,9 +5,20 @@ import android.util.AttributeSet import com.simplemobiletools.commons.helpers.TAB_GROUPS import com.simplemobiletools.contacts.pro.activities.MainActivity import com.simplemobiletools.contacts.pro.activities.SimpleActivity +import com.simplemobiletools.contacts.pro.databinding.FragmentGroupsBinding +import com.simplemobiletools.contacts.pro.databinding.FragmentLayoutBinding import com.simplemobiletools.contacts.pro.dialogs.CreateNewGroupDialog -class GroupsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { +class GroupsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { + + private lateinit var binding: FragmentGroupsBinding + + override fun onFinishInflate() { + super.onFinishInflate() + binding = FragmentGroupsBinding.bind(this) + innerBinding = FragmentLayout(FragmentLayoutBinding.bind(binding.root)) + } + override fun fabClicked() { finishActMode() showNewGroupsDialog() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt index 990a9686..9604c8c7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt @@ -4,13 +4,20 @@ import android.content.Context import android.content.Intent import android.util.AttributeSet import android.view.ViewGroup +import android.widget.RelativeLayout import androidx.coordinatorlayout.widget.CoordinatorLayout +import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller import com.reddit.indicatorfastscroll.FastScrollItemIndicator +import com.reddit.indicatorfastscroll.FastScrollerThumbView +import com.reddit.indicatorfastscroll.FastScrollerView import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.contacts.Contact import com.simplemobiletools.commons.models.contacts.Group +import com.simplemobiletools.commons.views.MyFloatingActionButton +import com.simplemobiletools.commons.views.MyRecyclerView +import com.simplemobiletools.commons.views.MyTextView import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.GroupContactsActivity import com.simplemobiletools.contacts.pro.activities.InsertOrEditContactActivity @@ -18,20 +25,18 @@ import com.simplemobiletools.contacts.pro.activities.MainActivity import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.adapters.ContactsAdapter import com.simplemobiletools.contacts.pro.adapters.GroupsAdapter +import com.simplemobiletools.contacts.pro.databinding.FragmentLayoutBinding +import com.simplemobiletools.contacts.pro.databinding.FragmentLettersLayoutBinding import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.helpers.AVOID_CHANGING_TEXT_TAG import com.simplemobiletools.contacts.pro.helpers.AVOID_CHANGING_VISIBILITY_TAG import com.simplemobiletools.contacts.pro.helpers.Config import com.simplemobiletools.contacts.pro.helpers.GROUP import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener -import kotlinx.android.synthetic.main.dialog_select_contact.view.letter_fastscroller -import kotlinx.android.synthetic.main.fragment_contacts.view.contacts_fragment -import kotlinx.android.synthetic.main.fragment_favorites.view.favorites_fragment -import kotlinx.android.synthetic.main.fragment_layout.view.* -import kotlinx.android.synthetic.main.fragment_letters_layout.view.letter_fastscroller_thumb import java.util.Locale -abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) : CoordinatorLayout(context, attributeSet) { +abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) : + CoordinatorLayout(context, attributeSet) { protected var activity: SimpleActivity? = null protected var allContacts = ArrayList() @@ -39,67 +44,69 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) private var contactsIgnoringSearch = listOf() private var groupsIgnoringSearch = listOf() private lateinit var config: Config + protected lateinit var innerBinding: BINDING var skipHashComparing = false var forceListRedraw = false + fun setupFragment(activity: SimpleActivity) { config = activity.config if (this.activity == null) { this.activity = activity - fragment_fab?.beGoneIf(activity is InsertOrEditContactActivity) - fragment_fab?.setOnClickListener { + innerBinding.fragmentFab.beGoneIf(activity is InsertOrEditContactActivity) + innerBinding.fragmentFab.setOnClickListener { fabClicked() } - fragment_placeholder_2?.setOnClickListener { + innerBinding.fragmentPlaceholder2.setOnClickListener { placeholderClicked() } - fragment_placeholder_2?.underlineText() + innerBinding.fragmentPlaceholder2.underlineText() - when { - this is ContactsFragment -> { - fragment_fab.contentDescription = activity.getString(R.string.create_new_contact) + when (this) { + is ContactsFragment -> { + innerBinding.fragmentFab.contentDescription = activity.getString(com.simplemobiletools.commons.R.string.create_new_contact) } - this is FavoritesFragment -> { - fragment_placeholder.text = activity.getString(R.string.no_favorites) - fragment_placeholder_2.text = activity.getString(R.string.add_favorites) - fragment_fab.contentDescription = activity.getString(R.string.add_favorites) + is FavoritesFragment -> { + innerBinding.fragmentPlaceholder.text = activity.getString(R.string.no_favorites) + innerBinding.fragmentPlaceholder2.text = activity.getString(com.simplemobiletools.commons.R.string.add_favorites) + innerBinding.fragmentFab.contentDescription = activity.getString(com.simplemobiletools.commons.R.string.add_favorites) } - this is GroupsFragment -> { - fragment_placeholder.text = activity.getString(R.string.no_group_created) - fragment_placeholder_2.text = activity.getString(R.string.create_group) - fragment_fab.contentDescription = activity.getString(R.string.create_group) + is GroupsFragment -> { + innerBinding.fragmentPlaceholder.text = activity.getString(R.string.no_group_created) + innerBinding.fragmentPlaceholder2.text = activity.getString(R.string.create_group) + innerBinding.fragmentFab.contentDescription = activity.getString(R.string.create_group) } } } } fun setupColors(textColor: Int, adjustedPrimaryColor: Int) { - when { - this is GroupsFragment -> (fragment_list.adapter as? GroupsAdapter)?.updateTextColor(textColor) - else -> (fragment_list.adapter as? ContactsAdapter)?.apply { + when (this) { + is GroupsFragment -> (innerBinding.fragmentList.adapter as? GroupsAdapter)?.updateTextColor(textColor) + else -> (innerBinding.fragmentList.adapter as? ContactsAdapter)?.apply { updateTextColor(textColor) } } - context.updateTextColors(fragment_wrapper.parent as ViewGroup) - fragment_fastscroller?.updateColors(adjustedPrimaryColor) - fragment_placeholder_2?.setTextColor(adjustedPrimaryColor) + context.updateTextColors(innerBinding.fragmentWrapper.parent as ViewGroup) + innerBinding.fragmentFastscroller?.updateColors(adjustedPrimaryColor) + innerBinding.fragmentPlaceholder2.setTextColor(adjustedPrimaryColor) - letter_fastscroller?.textColor = textColor.getColorStateList() - letter_fastscroller?.pressedTextColor = adjustedPrimaryColor - letter_fastscroller_thumb?.fontSize = context.getTextSize() - letter_fastscroller_thumb?.textColor = adjustedPrimaryColor.getContrastColor() - letter_fastscroller_thumb?.thumbColor = adjustedPrimaryColor.getColorStateList() + innerBinding.letterFastscroller?.textColor = textColor.getColorStateList() + innerBinding.letterFastscroller?.pressedTextColor = adjustedPrimaryColor + innerBinding.letterFastscrollerThumb?.fontSize = context.getTextSize() + innerBinding.letterFastscrollerThumb?.textColor = adjustedPrimaryColor.getContrastColor() + innerBinding.letterFastscrollerThumb?.thumbColor = adjustedPrimaryColor.getColorStateList() } fun startNameWithSurnameChanged(startNameWithSurname: Boolean) { if (this !is GroupsFragment) { - (fragment_list.adapter as? ContactsAdapter)?.apply { + (innerBinding.fragmentList.adapter as? ContactsAdapter)?.apply { config.sorting = if (startNameWithSurname) SORT_BY_SURNAME else SORT_BY_FIRST_NAME (this@MyViewPagerFragment.activity!! as MainActivity).refreshContacts(TAB_CONTACTS or TAB_FAVORITES) } @@ -150,10 +157,10 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) setupContacts(filtered) if (placeholderText != null) { - fragment_placeholder.text = placeholderText - fragment_placeholder.tag = AVOID_CHANGING_TEXT_TAG - fragment_placeholder_2.beGone() - fragment_placeholder_2.tag = AVOID_CHANGING_VISIBILITY_TAG + innerBinding.fragmentPlaceholder.text = placeholderText + innerBinding.fragmentPlaceholder.tag = AVOID_CHANGING_TEXT_TAG + innerBinding.fragmentPlaceholder2.beGone() + innerBinding.fragmentPlaceholder2.tag = AVOID_CHANGING_VISIBILITY_TAG } } } @@ -177,22 +184,22 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) when (this) { is GroupsFragment -> { setupGroupsAdapter(contacts) { - groupsIgnoringSearch = (fragment_list?.adapter as? GroupsAdapter)?.groups ?: ArrayList() + groupsIgnoringSearch = (innerBinding.fragmentList.adapter as? GroupsAdapter)?.groups ?: ArrayList() } } is FavoritesFragment -> { - favorites_fragment.setupContactsFavoritesAdapter(contacts) - contactsIgnoringSearch = (fragment_list?.adapter as? ContactsAdapter)?.contactItems ?: listOf() + setupContactsFavoritesAdapter(contacts) + contactsIgnoringSearch = (innerBinding.fragmentList.adapter as? ContactsAdapter)?.contactItems ?: listOf() setupLetterFastscroller(contacts) - letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller) + innerBinding.letterFastscrollerThumb.setupWithFastScroller(innerBinding.letterFastscroller) } - else -> { - contacts_fragment.setupContactsAdapter(contacts) - contactsIgnoringSearch = (fragment_list?.adapter as? ContactsAdapter)?.contactItems ?: ArrayList() + is ContactsFragment -> { + setupContactsAdapter(contacts) + contactsIgnoringSearch = (innerBinding.fragmentList.adapter as? ContactsAdapter)?.contactItems ?: ArrayList() setupLetterFastscroller(contacts) - letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller) + innerBinding.letterFastscrollerThumb.setupWithFastScroller(innerBinding.letterFastscroller) } } } @@ -210,24 +217,24 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) storedGroups = storedGroups.asSequence().sortedWith(compareBy { it.title.toLowerCase().normalizeString() }).toMutableList() as ArrayList - fragment_placeholder_2.beVisibleIf(storedGroups.isEmpty()) - fragment_placeholder.beVisibleIf(storedGroups.isEmpty()) - fragment_fastscroller.beVisibleIf(storedGroups.isNotEmpty()) + innerBinding.fragmentPlaceholder2.beVisibleIf(storedGroups.isEmpty()) + innerBinding.fragmentPlaceholder.beVisibleIf(storedGroups.isEmpty()) + innerBinding.letterFastscroller?.beVisibleIf(storedGroups.isNotEmpty()) - val currAdapter = fragment_list.adapter + val currAdapter = innerBinding.fragmentList.adapter if (currAdapter == null) { - GroupsAdapter(activity as SimpleActivity, storedGroups, activity as RefreshContactsListener, fragment_list) { + GroupsAdapter(activity as SimpleActivity, storedGroups, activity as RefreshContactsListener, innerBinding.fragmentList) { activity?.hideKeyboard() Intent(activity, GroupContactsActivity::class.java).apply { putExtra(GROUP, it as Group) activity!!.startActivity(this) } }.apply { - fragment_list.adapter = this + innerBinding.fragmentList.adapter = this } if (context.areSystemAnimationsEnabled) { - fragment_list.scheduleLayoutAnimation() + innerBinding.fragmentList.scheduleLayoutAnimation() } } else { (currAdapter as GroupsAdapter).apply { @@ -242,12 +249,12 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) fun showContactThumbnailsChanged(showThumbnails: Boolean) { if (this is GroupsFragment) { - (fragment_list.adapter as? GroupsAdapter)?.apply { + (innerBinding.fragmentList.adapter as? GroupsAdapter)?.apply { showContactThumbnails = showThumbnails notifyDataSetChanged() } } else { - (fragment_list.adapter as? ContactsAdapter)?.apply { + (innerBinding.fragmentList.adapter as? ContactsAdapter)?.apply { showContactThumbnails = showThumbnails notifyDataSetChanged() } @@ -256,7 +263,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) fun setupLetterFastscroller(contacts: List) { val sorting = context.config.sorting - letter_fastscroller.setupWithRecyclerView(fragment_list, { position -> + innerBinding.letterFastscroller?.setupWithRecyclerView(innerBinding.fragmentList, { position -> try { val contact = contacts[position] var name = when { @@ -282,12 +289,12 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) fun fontSizeChanged() { if (this is GroupsFragment) { - (fragment_list.adapter as? GroupsAdapter)?.apply { + (innerBinding.fragmentList.adapter as? GroupsAdapter)?.apply { fontSize = activity.getTextSize() notifyDataSetChanged() } } else { - (fragment_list.adapter as? ContactsAdapter)?.apply { + (innerBinding.fragmentList.adapter as? ContactsAdapter)?.apply { fontSize = activity.getTextSize() notifyDataSetChanged() } @@ -295,11 +302,11 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } fun finishActMode() { - (fragment_list.adapter as? MyRecyclerViewAdapter)?.finishActMode() + (innerBinding.fragmentList.adapter as? MyRecyclerViewAdapter)?.finishActMode() } fun onSearchQueryChanged(text: String) { - val adapter = fragment_list.adapter + val adapter = innerBinding.fragmentList.adapter if (adapter is ContactsAdapter) { val shouldNormalize = text.normalizeString() == text val filtered = contactsIgnoringSearch.filter { @@ -324,12 +331,12 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } if (filtered.isEmpty() && this@MyViewPagerFragment is FavoritesFragment) { - if (fragment_placeholder.tag != AVOID_CHANGING_TEXT_TAG) { - fragment_placeholder.text = activity?.getString(R.string.no_contacts_found) + if (innerBinding.fragmentPlaceholder.tag != AVOID_CHANGING_TEXT_TAG) { + innerBinding.fragmentPlaceholder.text = activity?.getString(com.simplemobiletools.commons.R.string.no_contacts_found) } } - fragment_placeholder.beVisibleIf(filtered.isEmpty()) + innerBinding.fragmentPlaceholder.beVisibleIf(filtered.isEmpty()) (adapter as? ContactsAdapter)?.updateItems(filtered, text.normalizeString()) setupLetterFastscroller(filtered) } else if (adapter is GroupsAdapter) { @@ -338,39 +345,72 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } as ArrayList if (filtered.isEmpty()) { - fragment_placeholder.text = activity?.getString(R.string.no_items_found) + innerBinding.fragmentPlaceholder.text = activity?.getString(com.simplemobiletools.commons.R.string.no_items_found) } - fragment_placeholder.beVisibleIf(filtered.isEmpty()) + innerBinding.fragmentPlaceholder.beVisibleIf(filtered.isEmpty()) (adapter as? GroupsAdapter)?.updateItems(filtered, text) } } fun onSearchClosed() { - if (fragment_list.adapter is ContactsAdapter) { - (fragment_list.adapter as? ContactsAdapter)?.updateItems(contactsIgnoringSearch) + if (innerBinding.fragmentList.adapter is ContactsAdapter) { + (innerBinding.fragmentList.adapter as? ContactsAdapter)?.updateItems(contactsIgnoringSearch) setupLetterFastscroller(contactsIgnoringSearch) setupViewVisibility(contactsIgnoringSearch.isNotEmpty()) - } else if (fragment_list.adapter is GroupsAdapter) { - (fragment_list.adapter as? GroupsAdapter)?.updateItems(ArrayList(groupsIgnoringSearch)) + } else if (innerBinding.fragmentList.adapter is GroupsAdapter) { + (innerBinding.fragmentList.adapter as? GroupsAdapter)?.updateItems(ArrayList(groupsIgnoringSearch)) setupViewVisibility(groupsIgnoringSearch.isNotEmpty()) } - if (this is FavoritesFragment && fragment_placeholder.tag != AVOID_CHANGING_TEXT_TAG) { - fragment_placeholder.text = activity?.getString(R.string.no_favorites) + if (this is FavoritesFragment && innerBinding.fragmentPlaceholder.tag != AVOID_CHANGING_TEXT_TAG) { + innerBinding.fragmentPlaceholder.text = activity?.getString(R.string.no_favorites) } } fun setupViewVisibility(hasItemsToShow: Boolean) { - if (fragment_placeholder_2.tag != AVOID_CHANGING_VISIBILITY_TAG) { - fragment_placeholder_2?.beVisibleIf(!hasItemsToShow) + if (innerBinding.fragmentPlaceholder2.tag != AVOID_CHANGING_VISIBILITY_TAG) { + innerBinding.fragmentPlaceholder2.beVisibleIf(!hasItemsToShow) } - fragment_placeholder?.beVisibleIf(!hasItemsToShow) - fragment_list.beVisibleIf(hasItemsToShow) + innerBinding.fragmentPlaceholder.beVisibleIf(!hasItemsToShow) + innerBinding.fragmentList.beVisibleIf(hasItemsToShow) } abstract fun fabClicked() abstract fun placeholderClicked() + + interface InnerBinding { + val fragmentList: MyRecyclerView + val fragmentPlaceholder: MyTextView + val fragmentPlaceholder2: MyTextView + val fragmentFab: MyFloatingActionButton + val fragmentWrapper: RelativeLayout + val letterFastscroller: FastScrollerView? + val letterFastscrollerThumb: FastScrollerThumbView? + val fragmentFastscroller: RecyclerViewFastScroller? + } + + class LetterLayout(val binding: FragmentLettersLayoutBinding) : InnerBinding { + override val fragmentList: MyRecyclerView = binding.fragmentList + override val fragmentPlaceholder: MyTextView = binding.fragmentPlaceholder + override val fragmentPlaceholder2: MyTextView = binding.fragmentPlaceholder2 + override val fragmentFab: MyFloatingActionButton = binding.fragmentFab + override val fragmentWrapper: RelativeLayout = binding.fragmentWrapper + override val letterFastscroller: FastScrollerView = binding.letterFastscroller + override val letterFastscrollerThumb: FastScrollerThumbView = binding.letterFastscrollerThumb + override val fragmentFastscroller: RecyclerViewFastScroller? = null + } + + class FragmentLayout(val binding: FragmentLayoutBinding) : InnerBinding { + override val fragmentList: MyRecyclerView = binding.fragmentList + override val fragmentPlaceholder: MyTextView = binding.fragmentPlaceholder + override val fragmentPlaceholder2: MyTextView = binding.fragmentPlaceholder2 + override val fragmentFab: MyFloatingActionButton = binding.fragmentFab + override val fragmentWrapper: RelativeLayout = binding.fragmentWrapper + override val letterFastscroller: FastScrollerView? = null + override val letterFastscrollerThumb: FastScrollerThumbView? = null + override val fragmentFastscroller: RecyclerViewFastScroller = binding.fragmentFastscroller + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt index 21822187..93e0fe9a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt @@ -15,6 +15,7 @@ class Config(context: Context) : BaseConfig(context) { var autoBackupContactSources: Set get() = prefs.getStringSet(AUTO_BACKUP_CONTACT_SOURCES, setOf())!! - set(autoBackupContactSources) = prefs.edit().remove(AUTO_BACKUP_CONTACT_SOURCES).putStringSet(AUTO_BACKUP_CONTACT_SOURCES, autoBackupContactSources).apply() + set(autoBackupContactSources) = prefs.edit().remove(AUTO_BACKUP_CONTACT_SOURCES).putStringSet(AUTO_BACKUP_CONTACT_SOURCES, autoBackupContactSources) + .apply() } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt index f7ba012d..102db262 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt @@ -13,7 +13,6 @@ import com.simplemobiletools.commons.extensions.getDateTimeFromDateString import com.simplemobiletools.commons.extensions.showErrorToast import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.models.contacts.Contact -import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.helpers.VcfExporter.ExportResult.EXPORT_FAIL import ezvcard.Ezvcard import ezvcard.VCard @@ -21,7 +20,7 @@ import ezvcard.VCardVersion import ezvcard.parameter.ImageType import ezvcard.property.* import java.io.OutputStream -import java.util.* +import java.util.Calendar class VcfExporter { enum class ExportResult { @@ -46,7 +45,7 @@ class VcfExporter { } if (showExportingToast) { - activity.toast(R.string.exporting) + activity.toast(com.simplemobiletools.commons.R.string.exporting) } val cards = ArrayList() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt index a21c1952..607e50a8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt @@ -7,16 +7,16 @@ import android.provider.ContactsContract.CommonDataKinds.Im import android.provider.ContactsContract.CommonDataKinds.Phone import android.provider.ContactsContract.CommonDataKinds.StructuredPostal import android.widget.Toast +import com.simplemobiletools.commons.extensions.getCachePhoto import com.simplemobiletools.commons.extensions.groupsDB import com.simplemobiletools.commons.extensions.normalizePhoneNumber import com.simplemobiletools.commons.extensions.showErrorToast -import com.simplemobiletools.commons.extensions.getCachePhoto -import com.simplemobiletools.contacts.pro.extensions.getCachePhotoUri import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.DEFAULT_MIMETYPE import com.simplemobiletools.commons.models.PhoneNumber import com.simplemobiletools.commons.models.contacts.* import com.simplemobiletools.contacts.pro.activities.SimpleActivity +import com.simplemobiletools.contacts.pro.extensions.getCachePhotoUri import com.simplemobiletools.contacts.pro.helpers.VcfImporter.ImportResult.IMPORT_FAIL import com.simplemobiletools.contacts.pro.helpers.VcfImporter.ImportResult.IMPORT_OK import com.simplemobiletools.contacts.pro.helpers.VcfImporter.ImportResult.IMPORT_PARTIAL @@ -26,7 +26,7 @@ import ezvcard.util.PartialDate import java.io.File import java.io.FileOutputStream import java.net.URLDecoder -import java.util.* +import java.util.Date class VcfImporter(val activity: SimpleActivity) { enum class ImportResult { @@ -261,6 +261,7 @@ class VcfImporter(val activity: SimpleActivity) { Phone.TYPE_HOME } } + WORK -> { if (subtype?.toUpperCase() == FAX) { Phone.TYPE_FAX_WORK @@ -268,6 +269,7 @@ class VcfImporter(val activity: SimpleActivity) { Phone.TYPE_WORK } } + MAIN -> Phone.TYPE_MAIN WORK_FAX -> Phone.TYPE_FAX_WORK HOME_FAX -> Phone.TYPE_FAX_HOME diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/RefreshContactsListener.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/RefreshContactsListener.kt index ec68aa5c..2384c713 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/RefreshContactsListener.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/RefreshContactsListener.kt @@ -1,6 +1,6 @@ package com.simplemobiletools.contacts.pro.interfaces -import com.simplemobiletools.commons.models.contacts.* +import com.simplemobiletools.commons.models.contacts.Contact interface RefreshContactsListener { fun refreshContacts(refreshTabsMask: Int) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/RemoveFromGroupListener.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/RemoveFromGroupListener.kt index 76b6f485..a1bec914 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/RemoveFromGroupListener.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/RemoveFromGroupListener.kt @@ -1,6 +1,6 @@ package com.simplemobiletools.contacts.pro.interfaces -import com.simplemobiletools.commons.models.contacts.* +import com.simplemobiletools.commons.models.contacts.Contact interface RemoveFromGroupListener { fun removeFromGroup(contacts: ArrayList) diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 94400f3a..00000000 --- a/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - ext.kotlin_version = '1.7.10' - - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.3.1' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -allprojects { - repositories { - google() - mavenCentral() - maven { url 'https://jitpack.io' } - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 00000000..9a736eea --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,5 @@ +plugins { + alias(libs.plugins.android).apply(false) + alias(libs.plugins.kotlinAndroid).apply(false) + alias(libs.plugins.ksp).apply(false) +} diff --git a/gradle.properties b/gradle.properties index dbb7bf70..b2d106ed 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,3 @@ android.enableJetifier=true android.useAndroidX=true +android.nonTransitiveRClass=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 00000000..fce02cb5 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,53 @@ +[versions] +#jetbrains +kotlin = "1.9.0" +#KSP +ksp = "1.9.0-1.0.12" +#AndroidX +androidx-swiperefreshlayout = "1.1.0" +#AutoFitTextView +autofittextview = "0.2.1" +#EzVCard +ezvcard = "0.11.3" +#IndicatorFastScroll +indicatorfastscroll = "4524cd0b61" +#Room +room = "2.6.0-alpha02" +#Simple tools +simple-commons = "c5a32fb1f3" +#Gradle +gradlePlugins-agp = "8.1.0" +#build +app-build-compileSDKVersion = "34" +app-build-targetSDK = "34" +app-build-minimumSDK = "23" +app-build-javaVersion = "VERSION_17" +app-build-kotlinJVMTarget = "17" +#versioning +app-version-appId = "com.simplemobiletools.contacts.pro" +app-version-versionCode = "104" +app-version-versionName = "6.22.4" +[libraries] +#AndroidX +androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "androidx-swiperefreshlayout" } +#AutoFitTextView +autofittextview = { module = "me.grantland:autofittextview", version.ref = "autofittextview" } +#EzVcard +ezvcard = { module = "com.googlecode.ez-vcard:ez-vcard", version.ref = "ezvcard" } +#IndicatorFastScroll +indicatorfastscroll = { module = "com.github.tibbi:IndicatorFastScroll", version.ref = "indicatorfastscroll" } +#Room +androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" } +androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" } +androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" } +#Simple Mobile Tools +simple-tools-commons = { module = "com.github.SimpleMobileTools:Simple-Commons", version.ref = "simple-commons" } +[bundles] +room = [ + "androidx-room-ktx", + "androidx-room-runtime", +] +[plugins] +android = { id = "com.android.application", version.ref = "gradlePlugins-agp" } +kotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a6495080..40c88566 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index e7b4def4..00000000 --- a/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':app' diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 00000000..45478cbe --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,16 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + maven { setUrl("https://jitpack.io") } + } +} +include(":app")