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 1ddb3d2c..abf4376c 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 @@ -540,7 +540,7 @@ class EditContactActivity : ContactActivity() { applyColorFilter(getAdjustedPrimaryColor()) background.applyColorFilter(config.textColor) setOnClickListener { - removeGroup(group.id) + removeGroup(group.id!!) } } } 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 0e33c5c5..5a1a056c 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 @@ -70,8 +70,8 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh private fun fabClicked() { SelectContactsDialog(this, allContacts, groupContacts) { addedContacts, removedContacts -> Thread { - addContactsToGroup(addedContacts, group.id) - removeContactsFromGroup(removedContacts, group.id) + addContactsToGroup(addedContacts, group.id!!) + removeContactsFromGroup(removedContacts, group.id!!) refreshContacts() }.start() } @@ -129,7 +129,7 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh override fun removeFromGroup(contacts: ArrayList) { Thread { - removeContactsFromGroup(contacts, group.id) + removeContactsFromGroup(contacts, group.id!!) if (groupContacts.size == 0) { refreshContacts() } 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 f008fbb6..3d1329ba 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 @@ -40,14 +40,18 @@ class ViewContactActivity : ContactActivity() { if (isViewIntent) { handlePermission(PERMISSION_READ_CONTACTS) { if (it) { - initContact() + Thread { + initContact() + }.start() } else { toast(R.string.no_contacts_permission) finish() } } } else { - initContact() + Thread { + initContact() + }.start() } } @@ -99,24 +103,24 @@ class ViewContactActivity : ContactActivity() { } if (contactId != 0 && !wasLookupKeyUsed) { - Thread { - contact = ContactsHelper(this).getContactWithId(contactId, intent.getBooleanExtra(IS_PRIVATE, false)) - if (contact == null) { - if (!wasEditLaunched) { - toast(R.string.unknown_error_occurred) - } - finish() - } else { - runOnUiThread { - gotContact() - } + contact = ContactsHelper(this).getContactWithId(contactId, intent.getBooleanExtra(IS_PRIVATE, false)) + if (contact == null) { + if (!wasEditLaunched) { + toast(R.string.unknown_error_occurred) } - }.start() + finish() + } else { + runOnUiThread { + gotContact() + } + } } else { if (contact == null) { finish() } else { - gotContact() + runOnUiThread { + gotContact() + } } } } 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 90a10f1a..925652c5 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 @@ -34,6 +34,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { + private val NEW_GROUP_ID = -1 private lateinit var contactDrawable: Drawable private lateinit var businessContactDrawable: Drawable @@ -198,19 +199,23 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList() - ContactsHelper(activity).getStoredGroups().forEach { - items.add(RadioItem(it.id.toInt(), it.title)) + ContactsHelper(activity).getStoredGroups { + it.forEach { + items.add(RadioItem(it.id!!.toInt(), it.title)) + items.add(RadioItem(NEW_GROUP_ID, activity.getString(R.string.create_new_group))) + } + showGroupsPicker(items) } - items.add(RadioItem(NEW_GROUP_ID, activity.getString(R.string.create_new_group))) + } - RadioGroupDialog(activity, items, 0) { + private fun showGroupsPicker(radioItems: ArrayList) { + val selectedContacts = getSelectedItems() + RadioGroupDialog(activity, radioItems, 0) { if (it as Int == NEW_GROUP_ID) { CreateNewGroupDialog(activity) { Thread { - activity.addContactsToGroup(selectedContacts, it.id) + activity.addContactsToGroup(selectedContacts, it.id!!.toLong()) refreshListener?.refreshContacts(GROUPS_TAB_MASK) }.start() finishActMode() 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 f700168c..c2e78641 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 @@ -59,7 +59,7 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val override fun getItemSelectionKey(position: Int) = groups.getOrNull(position)?.id?.toInt() - override fun getItemKeyPosition(key: Int) = groups.indexOfFirst { it.id.toInt() == key } + override fun getItemKeyPosition(key: Int) = groups.indexOfFirst { it.id!!.toInt() == key } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_group, parent) @@ -73,7 +73,7 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val override fun getItemCount() = groups.size - private fun getItemWithKey(key: Int): Group? = groups.firstOrNull { it.id.toInt() == key } + private fun getItemWithKey(key: Int): Group? = groups.firstOrNull { it.id!!.toInt() == key } fun updateItems(newItems: ArrayList) { groups = newItems @@ -101,13 +101,13 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val return } - val groupsToRemove = groups.filter { selectedKeys.contains(it.id.toInt()) } as ArrayList + val groupsToRemove = groups.filter { selectedKeys.contains(it.id!!.toInt()) } as ArrayList val positions = getSelectedItemPositions() groupsToRemove.forEach { if (it.isPrivateSecretGroup()) { - activity.dbHelper.deleteGroup(it.id) + activity.dbHelper.deleteGroup(it.id!!) } else { - ContactsHelper(activity).deleteGroup(it.id) + ContactsHelper(activity).deleteGroup(it.id!!) } } groups.removeAll(groupsToRemove) @@ -122,7 +122,7 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val private fun setupView(view: View, group: Group) { view.apply { - group_frame?.isSelected = selectedKeys.contains(group.id.toInt()) + group_frame?.isSelected = selectedKeys.contains(group.id!!.toInt()) group_name.apply { setTextColor(textColor) text = String.format(activity.getString(R.string.groups_placeholder), group.title, group.contactsCount.toString()) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt index 42e0c102..295a0bd7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt @@ -7,18 +7,23 @@ import androidx.room.RoomDatabase import androidx.room.TypeConverters import androidx.sqlite.db.SupportSQLiteDatabase import com.simplemobiletools.contacts.pro.helpers.Converters +import com.simplemobiletools.contacts.pro.helpers.FIRST_GROUP_ID import com.simplemobiletools.contacts.pro.helpers.getEmptyLocalContact import com.simplemobiletools.contacts.pro.interfaces.ContactsDao +import com.simplemobiletools.contacts.pro.interfaces.GroupsDao +import com.simplemobiletools.contacts.pro.models.Group import com.simplemobiletools.contacts.pro.models.LocalContact import com.simplemobiletools.contacts.pro.objects.MyExecutor import java.util.concurrent.Executors -@Database(entities = [(LocalContact::class)], version = 1) +@Database(entities = [LocalContact::class, Group::class], version = 1) @TypeConverters(Converters::class) abstract class ContactsDatabase : RoomDatabase() { abstract fun ContactsDao(): ContactsDao + abstract fun GroupsDao(): GroupsDao + companion object { private const val FIRST_CONTACT_ID = 1000000 @@ -33,7 +38,7 @@ abstract class ContactsDatabase : RoomDatabase() { .addCallback(object : Callback() { override fun onCreate(db: SupportSQLiteDatabase) { super.onCreate(db) - increaseAutoIncrementId() + increaseAutoIncrementIds() } }) .build() @@ -48,9 +53,9 @@ abstract class ContactsDatabase : RoomDatabase() { db = null } - // start autoincrement ID from FIRST_CONTACT_ID to avoid conflicts - // Room doesn't seem to have a built in way for it, so just create a contact and delete it - private fun increaseAutoIncrementId() { + // start autoincrement ID from FIRST_CONTACT_ID/FIRST_GROUP_ID to avoid conflicts + // Room doesn't seem to have a built in way for it, so just create a contact/group and delete it + private fun increaseAutoIncrementIds() { Executors.newSingleThreadExecutor().execute { val emptyContact = getEmptyLocalContact() emptyContact.id = FIRST_CONTACT_ID @@ -58,6 +63,12 @@ abstract class ContactsDatabase : RoomDatabase() { insertOrUpdate(emptyContact) deleteContactId(FIRST_CONTACT_ID) } + + val emptyGroup = Group(FIRST_GROUP_ID, "") + db!!.GroupsDao().apply { + insertOrUpdate(emptyGroup) + deleteGroupId(FIRST_GROUP_ID) + } } } } 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 f4eb3dbb..a0e0e9e8 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 @@ -65,10 +65,14 @@ class CreateNewGroupDialog(val activity: BaseSimpleActivity, val callback: (newG } private fun createGroupUnder(name: String, contactSource: ContactSource, dialog: AlertDialog) { - val newGroup = ContactsHelper(activity).createNewGroup(name, contactSource.name, contactSource.type) - if (newGroup != null) { - callback(newGroup) - } - dialog.dismiss() + Thread { + val newGroup = ContactsHelper(activity).createNewGroup(name, contactSource.name, contactSource.type) + activity.runOnUiThread { + if (newGroup != null) { + callback(newGroup) + } + dialog.dismiss() + } + }.start() } } 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 78a35542..25e97f5b 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 @@ -17,11 +17,20 @@ import java.util.* 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 checkboxes = ArrayList() - private val groups = ContactsHelper(activity).getStoredGroups() + private var groups = ArrayList() private val config = activity.config - private val dialog: AlertDialog? + private var dialog: AlertDialog? = null init { + ContactsHelper(activity).getStoredGroups { + groups = it + activity.runOnUiThread { + initDialog() + } + } + } + + private fun initDialog() { groups.sortedBy { it.title }.forEach { addGroupCheckbox(it) } 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 6ac38d33..50ad82d7 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 @@ -18,6 +18,7 @@ import com.simplemobiletools.contacts.pro.activities.ViewContactActivity import com.simplemobiletools.contacts.pro.databases.ContactsDatabase import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.interfaces.ContactsDao +import com.simplemobiletools.contacts.pro.interfaces.GroupsDao import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.models.Organization import java.io.File @@ -28,6 +29,8 @@ val Context.dbHelper: DBHelper get() = DBHelper.newInstance(applicationContext) val Context.contactsDB: ContactsDao get() = ContactsDatabase.getInstance(applicationContext).ContactsDao() +val Context.groupsDB: GroupsDao get() = ContactsDatabase.getInstance(applicationContext).GroupsDao() + fun Context.getEmptyContact(): Contact { val originalContactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE val organization = Organization("", "") 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 c35c676d..00f97747 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 @@ -145,42 +145,44 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } private fun setupGroupsAdapter(contacts: ArrayList) { - var storedGroups = ContactsHelper(activity!!).getStoredGroups() - contacts.forEach { - it.groups.forEach { - val group = it - val storedGroup = storedGroups.firstOrNull { it.id == group.id } - storedGroup?.addContact() - } - } - - storedGroups = storedGroups.asSequence().sortedWith(compareBy { it.title.normalizeString() }).toMutableList() as ArrayList - - fragment_placeholder_2.beVisibleIf(storedGroups.isEmpty()) - fragment_placeholder.beVisibleIf(storedGroups.isEmpty()) - fragment_list.beVisibleIf(storedGroups.isNotEmpty()) - - val currAdapter = fragment_list.adapter - if (currAdapter == null) { - GroupsAdapter(activity as SimpleActivity, storedGroups, activity, fragment_list, fragment_fastscroller) { - Intent(activity, GroupContactsActivity::class.java).apply { - putExtra(GROUP, it as Group) - activity!!.startActivity(this) + ContactsHelper(activity!!).getStoredGroups { + var storedGroups = it + contacts.forEach { + it.groups.forEach { + val group = it + val storedGroup = storedGroups.firstOrNull { it.id == group.id } + storedGroup?.addContact() } - }.apply { - addVerticalDividers(true) - fragment_list.adapter = this } - fragment_fastscroller.setScrollToY(0) - fragment_fastscroller.setViews(fragment_list) { - val item = (fragment_list.adapter as GroupsAdapter).groups.getOrNull(it) - fragment_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") - } - } else { - (currAdapter as GroupsAdapter).apply { - showContactThumbnails = activity.config.showContactThumbnails - updateItems(storedGroups) + storedGroups = storedGroups.asSequence().sortedWith(compareBy { it.title.normalizeString() }).toMutableList() as ArrayList + + fragment_placeholder_2.beVisibleIf(storedGroups.isEmpty()) + fragment_placeholder.beVisibleIf(storedGroups.isEmpty()) + fragment_list.beVisibleIf(storedGroups.isNotEmpty()) + + val currAdapter = fragment_list.adapter + if (currAdapter == null) { + GroupsAdapter(activity as SimpleActivity, storedGroups, activity, fragment_list, fragment_fastscroller) { + Intent(activity, GroupContactsActivity::class.java).apply { + putExtra(GROUP, it as Group) + activity!!.startActivity(this) + } + }.apply { + addVerticalDividers(true) + fragment_list.adapter = this + } + + fragment_fastscroller.setScrollToY(0) + fragment_fastscroller.setViews(fragment_list) { + val item = (fragment_list.adapter as GroupsAdapter).groups.getOrNull(it) + fragment_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") + } + } else { + (currAdapter as GroupsAdapter).apply { + showContactThumbnails = activity.config.showContactThumbnails + updateItems(storedGroups) + } } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt index b1e4bc2a..71166b20 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt @@ -22,7 +22,7 @@ const val CONTACT_ID = "contact_id" const val SMT_PRIVATE = "smt_private" // used at the contact source of local contacts hidden from other apps const val IS_PRIVATE = "is_private" const val GROUP = "group" -const val FIRST_GROUP_ID = 10000 +const val FIRST_GROUP_ID = 10000L const val PHONE_NUMBER_PATTERN = "[^0-9#*+]" const val IS_FROM_SIMPLE_CONTACTS = "is_from_simple_contacts" const val ADD_NEW_CONTACT_NUMBER = "add_new_contact_number" diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index 8cc9e353..a3c8a6f8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -75,7 +75,7 @@ class ContactsHelper(val activity: Activity) { } // groups are obtained with contactID, not rawID, so assign them to proper contacts like this - val groups = getContactGroups(getStoredGroups()) + val groups = getContactGroups(getStoredGroupsSync()) val size = groups.size() for (i in 0 until size) { val key = groups.keyAt(i) @@ -648,9 +648,18 @@ class ContactsHelper(val activity: Activity) { return args.toTypedArray() } - fun getStoredGroups(): ArrayList { + fun getStoredGroups(callback: (ArrayList) -> Unit) { + Thread { + val groups = getStoredGroupsSync() + activity.runOnUiThread { + callback(groups) + } + }.start() + } + + fun getStoredGroupsSync(): ArrayList { val groups = getDeviceStoredGroups() - groups.addAll(activity.dbHelper.getGroups()) + groups.addAll(activity.groupsDB.getGroups()) return groups } @@ -696,7 +705,10 @@ class ContactsHelper(val activity: Activity) { fun createNewGroup(title: String, accountName: String, accountType: String): Group? { if (accountType == SMT_PRIVATE) { - return activity.dbHelper.insertGroup(Group(0, title)) + val newGroup = Group(null, title) + val id = activity.groupsDB.insertOrUpdate(newGroup) + newGroup.id = id + return newGroup } val operations = ArrayList() @@ -769,7 +781,7 @@ class ContactsHelper(val activity: Activity) { } private fun parseContactCursor(selection: String, selectionArgs: Array): Contact? { - val storedGroups = getStoredGroups() + val storedGroups = getStoredGroupsSync() val uri = ContactsContract.Data.CONTENT_URI val projection = getContactProjection() var cursor: Cursor? = null @@ -1089,7 +1101,7 @@ class ContactsHelper(val activity: Activity) { } // delete groups - val relevantGroupIDs = getStoredGroups().map { it.id } + val relevantGroupIDs = getStoredGroupsSync().map { it.id } if (relevantGroupIDs.isNotEmpty()) { val IDsString = TextUtils.join(",", relevantGroupIDs) ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI).apply { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt index f7be8358..f80d0b79 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt @@ -11,7 +11,6 @@ import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.simplemobiletools.commons.extensions.getBlobValue import com.simplemobiletools.commons.extensions.getIntValue -import com.simplemobiletools.commons.extensions.getLongValue import com.simplemobiletools.commons.extensions.getStringValue import com.simplemobiletools.contacts.pro.extensions.applyRegexFiltering import com.simplemobiletools.contacts.pro.extensions.config @@ -81,16 +80,6 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont db.execSQL("REPLACE INTO sqlite_sequence (name, seq) VALUES ('$GROUPS_TABLE_NAME', $FIRST_GROUP_ID)") } - fun insertGroup(group: Group): Group? { - val contactValues = fillGroupValues(group) - val id = mDb.insert(GROUPS_TABLE_NAME, null, contactValues) - return if (id == -1L) { - null - } else { - Group(id, group.title) - } - } - fun renameGroup(group: Group): Boolean { val contactValues = fillGroupValues(group) val selection = "$COL_ID = ?" @@ -106,21 +95,6 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont mDb.delete(GROUPS_TABLE_NAME, selection, null) } - fun getGroups(): ArrayList { - val groups = ArrayList() - val projection = arrayOf(COL_ID, COL_TITLE) - val cursor = mDb.query(GROUPS_TABLE_NAME, projection, null, null, null, null, null) - cursor.use { - while (cursor.moveToNext()) { - val id = cursor.getLongValue(COL_ID) - val title = cursor.getStringValue(COL_TITLE) - val group = Group(id, title) - groups.add(group) - } - } - return groups - } - private fun fillGroupValues(group: Group): ContentValues { return ContentValues().apply { put(COL_TITLE, group.title) @@ -157,7 +131,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont } fun getContacts(activity: Activity, selection: String? = null, selectionArgs: Array? = null): ArrayList { - val storedGroups = ContactsHelper(activity).getStoredGroups() + val storedGroups = ContactsHelper(activity).getStoredGroupsSync() val filterDuplicates = activity.config.filterDuplicates val contacts = ArrayList() val projection = arrayOf(COL_ID, COL_PREFIX, COL_FIRST_NAME, COL_MIDDLE_NAME, COL_SURNAME, COL_SUFFIX, COL_NICKNAME, COL_PHONE_NUMBERS, 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 9102abdb..d62a0098 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 @@ -6,9 +6,9 @@ import android.provider.ContactsContract.CommonDataKinds import android.widget.Toast import com.simplemobiletools.commons.extensions.showErrorToast import com.simplemobiletools.contacts.pro.activities.SimpleActivity -import com.simplemobiletools.contacts.pro.extensions.dbHelper import com.simplemobiletools.contacts.pro.extensions.getCachePhoto import com.simplemobiletools.contacts.pro.extensions.getCachePhotoUri +import com.simplemobiletools.contacts.pro.extensions.groupsDB import com.simplemobiletools.contacts.pro.helpers.VcfImporter.ImportResult.* import com.simplemobiletools.contacts.pro.models.* import ezvcard.Ezvcard @@ -170,7 +170,7 @@ class VcfImporter(val activity: SimpleActivity) { val groupNames = ezContact.categories.values if (groupNames != null) { - val storedGroups = ContactsHelper(activity).getStoredGroups() + val storedGroups = ContactsHelper(activity).getStoredGroupsSync() groupNames.forEach { val groupName = it @@ -179,11 +179,10 @@ class VcfImporter(val activity: SimpleActivity) { if (storedGroup != null) { groups.add(storedGroup) } else { - val newContactGroup = activity.dbHelper.insertGroup(Group(0, groupName)) - - if (newContactGroup != null) { - groups.add(newContactGroup) - } + val newGroup = Group(null, groupName) + val id = activity.groupsDB.insertOrUpdate(newGroup) + newGroup.id = id + groups.add(newGroup) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/GroupsDao.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/GroupsDao.kt new file mode 100644 index 00000000..8991a6f0 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/GroupsDao.kt @@ -0,0 +1,19 @@ +package com.simplemobiletools.contacts.pro.interfaces + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.simplemobiletools.contacts.pro.models.Group + +@Dao +interface GroupsDao { + @Query("SELECT * FROM groups") + fun getGroups(): List + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertOrUpdate(group: Group): Long + + @Query("DELETE FROM groups WHERE id = :id") + fun deleteGroupId(id: Long) +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Group.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Group.kt index c36635bf..9628e664 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Group.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Group.kt @@ -1,16 +1,21 @@ package com.simplemobiletools.contacts.pro.models +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Index +import androidx.room.PrimaryKey import com.simplemobiletools.contacts.pro.helpers.FIRST_GROUP_ID import java.io.Serializable -data class Group(var id: Long, var title: String, var contactsCount: Int = 0) : Serializable { - companion object { - private const val serialVersionUID = -1384515348451345L - } +@Entity(tableName = "groups", indices = [(Index(value = ["id"], unique = true))]) +data class Group( + @PrimaryKey(autoGenerate = true) var id: Long?, + @ColumnInfo(name = "title") var title: String, + @ColumnInfo(name = "contacts_count") var contactsCount: Int = 0) : Serializable { fun addContact() = contactsCount++ fun getBubbleText() = title - fun isPrivateSecretGroup() = id >= FIRST_GROUP_ID + fun isPrivateSecretGroup() = id ?: 0 >= FIRST_GROUP_ID }