diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt index a3d49a7e..e5455c46 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -505,7 +505,7 @@ class EditContactActivity : ContactActivity() { removeContactEventButton.beGone() } - private fun removeGroup(id: Int) { + private fun removeGroup(id: Long) { contact!!.groups = contact!!.groups.filter { it.id != id } as ArrayList setupGroups() } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CreateNewGroupDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CreateNewGroupDialog.kt new file mode 100644 index 00000000..5897b671 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CreateNewGroupDialog.kt @@ -0,0 +1,41 @@ +package com.simplemobiletools.contacts.dialogs + +import android.support.v7.app.AlertDialog +import android.view.View +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.commons.extensions.showKeyboard +import com.simplemobiletools.commons.extensions.toast +import com.simplemobiletools.commons.extensions.value +import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.helpers.ContactsHelper +import com.simplemobiletools.contacts.models.Group +import kotlinx.android.synthetic.main.dialog_create_new_group.view.* + +class CreateNewGroupDialog(val activity: BaseSimpleActivity, val callback: (newGroup: Group) -> Unit) { + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_create_new_group, null) + + AlertDialog.Builder(activity) + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this, R.string.create_new_group) { + showKeyboard(view.group_name) + getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(View.OnClickListener { + val name = view.group_name.value + if (name.isEmpty()) { + activity.toast(R.string.empty_name) + return@OnClickListener + } + + val newGroup = ContactsHelper(activity).createNewGroup(name) + if (newGroup != null) { + callback(newGroup) + } + dismiss() + }) + } + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectGroupsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectGroupsDialog.kt index b0c6b6d8..66d1344e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectGroupsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectGroupsDialog.kt @@ -6,6 +6,7 @@ import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.views.MyAppCompatCheckbox import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.activities.SimpleActivity +import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.models.Group import kotlinx.android.synthetic.main.dialog_select_groups.view.* @@ -14,38 +15,18 @@ import kotlinx.android.synthetic.main.item_textview.view.* import java.util.* class SelectGroupsDialog(val activity: SimpleActivity, val selectedGroups: ArrayList, val callback: (newGroups: ArrayList) -> Unit) { - private val NEW_GROUP_ID = -1 - - private val dialog: AlertDialog? + 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 val config = activity.config + private val dialog: AlertDialog? init { - val view = activity.layoutInflater.inflate(R.layout.dialog_select_groups, null) as ViewGroup groups.forEach { - activity.layoutInflater.inflate(R.layout.item_checkbox, null, false).apply { - checkboxes.add(item_checkbox) - item_checkbox_holder.setOnClickListener { - item_checkbox.toggle() - } - item_checkbox.apply { - isChecked = selectedGroups.contains(it) - text = it.title - tag = it.id - } - view.dialog_groups_holder.addView(this) - } + addGroupCheckbox(it) } - val newGroup = Group(NEW_GROUP_ID, activity.getString(R.string.create_new_group)) - activity.layoutInflater.inflate(R.layout.item_textview, null, false).item_textview.apply { - text = newGroup.title - tag = newGroup.id - view.dialog_groups_holder.addView(this) - setOnClickListener { - - } - } + addCreateNewGroupButton() dialog = AlertDialog.Builder(activity) .setPositiveButton(R.string.ok, { dialog, which -> dialogConfirmed() }) @@ -55,10 +36,45 @@ class SelectGroupsDialog(val activity: SimpleActivity, val selectedGroups: Array } } + 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() + } + item_checkbox.apply { + isChecked = selectedGroups.contains(group) + text = group.title + tag = group.id + setColors(config.textColor, config.primaryColor, config.backgroundColor) + } + view.dialog_groups_holder.addView(this) + } + } + + 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 { + text = newGroup.title + tag = newGroup.id + setTextColor(config.textColor) + view.dialog_groups_holder.addView(this) + setOnClickListener { + CreateNewGroupDialog(activity) { + selectedGroups.add(it) + groups.add(it) + view.dialog_groups_holder.removeViewAt(view.dialog_groups_holder.childCount - 1) + addGroupCheckbox(it) + addCreateNewGroupButton() + } + } + } + } + private fun dialogConfirmed() { val selectedGroups = ArrayList() checkboxes.filter { it.isChecked }.forEach { - val groupId = it.tag as Int + val groupId = it.tag as Long groups.firstOrNull { it.id == groupId }?.apply { selectedGroups.add(this) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt index 4e90a224..8aa8bd08 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -13,10 +13,7 @@ import android.provider.ContactsContract.CommonDataKinds.Note import android.provider.MediaStore import android.util.SparseArray import com.simplemobiletools.commons.activities.BaseSimpleActivity -import com.simplemobiletools.commons.extensions.getIntValue -import com.simplemobiletools.commons.extensions.getStringValue -import com.simplemobiletools.commons.extensions.showErrorToast -import com.simplemobiletools.commons.extensions.toast +import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME import com.simplemobiletools.commons.helpers.SORT_BY_SURNAME @@ -335,7 +332,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) { if (cursor?.moveToFirst() == true) { do { val id = cursor.getIntValue(ContactsContract.Data.CONTACT_ID) - val newRowId = cursor.getIntValue(ContactsContract.Data.DATA1) + val newRowId = cursor.getLongValue(ContactsContract.Data.DATA1) if (groups[id] == null) { groups.put(id, ArrayList()) @@ -371,7 +368,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) { cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { do { - val id = cursor.getIntValue(ContactsContract.Groups._ID) + val id = cursor.getLongValue(ContactsContract.Groups._ID) val title = cursor.getStringValue(ContactsContract.Groups.TITLE) groups.add(Group(id, title)) } while (cursor.moveToNext()) @@ -385,6 +382,23 @@ class ContactsHelper(val activity: BaseSimpleActivity) { return groups } + fun createNewGroup(title: String): Group? { + try { + val operations = ArrayList() + ContentProviderOperation.newInsert(ContactsContract.Groups.CONTENT_URI).apply { + withValue(ContactsContract.Groups.TITLE, title) + operations.add(build()) + } + + val results = activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + val rawId = ContentUris.parseId(results[0].uri) + return Group(rawId, title) + } catch (e: Exception) { + activity.showErrorToast(e) + } + return null + } + fun getContactWithId(id: Int, isLocalPrivate: Boolean): Contact? { if (id == 0) { return null diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Group.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Group.kt index 736cd5fc..dbd23558 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Group.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Group.kt @@ -1,3 +1,3 @@ package com.simplemobiletools.contacts.models -data class Group(var id: Int, var title: String) +data class Group(var id: Long, var title: String) diff --git a/app/src/main/res/layout/dialog_create_new_group.xml b/app/src/main/res/layout/dialog_create_new_group.xml new file mode 100644 index 00000000..58884ff9 --- /dev/null +++ b/app/src/main/res/layout/dialog_create_new_group.xml @@ -0,0 +1,28 @@ + + + + + + + +