From d7d0e19e6cdfbc949b359cd418aaa4351afeb0cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kompiuteri=C5=B3=20meistras=20+37060040020?= Date: Mon, 19 Mar 2018 16:09:43 +0200 Subject: [PATCH 01/61] Lithuanian strings.xml Lithuanian translation --- app/src/main/res/values-lt/strings.xml | 90 ++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 app/src/main/res/values-lt/strings.xml diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml new file mode 100644 index 00000000..19c04488 --- /dev/null +++ b/app/src/main/res/values-lt/strings.xml @@ -0,0 +1,90 @@ + + Paprasti kontaktai + Kontaktai + Adresas + Įterpiama… + Atnaujinama… + Telefono atmintis + Telefono atmintis (nematoma kitų programėlių) + Nėra grupių + Sukurti naują grupę + + Naujas kontaktas + Redaguoti kontaktą + Pasirinkti kontaktą + pasirinkti kontaktus + Vardas + Antras vardas + Pavardė + + + Nufotografuoti + Pasirinkti nuotrauką + Pašalinti nuotrauką + + + Pavardė rodoma pirma + Rodyti telefono numerius pagrindiniame programos ekrane + Rodyti kontaktų miniatiūras + Ant kontakto paspaudimo + Skambinti kontaktui + Žiūrėti kontakto detales + Rodyti mėgiamiausiųjų skirtuką + Rodyti grupių skirtuką + + + Elektroninis paštas + Namų + Darbo + Kitas + + + Numeris + Mobilus + Pagrindinis + Darbo faksas + Namų faksas + Pranešimų gaviklis + Nerasta telefono numerio + + + Gimtadienis + Sukaktis + + + Atrodo jog Jūs dar neįvedėte nė vieno mėgiamiausiojo kontakto. + Pridėti mėgiamiausiuosius + Pridėti į mėgiamiausiuosius + Pašalinti iš mėgiamiausiųjų + + + Ieškoti kontaktų + Ieškoti mėgiamiausiųjų + + + Importuoti kontaktus + Eksportuoti kontaktus + Importuoti kontaktus iš .vcf bylos + Eksportuoti kontaktus į .vcf bylą + Tikslinis kontakto šaltinis + Įtraukti kontaktų šaltinius + Bylos vardas (be .vcf) + + + + Kontaktų programėlė įrenginio kontaktų tvarkymui, be reklamų. + + Paprasta programėlė įrenginio kontaktų kūrimui ir tvarkymui iš įvairių šaltinių. Kontaktai gali būti saugomi Jūsų įrenginyje, taip pat sinchronizuojami per Google, ar kitas paskyras. Jūs galite matyti mėgiamiausiuosius kontaktus atskirame sąraše. + + Jūs taip pat galite naudoti programėlę elektroninių paštų adresų tvarkymui. Programėlė turi galimybę rikiuoti/filtruoti pagal įvairius parametrus, taip pat rodyti pavardę pirma vardo. + + Neturi reklamų ar nereikalingų leidimų. Programėlė visiškai atviro kodo, yra galimybė keisti spalvas. + + Ši programėle yra vienintelė iš keletos mūsų programėlių. Likusias Jūs galite rasti čia http://www.simplemobiletools.com + + + + From 707f3ee4a022728c72b7a93aba101acfd6e7bdb9 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Mar 2018 15:30:57 +0100 Subject: [PATCH 02/61] handle counting group members --- .../contacts/activities/MainActivity.kt | 2 +- .../contacts/fragments/GroupsFragment.kt | 15 +++++++++++++ .../contacts/helpers/ContactsHelper.kt | 21 ++++++++++--------- .../contacts/models/Group.kt | 4 +++- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt index 27a0cadd..16392e06 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt @@ -286,7 +286,6 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { invalidateOptionsMenu() } }) - viewpager.currentItem = config.lastUsedViewPagerPage main_tabs_holder.onTabSelectionChanged( tabUnselectedAction = { @@ -409,6 +408,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { if (viewpager.adapter == null) { viewpager.adapter = ViewPagerAdapter(this, it) + viewpager.currentItem = config.lastUsedViewPagerPage } if (refreshContactsTab) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt index e52fe7e7..f9a2a013 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt @@ -4,11 +4,14 @@ import android.content.Context import android.support.design.widget.CoordinatorLayout import android.util.AttributeSet import com.simplemobiletools.contacts.activities.MainActivity +import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.interfaces.FragmentInterface import com.simplemobiletools.contacts.models.Contact class GroupsFragment(context: Context, attributeSet: AttributeSet) : CoordinatorLayout(context, attributeSet), FragmentInterface { + var activity: MainActivity? = null override fun setupFragment(activity: MainActivity) { + this.activity = activity } override fun textColorChanged(color: Int) { @@ -18,5 +21,17 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : Coordinator } override fun refreshContacts(contacts: ArrayList) { + if (activity == null) { + return + } + + val storedGroups = ContactsHelper(activity!!).getStoredGroups() + contacts.forEach { + it.groups.forEach { + val group = it + val storedGroup = storedGroups.firstOrNull { it.id == group.id } + storedGroup?.addContact() + } + } } } 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 ee8c0980..249138e9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -101,13 +101,6 @@ class ContactsHelper(val activity: BaseSimpleActivity) { contacts[key]?.notes = notes.valueAt(i) } - val groups = getContactGroups(getStoredGroups()) - size = groups.size() - for (i in 0 until size) { - val key = groups.keyAt(i) - contacts[key]?.groups = groups.valueAt(i) - } - activity.dbHelper.getContacts().forEach { contacts.put(it.id, it) } @@ -116,6 +109,15 @@ class ContactsHelper(val activity: BaseSimpleActivity) { var resultContacts = ArrayList(contactsSize) (0 until contactsSize).mapTo(resultContacts) { contacts.valueAt(it) } resultContacts = resultContacts.distinctBy { it.contactId } as ArrayList + + // groups are obtained with contactID, not rawID, so assign them to proper contacts like this + val groups = getContactGroups(getStoredGroups()) + size = groups.size() + for (i in 0 until size) { + val key = groups.keyAt(i) + resultContacts.firstOrNull { it.contactId == key }?.groups = groups.valueAt(i) + } + activity.runOnUiThread { callback(resultContacts) } @@ -336,12 +338,11 @@ class ContactsHelper(val activity: BaseSimpleActivity) { val id = cursor.getIntValue(ContactsContract.Data.CONTACT_ID) val newRowId = cursor.getLongValue(ContactsContract.Data.DATA1) + val groupTitle = storedGroups.firstOrNull { it.id == newRowId }?.title ?: continue + val group = Group(newRowId, groupTitle) if (groups[id] == null) { groups.put(id, ArrayList()) } - - val groupTitle = storedGroups.firstOrNull { it.id == newRowId }?.title ?: continue - val group = Group(newRowId, groupTitle) groups[id]!!.add(group) } while (cursor.moveToNext()) } 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 dbd23558..cf8cc42e 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,5 @@ package com.simplemobiletools.contacts.models -data class Group(var id: Long, var title: String) +data class Group(var id: Long, var title: String, var contactsCount: Int = 0) { + fun addContact() = contactsCount++ +} From 796cb13c9c9e510d17acc5f5bd4fae13bc26de73 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Mar 2018 16:44:03 +0100 Subject: [PATCH 03/61] populate Groups tab with the contact groups --- .../activities/EditContactActivity.kt | 6 +- .../contacts/activities/MainActivity.kt | 4 + .../contacts/adapters/ContactsAdapter.kt | 2 +- .../contacts/adapters/GroupsAdapter.kt | 104 ++++++++++++++++++ .../contacts/fragments/GroupsFragment.kt | 57 +++++++++- .../contacts/fragments/MyViewPagerFragment.kt | 2 +- .../contacts/interfaces/FragmentInterface.kt | 2 + .../contacts/models/Group.kt | 2 + .../main/res/layout/activity_edit_contact.xml | 2 +- app/src/main/res/layout/fragment_groups.xml | 36 ++++++ .../layout/item_add_favorite_with_number.xml | 1 + .../item_add_favorite_without_number.xml | 1 + app/src/main/res/layout/item_edit_group.xml | 41 +++++++ app/src/main/res/layout/item_group.xml | 64 ++++++----- app/src/main/res/menu/cab_groups.xml | 19 ++++ app/src/main/res/values/donottranslate.xml | 2 + 16 files changed, 305 insertions(+), 40 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt create mode 100644 app/src/main/res/layout/item_edit_group.xml create mode 100644 app/src/main/res/menu/cab_groups.xml 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 e5455c46..9729b28d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.item_edit_address.view.* import kotlinx.android.synthetic.main.item_edit_email.view.* import kotlinx.android.synthetic.main.item_edit_phone_number.view.* import kotlinx.android.synthetic.main.item_event.view.* -import kotlinx.android.synthetic.main.item_group.view.* +import kotlinx.android.synthetic.main.item_edit_group.view.* import org.joda.time.DateTime import org.joda.time.format.DateTimeFormat import java.util.* @@ -331,7 +331,7 @@ class EditContactActivity : ContactActivity() { groups.forEachIndexed { index, group -> var groupHolder = contact_groups_holder.getChildAt(index) if (groupHolder == null) { - groupHolder = layoutInflater.inflate(R.layout.item_group, contact_groups_holder, false) + groupHolder = layoutInflater.inflate(R.layout.item_edit_group, contact_groups_holder, false) contact_groups_holder.addView(groupHolder) } @@ -359,7 +359,7 @@ class EditContactActivity : ContactActivity() { } if (groups.isEmpty()) { - layoutInflater.inflate(R.layout.item_group, contact_groups_holder, false).apply { + layoutInflater.inflate(R.layout.item_edit_group, contact_groups_holder, false).apply { contact_group.apply { alpha = 0.5f text = getString(R.string.no_groups) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt index 16392e06..dc0f6dbe 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt @@ -95,6 +95,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { if (storedShowContactThumbnails != configShowContactThumbnails) { contacts_fragment?.showContactThumbnailsChanged(configShowContactThumbnails) favorites_fragment?.showContactThumbnailsChanged(configShowContactThumbnails) + groups_fragment?.showContactThumbnailsChanged(configShowContactThumbnails) } val configTextColor = config.textColor @@ -104,6 +105,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } contacts_fragment?.textColorChanged(configTextColor) favorites_fragment?.textColorChanged(configTextColor) + groups_fragment?.textColorChanged(configTextColor) } val configBackgroundColor = config.backgroundColor @@ -117,6 +119,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { main_tabs_holder.getTabAt(viewpager.currentItem)?.icon?.applyColorFilter(getAdjustedPrimaryColor()) contacts_fragment?.primaryColorChanged(configPrimaryColor) favorites_fragment?.primaryColorChanged(configPrimaryColor) + groups_fragment?.primaryColorChanged(configPrimaryColor) } val configStartNameWithSurname = config.startNameWithSurname @@ -132,6 +135,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { contacts_fragment?.onActivityResume() favorites_fragment?.onActivityResume() + groups_fragment?.onActivityResume() refreshContacts(true, true) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index 95a04a55..a58898c6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -32,7 +32,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList, recyclerView: MyRecyclerView, fastScroller: FastScroller, + itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { + + private var config = activity.config + private var smallPadding = activity.resources.getDimension(R.dimen.small_margin).toInt() + private var bigPadding = activity.resources.getDimension(R.dimen.normal_margin).toInt() + + var showContactThumbnails = config.showContactThumbnails + + override fun getActionMenuId() = R.menu.cab_groups + + override fun prepareActionMode(menu: Menu) { + menu.apply { + findItem(R.id.cab_edit).isVisible = isOneItemSelected() + } + } + + override fun prepareItemSelection(view: View) {} + + override fun markItemSelection(select: Boolean, view: View?) { + view?.group_frame?.isSelected = select + } + + override fun actionItemPressed(id: Int) { + if (selectedPositions.isEmpty()) { + return + } + + when (id) { + R.id.cab_edit -> editGroup() + R.id.cab_select_all -> selectAll() + R.id.cab_delete -> askConfirmDelete() + } + } + + override fun getSelectableItemCount() = groups.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_group, parent) + + override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) { + val group = groups[position] + val view = holder.bindView(group, true) { itemView, layoutPosition -> + setupView(itemView, group) + } + bindViewHolder(holder, position, view) + } + + override fun getItemCount() = groups.size + + fun updateItems(newItems: ArrayList) { + groups = newItems + notifyDataSetChanged() + finishActMode() + } + + private fun editGroup() { + + } + + private fun askConfirmDelete() { + ConfirmationDialog(activity) { + deleteContacts() + } + } + + private fun deleteContacts() { + if (selectedPositions.isEmpty()) { + return + } + } + + private fun setupView(view: View, group: Group) { + view.apply { + group_name.apply { + setTextColor(textColor) + text = String.format(activity.getString(R.string.groups_placeholder), group.title, group.contactsCount.toString()) + setPadding(if (showContactThumbnails) smallPadding else bigPadding, smallPadding, smallPadding, 0) + } + + group_tmb.beVisibleIf(showContactThumbnails) + if (showContactThumbnails) { + group_tmb.applyColorFilter(textColor) + } + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt index f9a2a013..ea2f2731 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt @@ -3,21 +3,37 @@ package com.simplemobiletools.contacts.fragments import android.content.Context import android.support.design.widget.CoordinatorLayout import android.util.AttributeSet +import android.view.ViewGroup +import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.contacts.activities.MainActivity +import com.simplemobiletools.contacts.activities.SimpleActivity +import com.simplemobiletools.contacts.adapters.GroupsAdapter +import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.interfaces.FragmentInterface import com.simplemobiletools.contacts.models.Contact +import kotlinx.android.synthetic.main.fragment_groups.view.* class GroupsFragment(context: Context, attributeSet: AttributeSet) : CoordinatorLayout(context, attributeSet), FragmentInterface { var activity: MainActivity? = null override fun setupFragment(activity: MainActivity) { - this.activity = activity + if (this.activity == null) { + this.activity = activity + groups_fab.setOnClickListener { + + } + + updateViewStuff() + } } override fun textColorChanged(color: Int) { + (groups_list.adapter as GroupsAdapter).updateTextColor(color) } override fun primaryColorChanged(color: Int) { + groups_fastscroller.updatePrimaryColor() + groups_fastscroller.updateBubblePrimaryColor() } override fun refreshContacts(contacts: ArrayList) { @@ -33,5 +49,44 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : Coordinator storedGroup?.addContact() } } + + val currAdapter = groups_list.adapter + if (currAdapter == null) { + GroupsAdapter(activity as SimpleActivity, storedGroups, groups_list, groups_fastscroller) { + + }.apply { + setupDragListener(true) + addVerticalDividers(true) + groups_list.adapter = this + } + + groups_fastscroller.setScrollTo(0) + groups_fastscroller.setViews(groups_list) { + val item = (groups_list.adapter as GroupsAdapter).groups.getOrNull(it) + groups_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") + } + } else { + (currAdapter as GroupsAdapter).apply { + showContactThumbnails = activity.config.showContactThumbnails + updateItems(storedGroups) + } + } + } + + override fun showContactThumbnailsChanged(showThumbnails: Boolean) { + (groups_list.adapter as? GroupsAdapter)?.apply { + showContactThumbnails = showThumbnails + notifyDataSetChanged() + } + } + + fun onActivityResume() { + updateViewStuff() + } + + private fun updateViewStuff() { + context.updateTextColors(groups_wrapper.parent as ViewGroup) + groups_fastscroller.updateBubbleColors() + groups_fastscroller.allowBubbleDisplay = context.config.showInfoBubble } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt index e273e94c..1eefc054 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt @@ -142,7 +142,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } } - fun showContactThumbnailsChanged(showThumbnails: Boolean) { + override fun showContactThumbnailsChanged(showThumbnails: Boolean) { (fragment_list.adapter as? ContactsAdapter)?.apply { showContactThumbnails = showThumbnails notifyDataSetChanged() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/FragmentInterface.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/FragmentInterface.kt index 0f49e205..801c22af 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/FragmentInterface.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/FragmentInterface.kt @@ -11,4 +11,6 @@ interface FragmentInterface { fun primaryColorChanged(color: Int) fun refreshContacts(contacts: ArrayList) + + fun showContactThumbnailsChanged(showThumbnails: Boolean) } 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 cf8cc42e..d03775f7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Group.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Group.kt @@ -2,4 +2,6 @@ package com.simplemobiletools.contacts.models data class Group(var id: Long, var title: String, var contactsCount: Int = 0) { fun addContact() = contactsCount++ + + fun getBubbleText() = title } diff --git a/app/src/main/res/layout/activity_edit_contact.xml b/app/src/main/res/layout/activity_edit_contact.xml index 66cbe244..f7a2fa11 100644 --- a/app/src/main/res/layout/activity_edit_contact.xml +++ b/app/src/main/res/layout/activity_edit_contact.xml @@ -333,7 +333,7 @@ android:layout_toRightOf="@+id/contact_name_image" android:orientation="vertical"> - + diff --git a/app/src/main/res/layout/fragment_groups.xml b/app/src/main/res/layout/fragment_groups.xml index 02751c10..771bc148 100644 --- a/app/src/main/res/layout/fragment_groups.xml +++ b/app/src/main/res/layout/fragment_groups.xml @@ -1,8 +1,44 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_add_favorite_with_number.xml b/app/src/main/res/layout/item_add_favorite_with_number.xml index 7747f757..c8544807 100644 --- a/app/src/main/res/layout/item_add_favorite_with_number.xml +++ b/app/src/main/res/layout/item_add_favorite_with_number.xml @@ -19,6 +19,7 @@ android:id="@+id/contact_tmb" android:layout_width="@dimen/normal_icon_size" android:layout_height="@dimen/normal_icon_size" + android:layout_centerVertical="true" android:padding="@dimen/medium_margin" android:src="@drawable/ic_person"/> diff --git a/app/src/main/res/layout/item_add_favorite_without_number.xml b/app/src/main/res/layout/item_add_favorite_without_number.xml index 30569bad..a9ecb39d 100644 --- a/app/src/main/res/layout/item_add_favorite_without_number.xml +++ b/app/src/main/res/layout/item_add_favorite_without_number.xml @@ -19,6 +19,7 @@ android:id="@+id/contact_tmb" android:layout_width="@dimen/normal_icon_size" android:layout_height="@dimen/normal_icon_size" + android:layout_centerVertical="true" android:padding="@dimen/medium_margin" android:src="@drawable/ic_person"/> diff --git a/app/src/main/res/layout/item_edit_group.xml b/app/src/main/res/layout/item_edit_group.xml new file mode 100644 index 00000000..5a5620e1 --- /dev/null +++ b/app/src/main/res/layout/item_edit_group.xml @@ -0,0 +1,41 @@ + + + + + + + + diff --git a/app/src/main/res/layout/item_group.xml b/app/src/main/res/layout/item_group.xml index 5a5620e1..d8106772 100644 --- a/app/src/main/res/layout/item_group.xml +++ b/app/src/main/res/layout/item_group.xml @@ -1,41 +1,39 @@ - + android:layout_height="wrap_content" + android:background="?attr/selectableItemBackground" + android:clickable="true" + android:focusable="true" + android:foreground="@drawable/selector"> - + android:paddingRight="@dimen/activity_margin"> - + - + + + + diff --git a/app/src/main/res/menu/cab_groups.xml b/app/src/main/res/menu/cab_groups.xml new file mode 100644 index 00000000..49c496c7 --- /dev/null +++ b/app/src/main/res/menu/cab_groups.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 1943508d..fda11285 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -5,4 +5,6 @@ Added Address and Notes fields Allow storing contacts in a local database, hidden from other apps + %1$s (%2$s) + From 25b8babc17e641007ef438b76b9a1100bef9e788 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Mar 2018 17:18:17 +0100 Subject: [PATCH 04/61] sort groups by title alphabetically --- .../simplemobiletools/contacts/fragments/GroupsFragment.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt index ea2f2731..fca777b7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt @@ -12,10 +12,13 @@ import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.interfaces.FragmentInterface import com.simplemobiletools.contacts.models.Contact +import com.simplemobiletools.contacts.models.Group import kotlinx.android.synthetic.main.fragment_groups.view.* class GroupsFragment(context: Context, attributeSet: AttributeSet) : CoordinatorLayout(context, attributeSet), FragmentInterface { var activity: MainActivity? = null + var lastContacts = ArrayList() + override fun setupFragment(activity: MainActivity) { if (this.activity == null) { this.activity = activity @@ -41,7 +44,8 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : Coordinator return } - val storedGroups = ContactsHelper(activity!!).getStoredGroups() + lastContacts = contacts + var storedGroups = ContactsHelper(activity!!).getStoredGroups() contacts.forEach { it.groups.forEach { val group = it @@ -50,6 +54,7 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : Coordinator } } + storedGroups = storedGroups.sortedWith(compareBy { it.title }).toList() as ArrayList val currAdapter = groups_list.adapter if (currAdapter == null) { GroupsAdapter(activity as SimpleActivity, storedGroups, groups_list, groups_fastscroller) { From 6e77d3cd516dccfde2724914ce1397a272d812a3 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Mar 2018 17:18:38 +0100 Subject: [PATCH 05/61] allow creating new contact groups by pressing the FAB --- .../simplemobiletools/contacts/fragments/GroupsFragment.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt index fca777b7..d897a8c6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt @@ -8,6 +8,7 @@ import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.contacts.activities.MainActivity import com.simplemobiletools.contacts.activities.SimpleActivity import com.simplemobiletools.contacts.adapters.GroupsAdapter +import com.simplemobiletools.contacts.dialogs.CreateNewGroupDialog import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.interfaces.FragmentInterface @@ -23,7 +24,9 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : Coordinator if (this.activity == null) { this.activity = activity groups_fab.setOnClickListener { - + CreateNewGroupDialog(activity) { + refreshContacts(lastContacts) + } } updateViewStuff() From e33fe588c275157d3ab421943c3a09d1687aebbe Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Mar 2018 19:22:59 +0100 Subject: [PATCH 06/61] add a couple more functions in FragmentInterface --- .../contacts/activities/MainActivity.kt | 43 ++++++++++--------- .../contacts/fragments/GroupsFragment.kt | 15 ++++++- .../contacts/fragments/MyViewPagerFragment.kt | 10 ++--- .../contacts/interfaces/FragmentInterface.kt | 10 +++++ 4 files changed, 52 insertions(+), 26 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt index dc0f6dbe..a677e002 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt @@ -26,9 +26,9 @@ import com.simplemobiletools.contacts.dialogs.ImportContactsDialog import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.dbHelper import com.simplemobiletools.contacts.extensions.getTempFile -import com.simplemobiletools.contacts.fragments.MyViewPagerFragment import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.helpers.VcfExporter +import com.simplemobiletools.contacts.interfaces.FragmentInterface import com.simplemobiletools.contacts.interfaces.RefreshContactsListener import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.activity_main.* @@ -93,9 +93,9 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { val configShowContactThumbnails = config.showContactThumbnails if (storedShowContactThumbnails != configShowContactThumbnails) { - contacts_fragment?.showContactThumbnailsChanged(configShowContactThumbnails) - favorites_fragment?.showContactThumbnailsChanged(configShowContactThumbnails) - groups_fragment?.showContactThumbnailsChanged(configShowContactThumbnails) + getAllFragments().forEach { + (it as? FragmentInterface)?.showContactThumbnailsChanged(configShowContactThumbnails) + } } val configTextColor = config.textColor @@ -103,9 +103,9 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { getInactiveTabIndexes(viewpager.currentItem).forEach { main_tabs_holder.getTabAt(it)?.icon?.applyColorFilter(configTextColor) } - contacts_fragment?.textColorChanged(configTextColor) - favorites_fragment?.textColorChanged(configTextColor) - groups_fragment?.textColorChanged(configTextColor) + getAllFragments().forEach { + (it as? FragmentInterface)?.textColorChanged(configTextColor) + } } val configBackgroundColor = config.backgroundColor @@ -117,9 +117,9 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { if (storedPrimaryColor != configPrimaryColor) { main_tabs_holder.setSelectedTabIndicatorColor(getAdjustedPrimaryColor()) main_tabs_holder.getTabAt(viewpager.currentItem)?.icon?.applyColorFilter(getAdjustedPrimaryColor()) - contacts_fragment?.primaryColorChanged(configPrimaryColor) - favorites_fragment?.primaryColorChanged(configPrimaryColor) - groups_fragment?.primaryColorChanged(configPrimaryColor) + getAllFragments().forEach { + (it as? FragmentInterface)?.primaryColorChanged(configPrimaryColor) + } } val configStartNameWithSurname = config.startNameWithSurname @@ -133,9 +133,9 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { initFragments() } - contacts_fragment?.onActivityResume() - favorites_fragment?.onActivityResume() - groups_fragment?.onActivityResume() + getAllFragments().forEach { + (it as? FragmentInterface)?.onActivityResume() + } refreshContacts(true, true) } @@ -197,7 +197,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { override fun onQueryTextChange(newText: String): Boolean { if (isSearchOpen) { - (getCurrentFragment() as? MyViewPagerFragment)?.onSearchQueryChanged(newText) + getCurrentFragment()?.onSearchQueryChanged(newText) } return true } @@ -206,20 +206,20 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { MenuItemCompat.setOnActionExpandListener(searchMenuItem, object : MenuItemCompat.OnActionExpandListener { override fun onMenuItemActionExpand(item: MenuItem?): Boolean { - (getCurrentFragment() as? MyViewPagerFragment)?.onSearchOpened() + getCurrentFragment()?.onSearchOpened() isSearchOpen = true return true } override fun onMenuItemActionCollapse(item: MenuItem?): Boolean { - (getCurrentFragment() as? MyViewPagerFragment)?.onSearchClosed() + getCurrentFragment()?.onSearchClosed() isSearchOpen = false return true } }) } - private fun getCurrentFragment() = when (viewpager.currentItem) { + private fun getCurrentFragment(): FragmentInterface? = when (viewpager.currentItem) { 0 -> contacts_fragment 1 -> favorites_fragment else -> groups_fragment @@ -275,7 +275,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { if (isSearchOpen) { - (getCurrentFragment() as? MyViewPagerFragment)?.onSearchQueryChanged("") + getCurrentFragment()?.onSearchQueryChanged("") searchMenuItem?.collapseActionView() } } @@ -285,8 +285,9 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { override fun onPageSelected(position: Int) { main_tabs_holder.getTabAt(position)?.select() - contacts_fragment?.finishActMode() - favorites_fragment?.finishActMode() + getAllFragments().forEach { + (it as? FragmentInterface)?.finishActMode() + } invalidateOptionsMenu() } }) @@ -425,6 +426,8 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } } + private fun getAllFragments() = arrayListOf(contacts_fragment, favorites_fragment, groups_fragment) + override fun refreshFavorites() { refreshContacts(false, true) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt index d897a8c6..2f50bb54 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt @@ -88,10 +88,23 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : Coordinator } } - fun onActivityResume() { + override fun onActivityResume() { updateViewStuff() } + override fun finishActMode() { + (groups_list.adapter as? GroupsAdapter)?.finishActMode() + } + + override fun onSearchQueryChanged(text: String) { + } + + override fun onSearchOpened() { + } + + override fun onSearchClosed() { + } + private fun updateViewStuff() { context.updateTextColors(groups_wrapper.parent as ViewGroup) groups_fastscroller.updateBubbleColors() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt index 1eefc054..a5aeeed9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt @@ -149,15 +149,15 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } } - fun onActivityResume() { + override fun onActivityResume() { updateViewStuff() } - fun finishActMode() { + override fun finishActMode() { (fragment_list.adapter as? ContactsAdapter)?.finishActMode() } - fun onSearchQueryChanged(text: String) { + override fun onSearchQueryChanged(text: String) { (fragment_list.adapter as? ContactsAdapter)?.apply { val filtered = contactsIgnoringSearch.filter { it.getFullName(startNameWithSurname).contains(text, true) || @@ -180,11 +180,11 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } } - fun onSearchOpened() { + override fun onSearchOpened() { contactsIgnoringSearch = (fragment_list?.adapter as? ContactsAdapter)?.contactItems ?: ArrayList() } - fun onSearchClosed() { + override fun onSearchClosed() { (fragment_list.adapter as? ContactsAdapter)?.updateItems(contactsIgnoringSearch) if (this is FavoritesFragment) { fragment_placeholder.text = activity?.getString(R.string.no_favorites) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/FragmentInterface.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/FragmentInterface.kt index 801c22af..fb785c7a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/FragmentInterface.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/FragmentInterface.kt @@ -6,6 +6,8 @@ import com.simplemobiletools.contacts.models.Contact interface FragmentInterface { fun setupFragment(activity: MainActivity) + fun onActivityResume() + fun textColorChanged(color: Int) fun primaryColorChanged(color: Int) @@ -13,4 +15,12 @@ interface FragmentInterface { fun refreshContacts(contacts: ArrayList) fun showContactThumbnailsChanged(showThumbnails: Boolean) + + fun finishActMode() + + fun onSearchQueryChanged(text: String) + + fun onSearchOpened() + + fun onSearchClosed() } From 39810e46dc8529a320be3d7da6182fac54f60d1a Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Mar 2018 20:34:41 +0100 Subject: [PATCH 07/61] avoid removing contacts from Favorites at modifying groups --- .../contacts/helpers/ContactsHelper.kt | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) 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 249138e9..e1559373 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -11,6 +11,7 @@ import android.provider.ContactsContract import android.provider.ContactsContract.CommonDataKinds import android.provider.ContactsContract.CommonDataKinds.Note import android.provider.MediaStore +import android.text.TextUtils import android.util.SparseArray import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.extensions.* @@ -665,11 +666,15 @@ class ContactsHelper(val activity: BaseSimpleActivity) { } // delete groups - ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI).apply { - val selection = "${ContactsContract.Data.RAW_CONTACT_ID} = ? AND ${ContactsContract.Data.MIMETYPE} = ? " - val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE) - withSelection(selection, selectionArgs) - operations.add(build()) + val relevantGroupIDs = getStoredGroups().map { it.id } + if (relevantGroupIDs.isNotEmpty()) { + val IDsString = TextUtils.join(",", relevantGroupIDs) + ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI).apply { + val selection = "${ContactsContract.Data.RAW_CONTACT_ID} = ? AND ${ContactsContract.Data.MIMETYPE} = ? AND ${ContactsContract.Data.DATA1} IN (?)" + val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE, IDsString) + withSelection(selection, selectionArgs) + operations.add(build()) + } } // add groups From 20f9e7ea4d0869e2f1b229e1f5a2a5521a383805 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Mar 2018 20:42:11 +0100 Subject: [PATCH 08/61] implement contact group deleting --- .../contacts/adapters/GroupsAdapter.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt index 0293962e..8aec0cb0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt @@ -12,6 +12,7 @@ import com.simplemobiletools.commons.views.MyRecyclerView 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.item_group.view.* import java.util.* @@ -85,6 +86,15 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, recy if (selectedPositions.isEmpty()) { return } + + val groupsToRemove = ArrayList() + selectedPositions.sortedDescending().forEach { + val group = groups[it] + groupsToRemove.add(group) + ContactsHelper(activity).deleteGroup(group.id) + } + groups.removeAll(groupsToRemove) + removeSelectedItems() } private fun setupView(view: View, group: Group) { From 45c0edc177d8b79a2abe84ceaad8d40bf13ffa4e Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Mar 2018 21:39:10 +0100 Subject: [PATCH 09/61] get a list of contacts belonging to the clicked group --- .../contacts/fragments/GroupsFragment.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt index 2f50bb54..746bebad 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt @@ -38,8 +38,10 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : Coordinator } override fun primaryColorChanged(color: Int) { - groups_fastscroller.updatePrimaryColor() - groups_fastscroller.updateBubblePrimaryColor() + groups_fastscroller.apply { + updatePrimaryColor() + updateBubblePrimaryColor() + } } override fun refreshContacts(contacts: ArrayList) { @@ -61,7 +63,8 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : Coordinator val currAdapter = groups_list.adapter if (currAdapter == null) { GroupsAdapter(activity as SimpleActivity, storedGroups, groups_list, groups_fastscroller) { - + val group = it as Group + val groupContacts = contacts.filter { it.groups.map { it.id }.contains(group.id) } }.apply { setupDragListener(true) addVerticalDividers(true) From 2ce2b38ee17fd96a9fcf1ab8537a71a329d0668d Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Mar 2018 22:06:48 +0100 Subject: [PATCH 10/61] lets create a new activity for displaying group contacts --- app/src/main/AndroidManifest.xml | 4 ++ .../activities/GroupContactsActivity.kt | 19 ++++++++ .../contacts/fragments/GroupsFragment.kt | 13 ++++-- .../contacts/helpers/Constants.kt | 1 + .../contacts/models/Group.kt | 8 +++- .../res/layout/activity_group_contacts.xml | 44 +++++++++++++++++++ 6 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt create mode 100644 app/src/main/res/layout/activity_group_contacts.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c3692df2..cdb40add 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -74,6 +74,10 @@ android:label="@string/settings" android:parentActivityName=".activities.MainActivity"/> + + () + private var activity: MainActivity? = null + private var lastContacts = ArrayList() override fun setupFragment(activity: MainActivity) { if (this.activity == null) { @@ -63,8 +66,10 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : Coordinator val currAdapter = groups_list.adapter if (currAdapter == null) { GroupsAdapter(activity as SimpleActivity, storedGroups, groups_list, groups_fastscroller) { - val group = it as Group - val groupContacts = contacts.filter { it.groups.map { it.id }.contains(group.id) } + Intent(activity, GroupContactsActivity::class.java).apply { + putExtra(GROUP, it as Group) + activity!!.startActivity(this) + } }.apply { setupDragListener(true) addVerticalDividers(true) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt index 6f104a57..aa6133ab 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -13,6 +13,7 @@ const val ON_CONTACT_CLICK = "on_contact_click" 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" // contact photo changes const val PHOTO_ADDED = 1 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 d03775f7..12b7ba27 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Group.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Group.kt @@ -1,6 +1,12 @@ package com.simplemobiletools.contacts.models -data class Group(var id: Long, var title: String, var contactsCount: Int = 0) { +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 + } + fun addContact() = contactsCount++ fun getBubbleText() = title diff --git a/app/src/main/res/layout/activity_group_contacts.xml b/app/src/main/res/layout/activity_group_contacts.xml new file mode 100644 index 00000000..e5403216 --- /dev/null +++ b/app/src/main/res/layout/activity_group_contacts.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + From f4767421a825e0328397b5237944a3a8f2e68c21 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Mar 2018 22:22:23 +0100 Subject: [PATCH 11/61] list proper contacts at the GroupContacts activity --- .../activities/GroupContactsActivity.kt | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt index c8d536e7..f277f98f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt @@ -1,9 +1,16 @@ package com.simplemobiletools.contacts.activities import android.os.Bundle +import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.contacts.R -import com.simplemobiletools.contacts.helpers.GROUP +import com.simplemobiletools.contacts.adapters.ContactsAdapter +import com.simplemobiletools.contacts.extensions.config +import com.simplemobiletools.contacts.extensions.editContact +import com.simplemobiletools.contacts.extensions.tryStartCall +import com.simplemobiletools.contacts.extensions.viewContact +import com.simplemobiletools.contacts.helpers.* +import com.simplemobiletools.contacts.models.Contact import com.simplemobiletools.contacts.models.Group import kotlinx.android.synthetic.main.activity_group_contacts.* @@ -15,5 +22,37 @@ class GroupContactsActivity : SimpleActivity() { val group = intent.extras.getSerializable(GROUP) as Group supportActionBar?.title = group.title + + ContactsHelper(this).getContacts { + val contacts = it.filter { it.groups.map { it.id }.contains(group.id) } as ArrayList + updateContacts(contacts) + } + } + + private fun updateContacts(contacts: ArrayList) { + ContactsAdapter(this, contacts, null, false, group_contacts_list, group_contacts_fastscroller) { + when (config.onContactClick) { + ON_CLICK_CALL_CONTACT -> { + val contact = it as Contact + if (contact.phoneNumbers.isNotEmpty()) { + tryStartCall(it) + } else { + toast(R.string.no_phone_number_found) + } + } + ON_CLICK_VIEW_CONTACT -> viewContact(it as Contact) + ON_CLICK_EDIT_CONTACT -> editContact(it as Contact) + } + }.apply { + setupDragListener(true) + addVerticalDividers(true) + group_contacts_list.adapter = this + } + + group_contacts_fastscroller.setScrollTo(0) + group_contacts_fastscroller.setViews(group_contacts_list) { + val item = (group_contacts_list.adapter as ContactsAdapter).contactItems.getOrNull(it) + group_contacts_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") + } } } From 3c413347d6c7c17b93e4f548ce62f5e00a18b824 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Mar 2018 23:40:33 +0100 Subject: [PATCH 12/61] make ContactsAdapter more dynamic, use it at Group Contacts --- .../activities/GroupContactsActivity.kt | 5 ++- .../contacts/adapters/ContactsAdapter.kt | 42 ++++++++++++------- .../contacts/fragments/MyViewPagerFragment.kt | 8 ++-- .../contacts/helpers/Constants.kt | 4 ++ app/src/main/res/values-de/strings.xml | 7 +++- app/src/main/res/values-fr/strings.xml | 7 +++- app/src/main/res/values-ko-rKR/strings.xml | 7 +++- app/src/main/res/values-lt/strings.xml | 7 +++- app/src/main/res/values-pt/strings.xml | 7 +++- app/src/main/res/values-ru/strings.xml | 7 +++- app/src/main/res/values-sk/strings.xml | 7 +++- app/src/main/res/values-sv/strings.xml | 7 +++- app/src/main/res/values-zh-rTW/strings.xml | 7 +++- app/src/main/res/values/strings.xml | 7 +++- 14 files changed, 87 insertions(+), 42 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt index f277f98f..c3e0d09d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt @@ -30,7 +30,10 @@ class GroupContactsActivity : SimpleActivity() { } private fun updateContacts(contacts: ArrayList) { - ContactsAdapter(this, contacts, null, false, group_contacts_list, group_contacts_fastscroller) { + Contact.sorting = config.sorting + contacts.sort() + + ContactsAdapter(this, contacts, null, LOCATION_GROUP_CONTACTS, group_contacts_list, group_contacts_fastscroller) { when (config.onContactClick) { ON_CLICK_CALL_CONTACT -> { val contact = it as Contact diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index a58898c6..e6df0637 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -22,13 +22,16 @@ import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.editContact import com.simplemobiletools.contacts.extensions.shareContacts import com.simplemobiletools.contacts.helpers.ContactsHelper +import com.simplemobiletools.contacts.helpers.LOCATION_CONTACTS_TAB +import com.simplemobiletools.contacts.helpers.LOCATION_FAVORITES_TAB +import com.simplemobiletools.contacts.helpers.LOCATION_GROUP_CONTACTS import com.simplemobiletools.contacts.interfaces.RefreshContactsListener import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.item_contact_with_number.view.* import java.util.* class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList, private val listener: RefreshContactsListener?, - private val isFavoritesFragment: Boolean, recyclerView: MyRecyclerView, fastScroller: FastScroller, itemClick: (Any) -> Unit) : + private val location: Int, recyclerView: MyRecyclerView, fastScroller: FastScroller, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { private lateinit var contactDrawable: Drawable @@ -52,10 +55,13 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList selectAll() R.id.cab_add_to_favorites -> addToFavorites() R.id.cab_share -> shareContacts() - R.id.cab_remove -> removeFavorites() + R.id.cab_remove -> removeContacts() R.id.cab_delete -> askConfirmDelete() } } @@ -138,19 +144,23 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList() + private fun removeContacts() { + val contactsToRemove = ArrayList() selectedPositions.sortedDescending().forEach { - favoritesToRemove.add(contactItems[it]) + contactsToRemove.add(contactItems[it]) } - contactItems.removeAll(favoritesToRemove) + contactItems.removeAll(contactsToRemove) + + if (location == LOCATION_FAVORITES_TAB) { + ContactsHelper(activity).removeFavorites(contactsToRemove) + if (contactItems.isEmpty()) { + listener?.refreshFavorites() + finishActMode() + } else { + removeSelectedItems() + } + } else if (location == LOCATION_GROUP_CONTACTS) { - ContactsHelper(activity).removeFavorites(favoritesToRemove) - if (contactItems.isEmpty()) { - listener?.refreshFavorites() - finishActMode() - } else { - removeSelectedItems() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt index a5aeeed9..d4f12cd3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt @@ -15,10 +15,7 @@ import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.editContact import com.simplemobiletools.contacts.extensions.tryStartCall import com.simplemobiletools.contacts.extensions.viewContact -import com.simplemobiletools.contacts.helpers.Config -import com.simplemobiletools.contacts.helpers.ON_CLICK_CALL_CONTACT -import com.simplemobiletools.contacts.helpers.ON_CLICK_EDIT_CONTACT -import com.simplemobiletools.contacts.helpers.ON_CLICK_VIEW_CONTACT +import com.simplemobiletools.contacts.helpers.* import com.simplemobiletools.contacts.interfaces.FragmentInterface import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.fragment_layout.view.* @@ -108,7 +105,8 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) val currAdapter = fragment_list.adapter if (currAdapter == null || forceListRedraw) { forceListRedraw = false - ContactsAdapter(activity as SimpleActivity, contacts, activity, this is FavoritesFragment, fragment_list, fragment_fastscroller) { + val location = if (this is FavoritesFragment) LOCATION_FAVORITES_TAB else LOCATION_CONTACTS_TAB + ContactsAdapter(activity as SimpleActivity, contacts, activity, location, fragment_list, fragment_fastscroller) { when (config.onContactClick) { ON_CLICK_CALL_CONTACT -> { val contact = it as Contact diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt index aa6133ab..08dfbc4f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -15,6 +15,10 @@ const val SMT_PRIVATE = "smt_private" // used at the contact source of local c const val IS_PRIVATE = "is_private" const val GROUP = "group" +const val LOCATION_CONTACTS_TAB = 1 +const val LOCATION_FAVORITES_TAB = 2 +const val LOCATION_GROUP_CONTACTS = 3 + // contact photo changes const val PHOTO_ADDED = 1 const val PHOTO_REMOVED = 2 diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index bda8c04a..08cd4952 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -6,8 +6,6 @@ Aktualisiere… Gerätespeicher Gerätespeicher (nicht sichtbar für andere Apps) - No groups - Create a new group Neuer Kontakt Kontakt bearbeiten @@ -17,6 +15,11 @@ Zweiter Vorname Familienname + + No groups + Create a new group + Remove from group + Foto machen Foto auswählen diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b6e38037..635f9997 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -6,8 +6,6 @@ Mise à jour… Stockage du téléphone Stockage du téléphone (non visible par d\'autres applis) - No groups - Create a new group Nouveau contact Modifier contact @@ -17,6 +15,11 @@ Nom Surnom + + No groups + Create a new group + Remove from group + Prendre une photo Choisir une photo diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 612be50b..3ea4c0a0 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -6,8 +6,6 @@ 수정중… Phone storage Phone storage (not visible by other apps) - No groups - Create a new group 새로운 연락처 연락처 수정 @@ -17,6 +15,11 @@ 중간 이름 + + No groups + Create a new group + Remove from group + 사진 촬영 사진 선택 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 19c04488..13117b75 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -6,8 +6,6 @@ Atnaujinama… Telefono atmintis Telefono atmintis (nematoma kitų programėlių) - Nėra grupių - Sukurti naują grupę Naujas kontaktas Redaguoti kontaktą @@ -17,6 +15,11 @@ Antras vardas Pavardė + + Nėra grupių + Sukurti naują grupę + Remove from group + Nufotografuoti Pasirinkti nuotrauką diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 2d19395b..d8a5081c 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -6,8 +6,6 @@ A atualizar… Armazenamento do telefone Armazenamento do telefone (não visível por outras alicações) - No groups - Create a new group Novo contacto Editar contacto @@ -17,6 +15,11 @@ Segundo nome Apelido + + No groups + Create a new group + Remove from group + Tirar foto Escolher foto diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index eb32ad3d..7bba539b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -6,8 +6,6 @@ Обновление… Память устройства Память устройства (не видна другим приложениям) - Нет групп - Создать новую группу Новый контакт Редактировать контакт @@ -17,6 +15,11 @@ Отчество Фамилия + + Нет групп + Создать новую группу + Remove from group + Снять фото Выбрать фото diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 648c6524..3132bc11 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -6,8 +6,6 @@ Upravuje sa… Úložisko mobilu Úložisko mobilu (neviditeľné pre ostatné apky) - Žiadne skupiny - Vytvoriť novú skupinu Nový kontakt Upraviť kontakt @@ -17,6 +15,11 @@ Stredné meno Priezvisko + + Žiadne skupiny + Vytvoriť novú skupinu + Odstrániť zo skupiny + Vytvoriť foto Zvoliť foto diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 3fddf676..f63ad6a9 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -6,8 +6,6 @@ Uppdaterar… Telefonens lagringsutrymme Telefonens lagringsutrymme (inte synligt för andra appar) - No groups - Create a new group Ny kontakt Redigera kontakt @@ -17,6 +15,11 @@ Mellannamn Efternamn + + No groups + Create a new group + Remove from group + Ta foto Välj foto diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 5d0c8b3c..ae382cac 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -6,8 +6,6 @@ 更新中… 手機空間 手機空間 (其他程式不可見) - 沒有群組 - Create a new group 新聯絡人 編輯聯絡人 @@ -17,6 +15,11 @@ 中間名 姓氏 + + 沒有群組 + Create a new group + Remove from group + 拍照 選擇相片 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a941a193..ad65b889 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,8 +6,6 @@ Updating… Phone storage Phone storage (not visible by other apps) - No groups - Create a new group New contact Edit contact @@ -17,6 +15,11 @@ Middle name Surname + + No groups + Create a new group + Remove from group + Take photo Choose photo From e60fa65eef34e7fb089be917706735cce9c74603 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 10:02:07 +0100 Subject: [PATCH 13/61] handle Favorite items modification in FavoritesFragment itself --- ...FavoritesDialog.kt => SelectContactsDialog.kt} | 15 ++++----------- .../contacts/fragments/FavoritesFragment.kt | 13 +++++++++++-- 2 files changed, 15 insertions(+), 13 deletions(-) rename app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/{AddFavoritesDialog.kt => SelectContactsDialog.kt} (82%) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/AddFavoritesDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectContactsDialog.kt similarity index 82% rename from app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/AddFavoritesDialog.kt rename to app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectContactsDialog.kt index 9463beee..f8e9687d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/AddFavoritesDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectContactsDialog.kt @@ -11,7 +11,7 @@ import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.layout_select_contact.view.* -class AddFavoritesDialog(val activity: SimpleActivity, private val callback: () -> Unit) { +class SelectContactsDialog(val activity: SimpleActivity, private val callback: (displayedContacts: ArrayList, selectedContacts: HashSet) -> Unit) { private var view = activity.layoutInflater.inflate(R.layout.layout_select_contact, null) private val config = activity.config private var allContacts = ArrayList() @@ -45,23 +45,16 @@ class AddFavoritesDialog(val activity: SimpleActivity, private val callback: () .setPositiveButton(R.string.ok, { dialog, which -> dialogConfirmed() }) .setNegativeButton(R.string.cancel, null) .create().apply { - activity.setupDialogStuff(view, this) - } + activity.setupDialogStuff(view, this) + } } private fun dialogConfirmed() { Thread { - val contactsHelper = ContactsHelper(activity) val allDisplayedContacts = ArrayList() allContacts.mapTo(allDisplayedContacts, { it }) val selectedContacts = (view?.select_contact_list?.adapter as? SelectContactsAdapter)?.getSelectedItemsSet() ?: LinkedHashSet() - val contactsToAdd = selectedContacts.map { it } as ArrayList - contactsHelper.addFavorites(contactsToAdd) - - allDisplayedContacts.removeAll(selectedContacts) - contactsHelper.removeFavorites(allDisplayedContacts) - - callback() + callback(allDisplayedContacts, selectedContacts) }.start() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt index 104eaa41..741bf30e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt @@ -2,7 +2,10 @@ package com.simplemobiletools.contacts.fragments import android.content.Context import android.util.AttributeSet -import com.simplemobiletools.contacts.dialogs.AddFavoritesDialog +import com.simplemobiletools.contacts.activities.SimpleActivity +import com.simplemobiletools.contacts.dialogs.SelectContactsDialog +import com.simplemobiletools.contacts.helpers.ContactsHelper +import com.simplemobiletools.contacts.models.Contact class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { override fun fabClicked() { @@ -15,7 +18,13 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa } private fun showAddFavoritesDialog() { - AddFavoritesDialog(activity!!) { + SelectContactsDialog(activity!!) { displayedContacts, selectedContacts -> + val contactsHelper = ContactsHelper(activity as SimpleActivity) + val contactsToAdd = selectedContacts.map { it } as ArrayList + contactsHelper.addFavorites(contactsToAdd) + + displayedContacts.removeAll(selectedContacts) + contactsHelper.removeFavorites(displayedContacts) activity!!.refreshContacts(false, true) } } From ce917560dae0939de886d81cc0cc770850aec42f Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 10:34:46 +0100 Subject: [PATCH 14/61] clean up SelectContactsDialog --- .../activities/GroupContactsActivity.kt | 14 ++++++++++- .../adapters/SelectContactsAdapter.kt | 4 +-- .../contacts/dialogs/SelectContactsDialog.kt | 25 ++++++++++--------- .../contacts/fragments/FavoritesFragment.kt | 12 ++++----- 4 files changed, 33 insertions(+), 22 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt index c3e0d09d..3f345a05 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt @@ -5,6 +5,7 @@ import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.adapters.ContactsAdapter +import com.simplemobiletools.contacts.dialogs.SelectContactsDialog import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.editContact import com.simplemobiletools.contacts.extensions.tryStartCall @@ -15,14 +16,25 @@ import com.simplemobiletools.contacts.models.Group import kotlinx.android.synthetic.main.activity_group_contacts.* class GroupContactsActivity : SimpleActivity() { + lateinit var group: Group + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_group_contacts) updateTextColors(group_contacts_coordinator) - val group = intent.extras.getSerializable(GROUP) as Group + group = intent.extras.getSerializable(GROUP) as Group supportActionBar?.title = group.title + refreshContacts() + group_contacts_fab.setOnClickListener { + SelectContactsDialog(this) { displayedContacts, selectedContacts -> + refreshContacts() + } + } + } + + private fun refreshContacts() { ContactsHelper(this).getContacts { val contacts = it.filter { it.groups.map { it.id }.contains(group.id) } as ArrayList updateContacts(contacts) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/SelectContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/SelectContactsAdapter.kt index b2bc35cb..4e118f24 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/SelectContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/SelectContactsAdapter.kt @@ -23,7 +23,7 @@ import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.item_add_favorite_with_number.view.* import java.util.* -class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List, private val selectedContacts: ArrayList, private val allowPickMultiple: Boolean, +class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List, private val selectedContacts: ArrayList, private val allowPickMultiple: Boolean, private val itemClick: ((Contact) -> Unit)? = null) : RecyclerView.Adapter() { private val itemViews = SparseArray() private val selectedPositions = HashSet() @@ -39,7 +39,7 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List - if (selectedContacts.contains(contact.id.toString())) { + if (selectedContacts.map { it.id }.contains(contact.id)) { selectedPositions.add(index) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectContactsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectContactsDialog.kt index f8e9687d..8d4d0a6d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectContactsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectContactsDialog.kt @@ -11,28 +11,27 @@ import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.layout_select_contact.view.* -class SelectContactsDialog(val activity: SimpleActivity, private val callback: (displayedContacts: ArrayList, selectedContacts: HashSet) -> Unit) { +class SelectContactsDialog(val activity: SimpleActivity, private val callback: (addedContacts: ArrayList, removedContacts: ArrayList) -> Unit) { private var view = activity.layoutInflater.inflate(R.layout.layout_select_contact, null) - private val config = activity.config - private var allContacts = ArrayList() + private var initiallySelectedContacts = ArrayList() init { ContactsHelper(activity).getContacts { - allContacts = it + var allContacts = it - val contactSources = config.displayContactSources + val contactSources = activity.config.displayContactSources if (!activity.config.showAllContacts()) { allContacts = allContacts.filter { contactSources.contains(it.source) } as ArrayList } - val favorites = allContacts.filter { it.starred == 1 }.map { it.id.toString() } as ArrayList + initiallySelectedContacts = allContacts.filter { it.starred == 1 } as ArrayList - Contact.sorting = config.sorting + Contact.sorting = activity.config.sorting allContacts.sort() activity.runOnUiThread { view.apply { - select_contact_list.adapter = SelectContactsAdapter(activity, allContacts, favorites, true) + select_contact_list.adapter = SelectContactsAdapter(activity, allContacts, initiallySelectedContacts, true) select_contact_fastscroller.allowBubbleDisplay = activity.baseConfig.showInfoBubble select_contact_fastscroller.setViews(select_contact_list) { select_contact_fastscroller.updateBubbleText(allContacts[it].getBubbleText()) @@ -51,10 +50,12 @@ class SelectContactsDialog(val activity: SimpleActivity, private val callback: ( private fun dialogConfirmed() { Thread { - val allDisplayedContacts = ArrayList() - allContacts.mapTo(allDisplayedContacts, { it }) - val selectedContacts = (view?.select_contact_list?.adapter as? SelectContactsAdapter)?.getSelectedItemsSet() ?: LinkedHashSet() - callback(allDisplayedContacts, selectedContacts) + val adapter = view?.select_contact_list?.adapter as? SelectContactsAdapter + val selectedContacts = adapter?.getSelectedItemsSet()?.toList() ?: ArrayList() + + val newlySelectedContacts = selectedContacts.filter { !initiallySelectedContacts.contains(it) } as ArrayList + val unselectedContacts = initiallySelectedContacts.filter { !selectedContacts.contains(it) } as ArrayList + callback(newlySelectedContacts, unselectedContacts) }.start() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt index 741bf30e..705eba44 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt @@ -5,7 +5,6 @@ import android.util.AttributeSet import com.simplemobiletools.contacts.activities.SimpleActivity import com.simplemobiletools.contacts.dialogs.SelectContactsDialog import com.simplemobiletools.contacts.helpers.ContactsHelper -import com.simplemobiletools.contacts.models.Contact class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { override fun fabClicked() { @@ -18,13 +17,12 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa } private fun showAddFavoritesDialog() { - SelectContactsDialog(activity!!) { displayedContacts, selectedContacts -> - val contactsHelper = ContactsHelper(activity as SimpleActivity) - val contactsToAdd = selectedContacts.map { it } as ArrayList - contactsHelper.addFavorites(contactsToAdd) + SelectContactsDialog(activity!!) { addedContacts, removedContacts -> + ContactsHelper(activity as SimpleActivity).apply { + addFavorites(addedContacts) + removeFavorites(removedContacts) + } - displayedContacts.removeAll(selectedContacts) - contactsHelper.removeFavorites(displayedContacts) activity!!.refreshContacts(false, true) } } From 5e585eec719ea7469ba09e4f3fdf55df788b3234 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 10:54:35 +0100 Subject: [PATCH 15/61] provide contacts to show at SelectContactsDialog explicitly --- .../activities/GroupContactsActivity.kt | 16 ++++++---- .../contacts/dialogs/SelectContactsDialog.kt | 29 ++++++++++--------- .../contacts/fragments/FavoritesFragment.kt | 2 +- .../contacts/fragments/MyViewPagerFragment.kt | 9 ++++-- 4 files changed, 32 insertions(+), 24 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt index 3f345a05..d3fca91a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt @@ -16,6 +16,8 @@ import com.simplemobiletools.contacts.models.Group import kotlinx.android.synthetic.main.activity_group_contacts.* class GroupContactsActivity : SimpleActivity() { + private var allContacts = ArrayList() + private var groupContacts = ArrayList() lateinit var group: Group override fun onCreate(savedInstanceState: Bundle?) { @@ -28,7 +30,7 @@ class GroupContactsActivity : SimpleActivity() { refreshContacts() group_contacts_fab.setOnClickListener { - SelectContactsDialog(this) { displayedContacts, selectedContacts -> + SelectContactsDialog(this, allContacts, groupContacts) { addedContacts, removedContacts -> refreshContacts() } } @@ -36,15 +38,17 @@ class GroupContactsActivity : SimpleActivity() { private fun refreshContacts() { ContactsHelper(this).getContacts { - val contacts = it.filter { it.groups.map { it.id }.contains(group.id) } as ArrayList - updateContacts(contacts) + allContacts = it + groupContacts = it.filter { it.groups.map { it.id }.contains(group.id) } as ArrayList + + Contact.sorting = config.sorting + groupContacts.sort() + + updateContacts(groupContacts) } } private fun updateContacts(contacts: ArrayList) { - Contact.sorting = config.sorting - contacts.sort() - ContactsAdapter(this, contacts, null, LOCATION_GROUP_CONTACTS, group_contacts_list, group_contacts_fastscroller) { when (config.onContactClick) { ON_CLICK_CALL_CONTACT -> { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectContactsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectContactsDialog.kt index 8d4d0a6d..7f5e259d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectContactsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectContactsDialog.kt @@ -7,35 +7,36 @@ import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.activities.SimpleActivity import com.simplemobiletools.contacts.adapters.SelectContactsAdapter import com.simplemobiletools.contacts.extensions.config -import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.layout_select_contact.view.* -class SelectContactsDialog(val activity: SimpleActivity, private val callback: (addedContacts: ArrayList, removedContacts: ArrayList) -> Unit) { +class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayList, val selectContacts: ArrayList? = null, + val callback: (addedContacts: ArrayList, removedContacts: ArrayList) -> Unit) { private var view = activity.layoutInflater.inflate(R.layout.layout_select_contact, null) private var initiallySelectedContacts = ArrayList() init { - ContactsHelper(activity).getContacts { - var allContacts = it - + var allContacts = initialContacts + if (selectContacts == null) { val contactSources = activity.config.displayContactSources if (!activity.config.showAllContacts()) { allContacts = allContacts.filter { contactSources.contains(it.source) } as ArrayList } initiallySelectedContacts = allContacts.filter { it.starred == 1 } as ArrayList + } else { + initiallySelectedContacts = selectContacts + } - Contact.sorting = activity.config.sorting - allContacts.sort() + Contact.sorting = activity.config.sorting + allContacts.sort() - activity.runOnUiThread { - view.apply { - select_contact_list.adapter = SelectContactsAdapter(activity, allContacts, initiallySelectedContacts, true) - select_contact_fastscroller.allowBubbleDisplay = activity.baseConfig.showInfoBubble - select_contact_fastscroller.setViews(select_contact_list) { - select_contact_fastscroller.updateBubbleText(allContacts[it].getBubbleText()) - } + activity.runOnUiThread { + view.apply { + select_contact_list.adapter = SelectContactsAdapter(activity, allContacts, initiallySelectedContacts, true) + select_contact_fastscroller.allowBubbleDisplay = activity.baseConfig.showInfoBubble + select_contact_fastscroller.setViews(select_contact_list) { + select_contact_fastscroller.updateBubbleText(allContacts[it].getBubbleText()) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt index 705eba44..edafe57d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt @@ -17,7 +17,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa } private fun showAddFavoritesDialog() { - SelectContactsDialog(activity!!) { addedContacts, removedContacts -> + SelectContactsDialog(activity!!, allContacts) { addedContacts, removedContacts -> ContactsHelper(activity as SimpleActivity).apply { addFavorites(addedContacts) removeFavorites(removedContacts) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt index d4f12cd3..add7d3c0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt @@ -22,6 +22,8 @@ import kotlinx.android.synthetic.main.fragment_layout.view.* abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) : CoordinatorLayout(context, attributeSet), FragmentInterface { protected var activity: MainActivity? = null + protected var allContacts = ArrayList() + private var lastHashCode = 0 private var contactsIgnoringSearch = ArrayList() private lateinit var config: Config @@ -75,6 +77,10 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) config.lastUsedContactSource = grouped?.key ?: "" } + Contact.sorting = config.sorting + contacts.sort() + allContacts = contacts + val filtered = if (this is FavoritesFragment) { contacts.filter { it.starred == 1 } as ArrayList } else { @@ -86,9 +92,6 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } } - Contact.sorting = config.sorting - filtered.sort() - if (filtered.hashCode() != lastHashCode) { lastHashCode = filtered.hashCode() activity?.runOnUiThread { From 911cd997038760b56efc07328d95bf93809530ea Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 11:16:48 +0100 Subject: [PATCH 16/61] handle batch adding contacts to a group --- .../contacts/activities/GroupContactsActivity.kt | 3 +++ .../contacts/helpers/ContactsHelper.kt | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt index d3fca91a..0182f77d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt @@ -31,6 +31,9 @@ class GroupContactsActivity : SimpleActivity() { refreshContacts() group_contacts_fab.setOnClickListener { SelectContactsDialog(this, allContacts, groupContacts) { addedContacts, removedContacts -> + ContactsHelper(this).apply { + addContactsToGroup(addedContacts, group.id) + } refreshContacts() } } 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 e1559373..0503f562 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -747,6 +747,19 @@ class ContactsHelper(val activity: BaseSimpleActivity) { return operations } + fun addContactsToGroup(contacts: ArrayList, groupId: Long) { + val operations = ArrayList() + contacts.forEach { + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { + withValue(ContactsContract.Data.RAW_CONTACT_ID, it.id) + withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.GroupMembership.GROUP_ROW_ID, groupId) + operations.add(build()) + } + } + activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + } + fun insertContact(contact: Contact): Boolean { return if (contact.source == SMT_PRIVATE) { insertLocalContact(contact) From 4fca6ce711e4a7551f9b2131e0995f9dc0641898 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 12:22:40 +0100 Subject: [PATCH 17/61] handle batch removing contacts from groups --- .../contacts/activities/GroupContactsActivity.kt | 1 + .../contacts/helpers/ContactsHelper.kt | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt index 0182f77d..9a3dd388 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt @@ -33,6 +33,7 @@ class GroupContactsActivity : SimpleActivity() { SelectContactsDialog(this, allContacts, groupContacts) { addedContacts, removedContacts -> ContactsHelper(this).apply { addContactsToGroup(addedContacts, group.id) + removeContactsFromGroup(removedContacts, group.id) } refreshContacts() } 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 0503f562..8a86c144 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -760,6 +760,19 @@ class ContactsHelper(val activity: BaseSimpleActivity) { activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) } + fun removeContactsFromGroup(contacts: ArrayList, groupId: Long) { + val operations = ArrayList() + contacts.forEach { + ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI).apply { + val selection = "${ContactsContract.Data.RAW_CONTACT_ID} = ? AND ${ContactsContract.Data.MIMETYPE} = ? AND ${ContactsContract.Data.DATA1} = ?" + val selectionArgs = arrayOf(it.id.toString(), CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE, groupId.toString()) + withSelection(selection, selectionArgs) + operations.add(build()) + } + } + activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + } + fun insertContact(contact: Contact): Boolean { return if (contact.source == SMT_PRIVATE) { insertLocalContact(contact) From 67cf029e918a0240c16cf5f40f78e0e1b9315f38 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 14:24:14 +0100 Subject: [PATCH 18/61] tweak deleting contacts from groups a bit --- .../contacts/activities/EditContactActivity.kt | 2 +- .../com/simplemobiletools/contacts/helpers/ContactsHelper.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) 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 9729b28d..b88e05db 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -27,9 +27,9 @@ import com.simplemobiletools.contacts.models.* import kotlinx.android.synthetic.main.activity_edit_contact.* import kotlinx.android.synthetic.main.item_edit_address.view.* import kotlinx.android.synthetic.main.item_edit_email.view.* +import kotlinx.android.synthetic.main.item_edit_group.view.* import kotlinx.android.synthetic.main.item_edit_phone_number.view.* import kotlinx.android.synthetic.main.item_event.view.* -import kotlinx.android.synthetic.main.item_edit_group.view.* import org.joda.time.DateTime import org.joda.time.format.DateTimeFormat import java.util.* 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 8a86c144..8b9d93fe 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -670,8 +670,8 @@ class ContactsHelper(val activity: BaseSimpleActivity) { if (relevantGroupIDs.isNotEmpty()) { val IDsString = TextUtils.join(",", relevantGroupIDs) ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI).apply { - val selection = "${ContactsContract.Data.RAW_CONTACT_ID} = ? AND ${ContactsContract.Data.MIMETYPE} = ? AND ${ContactsContract.Data.DATA1} IN (?)" - val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE, IDsString) + val selection = "${ContactsContract.Data.RAW_CONTACT_ID} = ? AND ${ContactsContract.Data.MIMETYPE} = ? AND ${ContactsContract.Data.DATA1} IN ($IDsString)" + val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE) withSelection(selection, selectionArgs) operations.add(build()) } From aed1147e9f688ef1a6ec18518cbc678329d66f28 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 14:50:52 +0100 Subject: [PATCH 19/61] use contact_id instead of raw_contact_id at deleting contacts from groups --- .../simplemobiletools/contacts/helpers/ContactsHelper.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 8b9d93fe..a652f17d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -670,8 +670,8 @@ class ContactsHelper(val activity: BaseSimpleActivity) { if (relevantGroupIDs.isNotEmpty()) { val IDsString = TextUtils.join(",", relevantGroupIDs) ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI).apply { - val selection = "${ContactsContract.Data.RAW_CONTACT_ID} = ? AND ${ContactsContract.Data.MIMETYPE} = ? AND ${ContactsContract.Data.DATA1} IN ($IDsString)" - val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE) + val selection = "${ContactsContract.Data.CONTACT_ID} = ? AND ${ContactsContract.Data.MIMETYPE} = ? AND ${ContactsContract.Data.DATA1} IN ($IDsString)" + val selectionArgs = arrayOf(contact.contactId.toString(), CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE) withSelection(selection, selectionArgs) operations.add(build()) } @@ -764,8 +764,8 @@ class ContactsHelper(val activity: BaseSimpleActivity) { val operations = ArrayList() contacts.forEach { ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI).apply { - val selection = "${ContactsContract.Data.RAW_CONTACT_ID} = ? AND ${ContactsContract.Data.MIMETYPE} = ? AND ${ContactsContract.Data.DATA1} = ?" - val selectionArgs = arrayOf(it.id.toString(), CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE, groupId.toString()) + val selection = "${ContactsContract.Data.CONTACT_ID} = ? AND ${ContactsContract.Data.MIMETYPE} = ? AND ${ContactsContract.Data.DATA1} = ?" + val selectionArgs = arrayOf(it.contactId.toString(), CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE, groupId.toString()) withSelection(selection, selectionArgs) operations.add(build()) } From 40f1fc82ddaaf4d21ab45be92f5a3b8789ce316b Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 14:55:33 +0100 Subject: [PATCH 20/61] use contact_id instead of raw_contact_id at contact deleting too --- .../com/simplemobiletools/contacts/helpers/ContactsHelper.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 a652f17d..ee1dc9b0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -1011,10 +1011,10 @@ class ContactsHelper(val activity: BaseSimpleActivity) { try { val contactIDs = HashSet() val operations = ArrayList() - val selection = "${ContactsContract.Data.RAW_CONTACT_ID} = ?" + val selection = "${ContactsContract.Data.CONTACT_ID} = ?" contacts.filter { it.source != SMT_PRIVATE }.forEach { ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI).apply { - val selectionArgs = arrayOf(it.id.toString()) + val selectionArgs = arrayOf(it.contactId.toString()) withSelection(selection, selectionArgs) operations.add(this.build()) } From 6d4f9912fd7e62aa1dcaf82bdf6b32261a01cd89 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 15:13:49 +0100 Subject: [PATCH 21/61] allow removing contacts from groups by long pressing them and selecting Remove --- .../activities/GroupContactsActivity.kt | 9 +++++++-- .../contacts/adapters/ContactsAdapter.kt | 17 ++++++++++------- .../contacts/fragments/MyViewPagerFragment.kt | 2 +- .../interfaces/RemoveFromGroupListener.kt | 7 +++++++ 4 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/RemoveFromGroupListener.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt index 9a3dd388..7b90e213 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt @@ -11,11 +11,12 @@ import com.simplemobiletools.contacts.extensions.editContact import com.simplemobiletools.contacts.extensions.tryStartCall import com.simplemobiletools.contacts.extensions.viewContact import com.simplemobiletools.contacts.helpers.* +import com.simplemobiletools.contacts.interfaces.RemoveFromGroupListener import com.simplemobiletools.contacts.models.Contact import com.simplemobiletools.contacts.models.Group import kotlinx.android.synthetic.main.activity_group_contacts.* -class GroupContactsActivity : SimpleActivity() { +class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener { private var allContacts = ArrayList() private var groupContacts = ArrayList() lateinit var group: Group @@ -53,7 +54,7 @@ class GroupContactsActivity : SimpleActivity() { } private fun updateContacts(contacts: ArrayList) { - ContactsAdapter(this, contacts, null, LOCATION_GROUP_CONTACTS, group_contacts_list, group_contacts_fastscroller) { + ContactsAdapter(this, contacts, null, LOCATION_GROUP_CONTACTS, this, group_contacts_list, group_contacts_fastscroller) { when (config.onContactClick) { ON_CLICK_CALL_CONTACT -> { val contact = it as Contact @@ -78,4 +79,8 @@ class GroupContactsActivity : SimpleActivity() { group_contacts_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") } } + + override fun removeFromGroup(contacts: ArrayList) { + ContactsHelper(this).removeContactsFromGroup(contacts, group.id) + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index e6df0637..23a5e7cf 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -26,12 +26,14 @@ import com.simplemobiletools.contacts.helpers.LOCATION_CONTACTS_TAB import com.simplemobiletools.contacts.helpers.LOCATION_FAVORITES_TAB import com.simplemobiletools.contacts.helpers.LOCATION_GROUP_CONTACTS import com.simplemobiletools.contacts.interfaces.RefreshContactsListener +import com.simplemobiletools.contacts.interfaces.RemoveFromGroupListener import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.item_contact_with_number.view.* import java.util.* -class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList, private val listener: RefreshContactsListener?, - private val location: Int, recyclerView: MyRecyclerView, fastScroller: FastScroller, itemClick: (Any) -> Unit) : +class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList, private val refreshListener: RefreshContactsListener?, + private val location: Int, private val removeListener: RemoveFromGroupListener?, recyclerView: MyRecyclerView, + fastScroller: FastScroller, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { private lateinit var contactDrawable: Drawable @@ -136,11 +138,11 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList() selectedPositions.forEach { newFavorites.add(contactItems[it]) } ContactsHelper(activity).addFavorites(newFavorites) - listener?.refreshFavorites() + refreshListener?.refreshFavorites() finishActMode() } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt index add7d3c0..83b61c8f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt @@ -109,7 +109,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) if (currAdapter == null || forceListRedraw) { forceListRedraw = false val location = if (this is FavoritesFragment) LOCATION_FAVORITES_TAB else LOCATION_CONTACTS_TAB - ContactsAdapter(activity as SimpleActivity, contacts, activity, location, fragment_list, fragment_fastscroller) { + ContactsAdapter(activity as SimpleActivity, contacts, activity, location, null, fragment_list, fragment_fastscroller) { when (config.onContactClick) { ON_CLICK_CALL_CONTACT -> { val contact = it as Contact diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/RemoveFromGroupListener.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/RemoveFromGroupListener.kt new file mode 100644 index 00000000..c435180a --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/RemoveFromGroupListener.kt @@ -0,0 +1,7 @@ +package com.simplemobiletools.contacts.interfaces + +import com.simplemobiletools.contacts.models.Contact + +interface RemoveFromGroupListener { + fun removeFromGroup(contacts: ArrayList) +} From c572a83bb1965761ec5cd24aa4a691fd10353f30 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 15:34:36 +0100 Subject: [PATCH 22/61] refresh GroupContactsActivity on resume --- .../activities/GroupContactsActivity.kt | 49 +++++++++++-------- .../contacts/adapters/ContactsAdapter.kt | 8 +-- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt index 7b90e213..3688e622 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt @@ -29,7 +29,6 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener { group = intent.extras.getSerializable(GROUP) as Group supportActionBar?.title = group.title - refreshContacts() group_contacts_fab.setOnClickListener { SelectContactsDialog(this, allContacts, groupContacts) { addedContacts, removedContacts -> ContactsHelper(this).apply { @@ -41,6 +40,11 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener { } } + override fun onResume() { + super.onResume() + refreshContacts() + } + private fun refreshContacts() { ContactsHelper(this).getContacts { allContacts = it @@ -54,29 +58,34 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener { } private fun updateContacts(contacts: ArrayList) { - ContactsAdapter(this, contacts, null, LOCATION_GROUP_CONTACTS, this, group_contacts_list, group_contacts_fastscroller) { - when (config.onContactClick) { - ON_CLICK_CALL_CONTACT -> { - val contact = it as Contact - if (contact.phoneNumbers.isNotEmpty()) { - tryStartCall(it) - } else { - toast(R.string.no_phone_number_found) + val currAdapter = group_contacts_list.adapter + if (currAdapter == null) { + ContactsAdapter(this, contacts, null, LOCATION_GROUP_CONTACTS, this, group_contacts_list, group_contacts_fastscroller) { + when (config.onContactClick) { + ON_CLICK_CALL_CONTACT -> { + val contact = it as Contact + if (contact.phoneNumbers.isNotEmpty()) { + tryStartCall(it) + } else { + toast(R.string.no_phone_number_found) + } } + ON_CLICK_VIEW_CONTACT -> viewContact(it as Contact) + ON_CLICK_EDIT_CONTACT -> editContact(it as Contact) } - ON_CLICK_VIEW_CONTACT -> viewContact(it as Contact) - ON_CLICK_EDIT_CONTACT -> editContact(it as Contact) + }.apply { + setupDragListener(true) + addVerticalDividers(true) + group_contacts_list.adapter = this } - }.apply { - setupDragListener(true) - addVerticalDividers(true) - group_contacts_list.adapter = this - } - group_contacts_fastscroller.setScrollTo(0) - group_contacts_fastscroller.setViews(group_contacts_list) { - val item = (group_contacts_list.adapter as ContactsAdapter).contactItems.getOrNull(it) - group_contacts_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") + group_contacts_fastscroller.setScrollTo(0) + group_contacts_fastscroller.setViews(group_contacts_list) { + val item = (group_contacts_list.adapter as ContactsAdapter).contactItems.getOrNull(it) + group_contacts_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") + } + } else { + (currAdapter as ContactsAdapter).updateItems(contacts) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index 23a5e7cf..d7e26b9b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -110,9 +110,11 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList) { - contactItems = newItems - notifyDataSetChanged() - finishActMode() + if (newItems.hashCode() != contactItems.hashCode()) { + contactItems = newItems + notifyDataSetChanged() + finishActMode() + } } private fun editContact() { From 0b3acdf5186111ff83e5309f85351b6c9d58f60e Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 16:28:20 +0100 Subject: [PATCH 23/61] show groups placeholder at Groups tab, if necessary --- .../contacts/fragments/GroupsFragment.kt | 17 +++++++++++- app/src/main/res/layout/fragment_groups.xml | 26 +++++++++++++++++++ app/src/main/res/values-de/strings.xml | 4 +++ app/src/main/res/values-fr/strings.xml | 4 +++ app/src/main/res/values-ko-rKR/strings.xml | 4 +++ app/src/main/res/values-lt/strings.xml | 4 +++ app/src/main/res/values-pt/strings.xml | 4 +++ app/src/main/res/values-ru/strings.xml | 4 +++ app/src/main/res/values-sk/strings.xml | 4 +++ app/src/main/res/values-sv/strings.xml | 4 +++ app/src/main/res/values-zh-rTW/strings.xml | 4 +++ app/src/main/res/values/strings.xml | 4 +++ 12 files changed, 82 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt index 338ff39e..1c4af541 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt @@ -5,6 +5,9 @@ import android.content.Intent import android.support.design.widget.CoordinatorLayout import android.util.AttributeSet import android.view.ViewGroup +import com.simplemobiletools.commons.extensions.beVisibleIf +import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor +import com.simplemobiletools.commons.extensions.underlineText import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.contacts.activities.GroupContactsActivity import com.simplemobiletools.contacts.activities.MainActivity @@ -32,6 +35,13 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : Coordinator } } + groups_placeholder_2.setOnClickListener { + CreateNewGroupDialog(activity) { + refreshContacts(lastContacts) + } + } + + groups_placeholder_2.underlineText() updateViewStuff() } } @@ -62,7 +72,11 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : Coordinator } } - storedGroups = storedGroups.sortedWith(compareBy { it.title }).toList() as ArrayList + groups_placeholder_2.beVisibleIf(storedGroups.isEmpty()) + groups_placeholder.beVisibleIf(storedGroups.isEmpty()) + groups_list.beVisibleIf(storedGroups.isNotEmpty()) + + storedGroups = storedGroups.sortedWith(compareBy { it.title }) as? ArrayList ?: ArrayList() val currAdapter = groups_list.adapter if (currAdapter == null) { GroupsAdapter(activity as SimpleActivity, storedGroups, groups_list, groups_fastscroller) { @@ -117,5 +131,6 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : Coordinator context.updateTextColors(groups_wrapper.parent as ViewGroup) groups_fastscroller.updateBubbleColors() groups_fastscroller.allowBubbleDisplay = context.config.showInfoBubble + groups_placeholder_2.setTextColor(context.getAdjustedPrimaryColor()) } } diff --git a/app/src/main/res/layout/fragment_groups.xml b/app/src/main/res/layout/fragment_groups.xml index 771bc148..4d7ca134 100644 --- a/app/src/main/res/layout/fragment_groups.xml +++ b/app/src/main/res/layout/fragment_groups.xml @@ -11,6 +11,32 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> + + + + No groups Create a new group Remove from group + This group is empty + Add contacts + There are no contact groups on the device + Create group Foto machen diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 635f9997..f05f65c3 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -19,6 +19,10 @@ No groups Create a new group Remove from group + This group is empty + Add contacts + There are no contact groups on the device + Create group Prendre une photo diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 3ea4c0a0..dd42e2ff 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -19,6 +19,10 @@ No groups Create a new group Remove from group + This group is empty + Add contacts + There are no contact groups on the device + Create group 사진 촬영 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 13117b75..2252cd62 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -19,6 +19,10 @@ Nėra grupių Sukurti naują grupę Remove from group + This group is empty + Add contacts + There are no contact groups on the device + Create group Nufotografuoti diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index d8a5081c..0fdbc998 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -19,6 +19,10 @@ No groups Create a new group Remove from group + This group is empty + Add contacts + There are no contact groups on the device + Create group Tirar foto diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 7bba539b..8da75776 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -19,6 +19,10 @@ Нет групп Создать новую группу Remove from group + This group is empty + Add contacts + There are no contact groups on the device + Create group Снять фото diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 3132bc11..df9be923 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -19,6 +19,10 @@ Žiadne skupiny Vytvoriť novú skupinu Odstrániť zo skupiny + Skupina je prázdna + Pridať kontakty + Nemáte v zariadení vytvorené žiadne skupiny kontaktov + Vytvoriť skupinu Vytvoriť foto diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index f63ad6a9..537bbce5 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -19,6 +19,10 @@ No groups Create a new group Remove from group + This group is empty + Add contacts + There are no contact groups on the device + Create group Ta foto diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index ae382cac..f9c10a88 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -19,6 +19,10 @@ 沒有群組 Create a new group Remove from group + This group is empty + Add contacts + There are no contact groups on the device + Create group 拍照 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ad65b889..960aa948 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -19,6 +19,10 @@ No groups Create a new group Remove from group + This group is empty + Add contacts + There are no contact groups on the device + Create group Take photo From 1e49b8e019439811855e95988ff468dffb44ceed Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 16:46:39 +0100 Subject: [PATCH 24/61] add a placeholder at GroupContacts activity too --- .../activities/GroupContactsActivity.kt | 47 ++++++++++++++----- .../contacts/fragments/GroupsFragment.kt | 17 ++++--- .../res/layout/activity_group_contacts.xml | 26 ++++++++++ 3 files changed, 72 insertions(+), 18 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt index 3688e622..3a616b62 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt @@ -1,8 +1,7 @@ package com.simplemobiletools.contacts.activities import android.os.Bundle -import com.simplemobiletools.commons.extensions.toast -import com.simplemobiletools.commons.extensions.updateTextColors +import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.adapters.ContactsAdapter import com.simplemobiletools.contacts.dialogs.SelectContactsDialog @@ -11,12 +10,13 @@ import com.simplemobiletools.contacts.extensions.editContact import com.simplemobiletools.contacts.extensions.tryStartCall import com.simplemobiletools.contacts.extensions.viewContact import com.simplemobiletools.contacts.helpers.* +import com.simplemobiletools.contacts.interfaces.RefreshContactsListener import com.simplemobiletools.contacts.interfaces.RemoveFromGroupListener import com.simplemobiletools.contacts.models.Contact import com.simplemobiletools.contacts.models.Group import kotlinx.android.synthetic.main.activity_group_contacts.* -class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener { +class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, RefreshContactsListener { private var allContacts = ArrayList() private var groupContacts = ArrayList() lateinit var group: Group @@ -30,14 +30,15 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener { supportActionBar?.title = group.title group_contacts_fab.setOnClickListener { - SelectContactsDialog(this, allContacts, groupContacts) { addedContacts, removedContacts -> - ContactsHelper(this).apply { - addContactsToGroup(addedContacts, group.id) - removeContactsFromGroup(removedContacts, group.id) - } - refreshContacts() - } + fabClicked() } + + group_contacts_placeholder_2.setOnClickListener { + fabClicked() + } + + group_contacts_placeholder_2.underlineText() + group_contacts_placeholder_2.setTextColor(getAdjustedPrimaryColor()) } override fun onResume() { @@ -45,10 +46,24 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener { refreshContacts() } + private fun fabClicked() { + SelectContactsDialog(this, allContacts, groupContacts) { addedContacts, removedContacts -> + ContactsHelper(this).apply { + addContactsToGroup(addedContacts, group.id) + removeContactsFromGroup(removedContacts, group.id) + } + refreshContacts() + } + } + private fun refreshContacts() { ContactsHelper(this).getContacts { 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_list.beVisibleIf(groupContacts.isNotEmpty()) Contact.sorting = config.sorting groupContacts.sort() @@ -60,7 +75,7 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener { private fun updateContacts(contacts: ArrayList) { val currAdapter = group_contacts_list.adapter if (currAdapter == null) { - ContactsAdapter(this, contacts, null, LOCATION_GROUP_CONTACTS, this, group_contacts_list, group_contacts_fastscroller) { + ContactsAdapter(this, contacts, this, LOCATION_GROUP_CONTACTS, this, group_contacts_list, group_contacts_fastscroller) { when (config.onContactClick) { ON_CLICK_CALL_CONTACT -> { val contact = it as Contact @@ -89,7 +104,17 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener { } } + override fun refreshContacts(refreshContactsTab: Boolean, refreshFavoritesTab: Boolean) { + refreshContacts() + } + + override fun refreshFavorites() { + } + override fun removeFromGroup(contacts: ArrayList) { ContactsHelper(this).removeContactsFromGroup(contacts, group.id) + if (groupContacts.size == 0) { + refreshContacts() + } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt index 1c4af541..c21b7547 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt @@ -30,15 +30,11 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : Coordinator if (this.activity == null) { this.activity = activity groups_fab.setOnClickListener { - CreateNewGroupDialog(activity) { - refreshContacts(lastContacts) - } + fabClicked() } groups_placeholder_2.setOnClickListener { - CreateNewGroupDialog(activity) { - refreshContacts(lastContacts) - } + fabClicked() } groups_placeholder_2.underlineText() @@ -46,6 +42,12 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : Coordinator } } + private fun fabClicked() { + CreateNewGroupDialog(activity as SimpleActivity) { + refreshContacts(lastContacts) + } + } + override fun textColorChanged(color: Int) { (groups_list.adapter as GroupsAdapter).updateTextColor(color) } @@ -72,11 +74,12 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : Coordinator } } + storedGroups = storedGroups.sortedWith(compareBy { it.title }).toList() as? ArrayList ?: ArrayList() + groups_placeholder_2.beVisibleIf(storedGroups.isEmpty()) groups_placeholder.beVisibleIf(storedGroups.isEmpty()) groups_list.beVisibleIf(storedGroups.isNotEmpty()) - storedGroups = storedGroups.sortedWith(compareBy { it.title }) as? ArrayList ?: ArrayList() val currAdapter = groups_list.adapter if (currAdapter == null) { GroupsAdapter(activity as SimpleActivity, storedGroups, groups_list, groups_fastscroller) { diff --git a/app/src/main/res/layout/activity_group_contacts.xml b/app/src/main/res/layout/activity_group_contacts.xml index e5403216..197db89c 100644 --- a/app/src/main/res/layout/activity_group_contacts.xml +++ b/app/src/main/res/layout/activity_group_contacts.xml @@ -11,6 +11,32 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> + + + + Date: Tue, 20 Mar 2018 17:30:13 +0100 Subject: [PATCH 25/61] make GroupsFragment inherit from MyViewPagerFragment too --- .../contacts/activities/MainActivity.kt | 13 +- .../contacts/adapters/ViewPagerAdapter.kt | 4 +- .../contacts/fragments/GroupsFragment.kt | 136 ++---------------- .../contacts/fragments/MyViewPagerFragment.kt | 114 ++++++++++++--- .../contacts/interfaces/FragmentInterface.kt | 26 ---- app/src/main/res/layout/fragment_groups.xml | 62 +------- 6 files changed, 111 insertions(+), 244 deletions(-) delete mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/FragmentInterface.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt index a677e002..63a6cbdb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt @@ -28,7 +28,6 @@ import com.simplemobiletools.contacts.extensions.dbHelper import com.simplemobiletools.contacts.extensions.getTempFile import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.helpers.VcfExporter -import com.simplemobiletools.contacts.interfaces.FragmentInterface import com.simplemobiletools.contacts.interfaces.RefreshContactsListener import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.activity_main.* @@ -94,7 +93,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { val configShowContactThumbnails = config.showContactThumbnails if (storedShowContactThumbnails != configShowContactThumbnails) { getAllFragments().forEach { - (it as? FragmentInterface)?.showContactThumbnailsChanged(configShowContactThumbnails) + it?.showContactThumbnailsChanged(configShowContactThumbnails) } } @@ -104,7 +103,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { main_tabs_holder.getTabAt(it)?.icon?.applyColorFilter(configTextColor) } getAllFragments().forEach { - (it as? FragmentInterface)?.textColorChanged(configTextColor) + it?.textColorChanged(configTextColor) } } @@ -118,7 +117,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { main_tabs_holder.setSelectedTabIndicatorColor(getAdjustedPrimaryColor()) main_tabs_holder.getTabAt(viewpager.currentItem)?.icon?.applyColorFilter(getAdjustedPrimaryColor()) getAllFragments().forEach { - (it as? FragmentInterface)?.primaryColorChanged(configPrimaryColor) + it?.primaryColorChanged(configPrimaryColor) } } @@ -134,7 +133,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } getAllFragments().forEach { - (it as? FragmentInterface)?.onActivityResume() + it?.onActivityResume() } refreshContacts(true, true) } @@ -219,7 +218,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { }) } - private fun getCurrentFragment(): FragmentInterface? = when (viewpager.currentItem) { + private fun getCurrentFragment() = when (viewpager.currentItem) { 0 -> contacts_fragment 1 -> favorites_fragment else -> groups_fragment @@ -286,7 +285,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { override fun onPageSelected(position: Int) { main_tabs_holder.getTabAt(position)?.select() getAllFragments().forEach { - (it as? FragmentInterface)?.finishActMode() + it?.finishActMode() } invalidateOptionsMenu() } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ViewPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ViewPagerAdapter.kt index 1adebd21..beb17f42 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ViewPagerAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ViewPagerAdapter.kt @@ -5,7 +5,7 @@ import android.view.View import android.view.ViewGroup import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.activities.MainActivity -import com.simplemobiletools.contacts.interfaces.FragmentInterface +import com.simplemobiletools.contacts.fragments.MyViewPagerFragment import com.simplemobiletools.contacts.models.Contact class ViewPagerAdapter(val activity: MainActivity, val contacts: ArrayList) : PagerAdapter() { @@ -14,7 +14,7 @@ class ViewPagerAdapter(val activity: MainActivity, val contacts: ArrayList() - - override fun setupFragment(activity: MainActivity) { - if (this.activity == null) { - this.activity = activity - groups_fab.setOnClickListener { - fabClicked() - } - - groups_placeholder_2.setOnClickListener { - fabClicked() - } - - groups_placeholder_2.underlineText() - updateViewStuff() - } +class GroupsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { + override fun fabClicked() { + finishActMode() + showNewGroupsDialog() } - private fun fabClicked() { + override fun placeholderClicked() { + showNewGroupsDialog() + } + + private fun showNewGroupsDialog() { CreateNewGroupDialog(activity as SimpleActivity) { - refreshContacts(lastContacts) + refreshContacts(allContacts) } } - - override fun textColorChanged(color: Int) { - (groups_list.adapter as GroupsAdapter).updateTextColor(color) - } - - override fun primaryColorChanged(color: Int) { - groups_fastscroller.apply { - updatePrimaryColor() - updateBubblePrimaryColor() - } - } - - override fun refreshContacts(contacts: ArrayList) { - if (activity == null) { - return - } - - lastContacts = contacts - 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.sortedWith(compareBy { it.title }).toList() as? ArrayList ?: ArrayList() - - groups_placeholder_2.beVisibleIf(storedGroups.isEmpty()) - groups_placeholder.beVisibleIf(storedGroups.isEmpty()) - groups_list.beVisibleIf(storedGroups.isNotEmpty()) - - val currAdapter = groups_list.adapter - if (currAdapter == null) { - GroupsAdapter(activity as SimpleActivity, storedGroups, groups_list, groups_fastscroller) { - Intent(activity, GroupContactsActivity::class.java).apply { - putExtra(GROUP, it as Group) - activity!!.startActivity(this) - } - }.apply { - setupDragListener(true) - addVerticalDividers(true) - groups_list.adapter = this - } - - groups_fastscroller.setScrollTo(0) - groups_fastscroller.setViews(groups_list) { - val item = (groups_list.adapter as GroupsAdapter).groups.getOrNull(it) - groups_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") - } - } else { - (currAdapter as GroupsAdapter).apply { - showContactThumbnails = activity.config.showContactThumbnails - updateItems(storedGroups) - } - } - } - - override fun showContactThumbnailsChanged(showThumbnails: Boolean) { - (groups_list.adapter as? GroupsAdapter)?.apply { - showContactThumbnails = showThumbnails - notifyDataSetChanged() - } - } - - override fun onActivityResume() { - updateViewStuff() - } - - override fun finishActMode() { - (groups_list.adapter as? GroupsAdapter)?.finishActMode() - } - - override fun onSearchQueryChanged(text: String) { - } - - override fun onSearchOpened() { - } - - override fun onSearchClosed() { - } - - private fun updateViewStuff() { - context.updateTextColors(groups_wrapper.parent as ViewGroup) - groups_fastscroller.updateBubbleColors() - groups_fastscroller.allowBubbleDisplay = context.config.showInfoBubble - groups_placeholder_2.setTextColor(context.getAdjustedPrimaryColor()) - } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt index 83b61c8f..12cf23ca 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt @@ -1,26 +1,30 @@ package com.simplemobiletools.contacts.fragments import android.content.Context +import android.content.Intent import android.support.design.widget.CoordinatorLayout import android.util.AttributeSet import android.view.ViewGroup +import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME import com.simplemobiletools.commons.helpers.SORT_BY_SURNAME import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.activities.GroupContactsActivity import com.simplemobiletools.contacts.activities.MainActivity import com.simplemobiletools.contacts.activities.SimpleActivity import com.simplemobiletools.contacts.adapters.ContactsAdapter +import com.simplemobiletools.contacts.adapters.GroupsAdapter import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.editContact import com.simplemobiletools.contacts.extensions.tryStartCall import com.simplemobiletools.contacts.extensions.viewContact import com.simplemobiletools.contacts.helpers.* -import com.simplemobiletools.contacts.interfaces.FragmentInterface import com.simplemobiletools.contacts.models.Contact +import com.simplemobiletools.contacts.models.Group import kotlinx.android.synthetic.main.fragment_layout.view.* -abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) : CoordinatorLayout(context, attributeSet), FragmentInterface { +abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) : CoordinatorLayout(context, attributeSet) { protected var activity: MainActivity? = null protected var allContacts = ArrayList() @@ -30,7 +34,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) var forceListRedraw = false - override fun setupFragment(activity: MainActivity) { + fun setupFragment(activity: MainActivity) { config = activity.config if (this.activity == null) { this.activity = activity @@ -48,30 +52,39 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) if (this is FavoritesFragment) { fragment_placeholder.text = activity.getString(R.string.no_favorites) fragment_placeholder_2.text = activity.getString(R.string.add_favorites) + } else if (this is GroupsFragment) { + fragment_placeholder.text = activity.getString(R.string.no_group_created) + fragment_placeholder_2.text = activity.getString(R.string.create_group) } } } - override fun textColorChanged(color: Int) { - (fragment_list.adapter as ContactsAdapter).apply { - updateTextColor(color) - initDrawables() + fun textColorChanged(color: Int) { + if (this is GroupsFragment) { + (fragment_list.adapter as GroupsAdapter).updateTextColor(color) + } else { + (fragment_list.adapter as ContactsAdapter).apply { + updateTextColor(color) + initDrawables() + } } } - override fun primaryColorChanged(color: Int) { + fun primaryColorChanged(color: Int) { fragment_fastscroller.updatePrimaryColor() fragment_fastscroller.updateBubblePrimaryColor() } fun startNameWithSurnameChanged(startNameWithSurname: Boolean) { - (fragment_list.adapter as ContactsAdapter).apply { - config.sorting = if (startNameWithSurname) SORT_BY_SURNAME else SORT_BY_FIRST_NAME - this@MyViewPagerFragment.activity!!.refreshContacts(true, true) + if (this !is GroupsFragment) { + (fragment_list.adapter as ContactsAdapter).apply { + config.sorting = if (startNameWithSurname) SORT_BY_SURNAME else SORT_BY_FIRST_NAME + this@MyViewPagerFragment.activity!!.refreshContacts(true, true) + } } } - override fun refreshContacts(contacts: ArrayList) { + fun refreshContacts(contacts: ArrayList) { if (config.lastUsedContactSource.isEmpty()) { val grouped = contacts.groupBy { it.source }.maxWith(compareBy { it.value.size }) config.lastUsedContactSource = grouped?.key ?: "" @@ -101,6 +114,56 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } private fun setupContacts(contacts: ArrayList) { + if (this is GroupsFragment) { + setupGroupsAdapter(contacts) + } else { + setupContactsFavoritesAdapter(contacts) + } + } + + 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.sortedWith(compareBy { it.title }).toList() as? ArrayList ?: 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, fragment_list, fragment_fastscroller) { + Intent(activity, GroupContactsActivity::class.java).apply { + putExtra(GROUP, it as Group) + activity!!.startActivity(this) + } + }.apply { + setupDragListener(true) + addVerticalDividers(true) + fragment_list.adapter = this + } + + fragment_fastscroller.setScrollTo(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) + } + } + } + + private fun setupContactsFavoritesAdapter(contacts: ArrayList) { fragment_placeholder_2.beVisibleIf(contacts.isEmpty()) fragment_placeholder.beVisibleIf(contacts.isEmpty()) fragment_list.beVisibleIf(contacts.isNotEmpty()) @@ -143,22 +206,29 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } } - override fun showContactThumbnailsChanged(showThumbnails: Boolean) { - (fragment_list.adapter as? ContactsAdapter)?.apply { - showContactThumbnails = showThumbnails - notifyDataSetChanged() + fun showContactThumbnailsChanged(showThumbnails: Boolean) { + if (this is GroupsFragment) { + (fragment_list.adapter as? GroupsAdapter)?.apply { + showContactThumbnails = showThumbnails + notifyDataSetChanged() + } + } else { + (fragment_list.adapter as? ContactsAdapter)?.apply { + showContactThumbnails = showThumbnails + notifyDataSetChanged() + } } } - override fun onActivityResume() { + fun onActivityResume() { updateViewStuff() } - override fun finishActMode() { - (fragment_list.adapter as? ContactsAdapter)?.finishActMode() + fun finishActMode() { + (fragment_list.adapter as? MyRecyclerViewAdapter)?.finishActMode() } - override fun onSearchQueryChanged(text: String) { + fun onSearchQueryChanged(text: String) { (fragment_list.adapter as? ContactsAdapter)?.apply { val filtered = contactsIgnoringSearch.filter { it.getFullName(startNameWithSurname).contains(text, true) || @@ -181,11 +251,11 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } } - override fun onSearchOpened() { + fun onSearchOpened() { contactsIgnoringSearch = (fragment_list?.adapter as? ContactsAdapter)?.contactItems ?: ArrayList() } - override fun onSearchClosed() { + fun onSearchClosed() { (fragment_list.adapter as? ContactsAdapter)?.updateItems(contactsIgnoringSearch) if (this is FavoritesFragment) { fragment_placeholder.text = activity?.getString(R.string.no_favorites) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/FragmentInterface.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/FragmentInterface.kt deleted file mode 100644 index fb785c7a..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/FragmentInterface.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.simplemobiletools.contacts.interfaces - -import com.simplemobiletools.contacts.activities.MainActivity -import com.simplemobiletools.contacts.models.Contact - -interface FragmentInterface { - fun setupFragment(activity: MainActivity) - - fun onActivityResume() - - fun textColorChanged(color: Int) - - fun primaryColorChanged(color: Int) - - fun refreshContacts(contacts: ArrayList) - - fun showContactThumbnailsChanged(showThumbnails: Boolean) - - fun finishActMode() - - fun onSearchQueryChanged(text: String) - - fun onSearchOpened() - - fun onSearchClosed() -} diff --git a/app/src/main/res/layout/fragment_groups.xml b/app/src/main/res/layout/fragment_groups.xml index 4d7ca134..75390472 100644 --- a/app/src/main/res/layout/fragment_groups.xml +++ b/app/src/main/res/layout/fragment_groups.xml @@ -1,70 +1,10 @@ - - - - - - - - - - - - - - - - + From 244955e33323a792999529d2bcf95b6cda1fee84 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 19:10:03 +0100 Subject: [PATCH 26/61] properly update Groups tab whenever necessary --- .../activities/GroupContactsActivity.kt | 5 +-- .../contacts/activities/MainActivity.kt | 32 ++++++++++--------- .../contacts/adapters/ContactsAdapter.kt | 13 +++----- .../contacts/adapters/GroupsAdapter.kt | 14 ++++++-- .../contacts/fragments/FavoritesFragment.kt | 3 +- .../contacts/fragments/GroupsFragment.kt | 3 +- .../contacts/fragments/MyViewPagerFragment.kt | 12 ++++--- .../contacts/helpers/Constants.kt | 5 +++ .../interfaces/RefreshContactsListener.kt | 4 +-- 9 files changed, 51 insertions(+), 40 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt index 3a616b62..a3295dc4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt @@ -104,13 +104,10 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh } } - override fun refreshContacts(refreshContactsTab: Boolean, refreshFavoritesTab: Boolean) { + override fun refreshContacts(refreshTabsMask: Int) { refreshContacts() } - override fun refreshFavorites() { - } - override fun removeFromGroup(contacts: ArrayList) { ContactsHelper(this).removeContactsFromGroup(contacts, group.id) if (groupContacts.size == 0) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt index 63a6cbdb..f68d8ac8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt @@ -26,8 +26,7 @@ import com.simplemobiletools.contacts.dialogs.ImportContactsDialog import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.dbHelper import com.simplemobiletools.contacts.extensions.getTempFile -import com.simplemobiletools.contacts.helpers.ContactsHelper -import com.simplemobiletools.contacts.helpers.VcfExporter +import com.simplemobiletools.contacts.helpers.* import com.simplemobiletools.contacts.interfaces.RefreshContactsListener import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.activity_main.* @@ -117,7 +116,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { main_tabs_holder.setSelectedTabIndicatorColor(getAdjustedPrimaryColor()) main_tabs_holder.getTabAt(viewpager.currentItem)?.icon?.applyColorFilter(getAdjustedPrimaryColor()) getAllFragments().forEach { - it?.primaryColorChanged(configPrimaryColor) + it?.primaryColorChanged() } } @@ -135,7 +134,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { getAllFragments().forEach { it?.onActivityResume() } - refreshContacts(true, true) + refreshContacts(ALL_TABS_MASK) } if (hasPermission(PERMISSION_WRITE_CONTACTS)) { @@ -269,7 +268,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { private fun getInactiveTabIndexes(activeIndex: Int) = arrayListOf(0, 1, 2).filter { it != activeIndex } private fun initFragments() { - refreshContacts(true, true) + refreshContacts(ALL_TABS_MASK) viewpager.offscreenPageLimit = 2 viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { @@ -308,14 +307,14 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { private fun showSortingDialog() { ChangeSortingDialog(this) { - refreshContacts(true, true) + refreshContacts(CONTACTS_TAB_MASK or FAVORITES_TAB_MASK) } } fun showFilterDialog() { FilterContactSourcesDialog(this) { contacts_fragment?.forceListRedraw = true - refreshContacts(true, false) + refreshContacts(CONTACTS_TAB_MASK) } } @@ -337,7 +336,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { ImportContactsDialog(this, path) { if (it) { runOnUiThread { - refreshContacts(true, true) + refreshContacts(ALL_TABS_MASK) } } } @@ -400,7 +399,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { BuildConfig.VERSION_NAME, faqItems) } - override fun refreshContacts(refreshContactsTab: Boolean, refreshFavoritesTab: Boolean) { + override fun refreshContacts(refreshTabsMask: Int) { if (isActivityDestroyed()) { return } @@ -415,22 +414,25 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { viewpager.currentItem = config.lastUsedViewPagerPage } - if (refreshContactsTab) { + if (refreshTabsMask and CONTACTS_TAB_MASK != 0) { contacts_fragment?.refreshContacts(it) } - if (refreshFavoritesTab) { + if (refreshTabsMask and FAVORITES_TAB_MASK != 0) { favorites_fragment?.refreshContacts(it) } + + if (refreshTabsMask and GROUPS_TAB_MASK != 0) { + if (refreshTabsMask == GROUPS_TAB_MASK) { + groups_fragment.skipHashComparing = true + } + groups_fragment?.refreshContacts(it) + } } } private fun getAllFragments() = arrayListOf(contacts_fragment, favorites_fragment, groups_fragment) - override fun refreshFavorites() { - refreshContacts(false, true) - } - private fun checkWhatsNewDialog() { arrayListOf().apply { add(Release(10, R.string.release_10)) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index d7e26b9b..f32d24fd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -21,10 +21,7 @@ import com.simplemobiletools.contacts.activities.SimpleActivity import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.editContact import com.simplemobiletools.contacts.extensions.shareContacts -import com.simplemobiletools.contacts.helpers.ContactsHelper -import com.simplemobiletools.contacts.helpers.LOCATION_CONTACTS_TAB -import com.simplemobiletools.contacts.helpers.LOCATION_FAVORITES_TAB -import com.simplemobiletools.contacts.helpers.LOCATION_GROUP_CONTACTS +import com.simplemobiletools.contacts.helpers.* import com.simplemobiletools.contacts.interfaces.RefreshContactsListener import com.simplemobiletools.contacts.interfaces.RemoveFromGroupListener import com.simplemobiletools.contacts.models.Contact @@ -140,11 +137,11 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList() selectedPositions.forEach { newFavorites.add(contactItems[it]) } ContactsHelper(activity).addFavorites(newFavorites) - refreshListener?.refreshFavorites() + refreshListener?.refreshContacts(FAVORITES_TAB_MASK) finishActMode() } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt index 8aec0cb0..d4fb8d63 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt @@ -13,12 +13,14 @@ 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.helpers.GROUPS_TAB_MASK +import com.simplemobiletools.contacts.interfaces.RefreshContactsListener import com.simplemobiletools.contacts.models.Group import kotlinx.android.synthetic.main.item_group.view.* import java.util.* -class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, recyclerView: MyRecyclerView, fastScroller: FastScroller, - itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { +class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val refreshListener: RefreshContactsListener?, recyclerView: MyRecyclerView, + fastScroller: FastScroller, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { private var config = activity.config private var smallPadding = activity.resources.getDimension(R.dimen.small_margin).toInt() @@ -94,7 +96,13 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, recy ContactsHelper(activity).deleteGroup(group.id) } groups.removeAll(groupsToRemove) - removeSelectedItems() + + if (groups.isEmpty()) { + refreshListener?.refreshContacts(GROUPS_TAB_MASK) + finishActMode() + } else { + removeSelectedItems() + } } private fun setupView(view: View, group: Group) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt index edafe57d..a34fba56 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt @@ -5,6 +5,7 @@ import android.util.AttributeSet import com.simplemobiletools.contacts.activities.SimpleActivity import com.simplemobiletools.contacts.dialogs.SelectContactsDialog import com.simplemobiletools.contacts.helpers.ContactsHelper +import com.simplemobiletools.contacts.helpers.FAVORITES_TAB_MASK class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { override fun fabClicked() { @@ -23,7 +24,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa removeFavorites(removedContacts) } - activity!!.refreshContacts(false, true) + activity!!.refreshContacts(FAVORITES_TAB_MASK) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt index 2145a1ae..7b40710a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt @@ -4,6 +4,7 @@ import android.content.Context import android.util.AttributeSet import com.simplemobiletools.contacts.activities.SimpleActivity import com.simplemobiletools.contacts.dialogs.CreateNewGroupDialog +import com.simplemobiletools.contacts.helpers.GROUPS_TAB_MASK class GroupsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { override fun fabClicked() { @@ -17,7 +18,7 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : MyViewPager private fun showNewGroupsDialog() { CreateNewGroupDialog(activity as SimpleActivity) { - refreshContacts(allContacts) + activity!!.refreshContacts(GROUPS_TAB_MASK) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt index 12cf23ca..a5fe3b28 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt @@ -32,6 +32,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) private var contactsIgnoringSearch = ArrayList() private lateinit var config: Config + var skipHashComparing = false var forceListRedraw = false fun setupFragment(activity: MainActivity) { @@ -70,7 +71,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } } - fun primaryColorChanged(color: Int) { + fun primaryColorChanged() { fragment_fastscroller.updatePrimaryColor() fragment_fastscroller.updateBubblePrimaryColor() } @@ -79,7 +80,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) if (this !is GroupsFragment) { (fragment_list.adapter as ContactsAdapter).apply { config.sorting = if (startNameWithSurname) SORT_BY_SURNAME else SORT_BY_FIRST_NAME - this@MyViewPagerFragment.activity!!.refreshContacts(true, true) + this@MyViewPagerFragment.activity!!.refreshContacts(CONTACTS_TAB_MASK or FAVORITES_TAB_MASK) } } } @@ -105,7 +106,8 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } } - if (filtered.hashCode() != lastHashCode) { + if (filtered.hashCode() != lastHashCode || skipHashComparing) { + skipHashComparing = false lastHashCode = filtered.hashCode() activity?.runOnUiThread { setupContacts(filtered) @@ -131,7 +133,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } } - storedGroups = storedGroups.sortedWith(compareBy { it.title }).toList() as? ArrayList ?: ArrayList() + storedGroups = storedGroups.sortedWith(compareBy { it.title }).toMutableList() as ArrayList fragment_placeholder_2.beVisibleIf(storedGroups.isEmpty()) fragment_placeholder.beVisibleIf(storedGroups.isEmpty()) @@ -139,7 +141,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) val currAdapter = fragment_list.adapter if (currAdapter == null) { - GroupsAdapter(activity as SimpleActivity, storedGroups, fragment_list, fragment_fastscroller) { + GroupsAdapter(activity as SimpleActivity, storedGroups, activity, fragment_list, fragment_fastscroller) { Intent(activity, GroupContactsActivity::class.java).apply { putExtra(GROUP, it as Group) activity!!.startActivity(this) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt index 08dfbc4f..0d460631 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -19,6 +19,11 @@ const val LOCATION_CONTACTS_TAB = 1 const val LOCATION_FAVORITES_TAB = 2 const val LOCATION_GROUP_CONTACTS = 3 +const val CONTACTS_TAB_MASK = 1 +const val FAVORITES_TAB_MASK = 2 +const val GROUPS_TAB_MASK = 4 +const val ALL_TABS_MASK = 7 + // contact photo changes const val PHOTO_ADDED = 1 const val PHOTO_REMOVED = 2 diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/RefreshContactsListener.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/RefreshContactsListener.kt index 7819aa1f..817e6074 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/RefreshContactsListener.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/RefreshContactsListener.kt @@ -1,7 +1,5 @@ package com.simplemobiletools.contacts.interfaces interface RefreshContactsListener { - fun refreshContacts(refreshContactsTab: Boolean, refreshFavoritesTab: Boolean) - - fun refreshFavorites() + fun refreshContacts(refreshTabsMask: Int) } From c93cc3bd850bcf237a514732a45f36982f7f978b Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 20:05:48 +0100 Subject: [PATCH 27/61] allow renaming groups after long pressing them --- .../contacts/adapters/GroupsAdapter.kt | 6 ++- .../contacts/dialogs/RenameGroupDialog.kt | 43 ++++++++++++++++++ .../contacts/helpers/ContactsHelper.kt | 44 +++++++++++++------ .../main/res/layout/dialog_rename_group.xml | 19 ++++++++ 4 files changed, 98 insertions(+), 14 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/RenameGroupDialog.kt create mode 100644 app/src/main/res/layout/dialog_rename_group.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt index d4fb8d63..e1e78718 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt @@ -11,6 +11,7 @@ import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.activities.SimpleActivity +import com.simplemobiletools.contacts.dialogs.RenameGroupDialog import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.helpers.GROUPS_TAB_MASK @@ -75,7 +76,10 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val } private fun editGroup() { - + RenameGroupDialog(activity, groups[selectedPositions.first()]) { + finishActMode() + refreshListener?.refreshContacts(GROUPS_TAB_MASK) + } } private fun askConfirmDelete() { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/RenameGroupDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/RenameGroupDialog.kt new file mode 100644 index 00000000..95c31224 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/RenameGroupDialog.kt @@ -0,0 +1,43 @@ +package com.simplemobiletools.contacts.dialogs + +import android.support.v7.app.AlertDialog +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.helpers.ContactsHelper +import com.simplemobiletools.contacts.models.Group +import kotlinx.android.synthetic.main.dialog_rename_group.view.* + +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_name.setText(group.title) + } + + AlertDialog.Builder(activity) + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this, R.string.rename) { + showKeyboard(view.rename_group_name) + getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + val newName = view.rename_group_name.value + if (newName.isEmpty()) { + activity.toast(R.string.empty_name) + return@setOnClickListener + } + + if (!newName.isAValidFilename()) { + activity.toast(R.string.invalid_name) + return@setOnClickListener + } + + ContactsHelper(activity).renameGroup(group, newName) + callback() + dismiss() + } + } + } + } +} 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 ee1dc9b0..3dbddfcb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -387,13 +387,13 @@ class ContactsHelper(val activity: BaseSimpleActivity) { } 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 operations = ArrayList() + ContentProviderOperation.newInsert(ContactsContract.Groups.CONTENT_URI).apply { + withValue(ContactsContract.Groups.TITLE, title) + operations.add(build()) + } + try { val results = activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) val rawId = ContentUris.parseId(results[0].uri) return Group(rawId, title) @@ -403,14 +403,32 @@ class ContactsHelper(val activity: BaseSimpleActivity) { return null } - fun deleteGroup(id: Long) { - try { - val operations = ArrayList() - val uri = ContentUris.withAppendedId(ContactsContract.Groups.CONTENT_URI, id).buildUpon() - .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true") - .build() + fun renameGroup(group: Group, newTitle: String) { + val operations = ArrayList() + ContentProviderOperation.newUpdate(ContactsContract.Groups.CONTENT_URI).apply { + val selection = "${ContactsContract.Groups._ID} = ?" + val selectionArgs = arrayOf(group.id.toString()) + withSelection(selection, selectionArgs) + withValue(ContactsContract.Groups.TITLE, newTitle) + operations.add(build()) + } - operations.add(ContentProviderOperation.newDelete(uri).build()) + try { + activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + } catch (e: Exception) { + activity.showErrorToast(e) + } + } + + fun deleteGroup(id: Long) { + val operations = ArrayList() + val uri = ContentUris.withAppendedId(ContactsContract.Groups.CONTENT_URI, id).buildUpon() + .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true") + .build() + + operations.add(ContentProviderOperation.newDelete(uri).build()) + + try { activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) } catch (e: Exception) { activity.showErrorToast(e) diff --git a/app/src/main/res/layout/dialog_rename_group.xml b/app/src/main/res/layout/dialog_rename_group.xml new file mode 100644 index 00000000..fb63ce42 --- /dev/null +++ b/app/src/main/res/layout/dialog_rename_group.xml @@ -0,0 +1,19 @@ + + + + + + From cd1a493ea807c0d43dcaeb4ac52f30b77b12606b Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 20:13:51 +0100 Subject: [PATCH 28/61] add a new menu item for adding selected contacts to a group --- .../contacts/adapters/ContactsAdapter.kt | 13 ++++++++++++- app/src/main/res/menu/cab.xml | 5 +++++ app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-ko-rKR/strings.xml | 1 + app/src/main/res/values-lt/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 1 + app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 12 files changed, 27 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index f32d24fd..8a808823 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -56,6 +56,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList editContact() R.id.cab_select_all -> selectAll() R.id.cab_add_to_favorites -> addToFavorites() + R.id.cab_add_to_group -> addToGroup() R.id.cab_share -> shareContacts() R.id.cab_remove -> removeContacts() R.id.cab_delete -> askConfirmDelete() @@ -168,12 +170,21 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList() - selectedPositions.forEach { newFavorites.add(contactItems[it]) } + selectedPositions.forEach { + newFavorites.add(contactItems[it]) + } ContactsHelper(activity).addFavorites(newFavorites) refreshListener?.refreshContacts(FAVORITES_TAB_MASK) finishActMode() } + private fun addToGroup() { + val selectedContacts = ArrayList() + selectedPositions.forEach { + selectedContacts.add(contactItems[it]) + } + } + private fun shareContacts() { val contactsIDs = ArrayList() selectedPositions.forEach { diff --git a/app/src/main/res/menu/cab.xml b/app/src/main/res/menu/cab.xml index c727d9bd..22dca426 100644 --- a/app/src/main/res/menu/cab.xml +++ b/app/src/main/res/menu/cab.xml @@ -16,6 +16,11 @@ android:icon="@drawable/ic_star_on" android:title="@string/add_to_favorites" app:showAsAction="ifRoom"/> + Add contacts There are no contact groups on the device Create group + Add to group Foto machen diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index f05f65c3..bdba1f9a 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -23,6 +23,7 @@ Add contacts There are no contact groups on the device Create group + Add to group Prendre une photo diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index dd42e2ff..e71dafc0 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -23,6 +23,7 @@ Add contacts There are no contact groups on the device Create group + Add to group 사진 촬영 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 2252cd62..25806d34 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -23,6 +23,7 @@ Add contacts There are no contact groups on the device Create group + Add to group Nufotografuoti diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 0fdbc998..bf7016d6 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -23,6 +23,7 @@ Add contacts There are no contact groups on the device Create group + Add to group Tirar foto diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 8da75776..66b189b9 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -23,6 +23,7 @@ Add contacts There are no contact groups on the device Create group + Add to group Снять фото diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index df9be923..85177e12 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -23,6 +23,7 @@ Pridať kontakty Nemáte v zariadení vytvorené žiadne skupiny kontaktov Vytvoriť skupinu + Pridať do skupiny Vytvoriť foto diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 537bbce5..74b3aadf 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -23,6 +23,7 @@ Add contacts There are no contact groups on the device Create group + Add to group Ta foto diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index f9c10a88..c98724d7 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -23,6 +23,7 @@ Add contacts There are no contact groups on the device Create group + Add to group 拍照 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 960aa948..8d9edd77 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -23,6 +23,7 @@ Add contacts There are no contact groups on the device Create group + Add to group Take photo From 7a914181de0d6357662f164191c185a4c1d1fc77 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 21:17:37 +0100 Subject: [PATCH 29/61] change the icon of "Add to group" --- app/src/main/res/drawable-hdpi/ic_group_add.png | Bin 0 -> 303 bytes app/src/main/res/drawable-xhdpi/ic_group_add.png | Bin 0 -> 384 bytes app/src/main/res/drawable-xxhdpi/ic_group_add.png | Bin 0 -> 564 bytes .../main/res/drawable-xxxhdpi/ic_group_add.png | Bin 0 -> 729 bytes app/src/main/res/menu/cab.xml | 2 +- 5 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_group_add.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_group_add.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_group_add.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_group_add.png diff --git a/app/src/main/res/drawable-hdpi/ic_group_add.png b/app/src/main/res/drawable-hdpi/ic_group_add.png new file mode 100644 index 0000000000000000000000000000000000000000..af01bae4b97c8bd08a335b8d3a422e6884d79198 GIT binary patch literal 303 zcmV+~0nq-5P)%rC8;GzZO2jgcjK5m^045XUY*1 z=GE5~67i1E0oUZXWL&XdU(Av6#wB|y;f2(pYK4M(orTNERTjAfR?S5tVdeX%k4g#9)Nu z6tDOUkIB3uAo|bk?){I$5EA@1JRT24YP1+8iK$W`keu=5c5VXlXNfj0&n(EY%qZR2 z1x4DVc_NhcTIq~}8XCK@ZYiB25L7`6jeA*FmCh&_qS2Fe*6n_&AV%X()-|Ow3aV)A z$hxg`M!__%q=}i5^+xGLkc}%_k~sT0b@ z3?BdtI3XM-DA6P@O-gcgfWR%KfUI0#;aslPo$fMQ(8WSmt_n`q%N7{X?!3S#m_WS1 e3%tM!a^weR3L$5R(Ms?D0000m7wSG01^9nX)CvxJw(*?~BY<2a7P5OXZEPKzcrVrGdl zca_hywbd6f_)W4#mbV;DZ4S`LvF1VN_=W~HnNIC)`U{$8i+T9<<1yET-POtF6?bJ41&->2O-Scv0C?MS`AT!Bg?#VP#i}1SMFoAzs|2?AIbe zMu-leS0K(j{htC(wwD^@J!o7-|gK||x!B}Xr<7QbUkceOSKPrSL& z^?Sg^%s$yGcWZ^LMDD+T^UnJ9p0E#g^ItzVj+dL0c-%81L82`YirCgJ@tB-iX&QMc zX3-ch;W&8;j_aMIYvXvtj{g;#55JIHrWd1USGBo^Mfw^Y!=zp`u2 zN3-aYomIb>z68!xYTtXeG|@kDL946EnTs!U$~mh~F)4fOe4o3##n!bkjLRc(*}=&B zLf=@J^nw~i0woHrse>d;0xMpv`OaD0#T2>7;O&~phvqFhU=(=5^7Y$8^Efl^I{7x; zv;Qmb{{L_OkEx3aZbi-)`6j{|rJ<18S(RQJeIr=JVq&BfMT!AfXjv52Po#Nc~r(#4DBO>3CESSO&XvdT&9dW)?sqq=9? z$;XqPGg>>xAFl7Hy2a!-Yv&0GW1Y2WZH9UibS~PQDBiT@hixh2+8GU;D_sA#pJDMi zz><}@e7@s61JAaGKUqvhKA&bd{>oe)Rxs7gYDIK@qh8Pw&J{PO2X@Iv&xB Date: Tue, 20 Mar 2018 21:27:23 +0100 Subject: [PATCH 30/61] allow batch adding contacts to groups --- .../contacts/adapters/ContactsAdapter.kt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index 8a808823..0862724d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -11,9 +11,11 @@ import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.signature.ObjectKey import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.dialogs.ConfirmationDialog +import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.extensions.beVisibleIf import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor import com.simplemobiletools.commons.extensions.isActivityDestroyed +import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.contacts.R @@ -183,6 +185,23 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList() + ContactsHelper(activity).getStoredGroups().forEach { + items.add(RadioItem(it.id.toInt(), it.title)) + } + items.add(RadioItem(NEW_GROUP_ID, activity.getString(R.string.create_new_group))) + + RadioGroupDialog(activity, items, 0) { + if (it as Int == NEW_GROUP_ID) { + + } else { + ContactsHelper(activity).addContactsToGroup(selectedContacts, it.toLong()) + refreshListener?.refreshContacts(GROUPS_TAB_MASK) + finishActMode() + } + } } private fun shareContacts() { From d583a457ffaad5a92ff47f06b085bfadef563927 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 21:30:31 +0100 Subject: [PATCH 31/61] allow creating a brand new group at selecting target group --- .../simplemobiletools/contacts/adapters/ContactsAdapter.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index 0862724d..aa551595 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -20,6 +20,7 @@ import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.activities.SimpleActivity +import com.simplemobiletools.contacts.dialogs.CreateNewGroupDialog import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.editContact import com.simplemobiletools.contacts.extensions.shareContacts @@ -195,7 +196,11 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList Date: Tue, 20 Mar 2018 23:27:24 +0100 Subject: [PATCH 32/61] do not apply the Contact Sources filter on GroupsFragment --- .../contacts/fragments/MyViewPagerFragment.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt index a5fe3b28..1adc2d25 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt @@ -95,7 +95,9 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) contacts.sort() allContacts = contacts - val filtered = if (this is FavoritesFragment) { + val filtered = if (this is GroupsFragment) { + contacts + } else if (this is FavoritesFragment) { contacts.filter { it.starred == 1 } as ArrayList } else { val contactSources = config.displayContactSources From 39921fc66dc86fe2fd492317757a2cfd6f051a9d Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 23:28:00 +0100 Subject: [PATCH 33/61] accept groups with null system_id in some cases --- .../contacts/helpers/ContactsHelper.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) 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 3dbddfcb..fd46cfb0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -361,10 +361,11 @@ class ContactsHelper(val activity: BaseSimpleActivity) { val uri = ContactsContract.Groups.CONTENT_URI val projection = arrayOf( ContactsContract.Groups._ID, - ContactsContract.Groups.TITLE + ContactsContract.Groups.TITLE, + ContactsContract.Groups.SYSTEM_ID ) - val selection = "${ContactsContract.Groups.AUTO_ADD} = ? AND ${ContactsContract.Groups.FAVORITES} = ? AND ${ContactsContract.Groups.SYSTEM_ID} IS NULL" + val selection = "${ContactsContract.Groups.AUTO_ADD} = ? AND ${ContactsContract.Groups.FAVORITES} = ?" val selectionArgs = arrayOf("0", "0") var cursor: Cursor? = null @@ -374,6 +375,12 @@ class ContactsHelper(val activity: BaseSimpleActivity) { do { val id = cursor.getLongValue(ContactsContract.Groups._ID) val title = cursor.getStringValue(ContactsContract.Groups.TITLE) + + val systemId = cursor.getStringValue(ContactsContract.Groups.SYSTEM_ID) + if (groups.map { it.title }.contains(title) && systemId != null) { + continue + } + groups.add(Group(id, title)) } while (cursor.moveToNext()) } From 7edb2de918c15f48a8ef44f31ff1fd0eb88e0a99 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Mar 2018 23:34:48 +0100 Subject: [PATCH 34/61] make sure newly created groups are visible in other apps too --- .../com/simplemobiletools/contacts/helpers/ContactsHelper.kt | 1 + 1 file changed, 1 insertion(+) 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 fd46cfb0..e41fabdb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -397,6 +397,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) { val operations = ArrayList() ContentProviderOperation.newInsert(ContactsContract.Groups.CONTENT_URI).apply { withValue(ContactsContract.Groups.TITLE, title) + withValue(ContactsContract.Groups.GROUP_VISIBLE, 1) operations.add(build()) } From 1dcfaa05e9217a183b824ca8c76c2d987572163c Mon Sep 17 00:00:00 2001 From: fricyo <30796677+fricyo@users.noreply.github.com> Date: Wed, 21 Mar 2018 16:23:35 +0800 Subject: [PATCH 35/61] Update Translation --- app/src/main/res/values-zh-rTW/strings.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index c98724d7..c05a2c9e 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -17,13 +17,13 @@ 沒有群組 - Create a new group - Remove from group - This group is empty - Add contacts - There are no contact groups on the device - Create group - Add to group + 建立一個新群組 + 從群組內移除 + 這群組是空白的 + 添加聯絡人 + 裝置內沒有聯絡人群組 + 建立群組 + 添加到群組 拍照 From ac058c4e7bb187d899f2104a95502a77f78f5431 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Mar 2018 10:41:09 +0100 Subject: [PATCH 36/61] allow selecting under which account should the contact group be created --- .../contacts/dialogs/CreateNewGroupDialog.kt | 31 ++++++++++++++++--- .../contacts/helpers/ContactsHelper.kt | 4 ++- app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-ko-rKR/strings.xml | 1 + app/src/main/res/values-lt/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 1 + app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 12 files changed, 40 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CreateNewGroupDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CreateNewGroupDialog.kt index 5897b671..8ab8b4d8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CreateNewGroupDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CreateNewGroupDialog.kt @@ -3,12 +3,16 @@ 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.dialogs.RadioGroupDialog 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.commons.models.RadioItem import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.helpers.ContactsHelper +import com.simplemobiletools.contacts.models.ContactSource import com.simplemobiletools.contacts.models.Group import kotlinx.android.synthetic.main.dialog_create_new_group.view.* @@ -29,11 +33,30 @@ class CreateNewGroupDialog(val activity: BaseSimpleActivity, val callback: (newG return@OnClickListener } - val newGroup = ContactsHelper(activity).createNewGroup(name) - if (newGroup != null) { - callback(newGroup) + val contactSources = ArrayList() + if (activity.config.localAccountName.isNotEmpty()) { + contactSources.add(ContactSource(activity.config.localAccountName, activity.config.localAccountType)) + } + + ContactsHelper(activity).getContactSources { + it.filter { it.type.contains("google", true) }.mapTo(contactSources, { ContactSource(it.name, it.type) }) + + val items = ArrayList() + contactSources.forEachIndexed { index, contactSource -> + items.add(RadioItem(index, contactSource.name)) + } + + activity.runOnUiThread { + RadioGroupDialog(activity, items, titleId = R.string.create_group_under_account) { + val contactSource = contactSources[it as Int] + val newGroup = ContactsHelper(activity).createNewGroup(name, contactSource.name, contactSource.type) + if (newGroup != null) { + callback(newGroup) + } + dismiss() + } + } } - dismiss() }) } } 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 e41fabdb..56bbd854 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -393,11 +393,13 @@ class ContactsHelper(val activity: BaseSimpleActivity) { return groups } - fun createNewGroup(title: String): Group? { + fun createNewGroup(title: String, accountName: String, accountType: String): Group? { val operations = ArrayList() ContentProviderOperation.newInsert(ContactsContract.Groups.CONTENT_URI).apply { withValue(ContactsContract.Groups.TITLE, title) withValue(ContactsContract.Groups.GROUP_VISIBLE, 1) + withValue(ContactsContract.Groups.ACCOUNT_NAME, accountName) + withValue(ContactsContract.Groups.ACCOUNT_TYPE, accountType) operations.add(build()) } diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index cd8d7bdb..4de49973 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -24,6 +24,7 @@ There are no contact groups on the device Create group Add to group + Create group under account Foto machen diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index bdba1f9a..9125e26f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -24,6 +24,7 @@ There are no contact groups on the device Create group Add to group + Create group under account Prendre une photo diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index e71dafc0..c2e550a2 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -24,6 +24,7 @@ There are no contact groups on the device Create group Add to group + Create group under account 사진 촬영 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 25806d34..eb3d883a 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -24,6 +24,7 @@ There are no contact groups on the device Create group Add to group + Create group under account Nufotografuoti diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index bf7016d6..0b4685c1 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -24,6 +24,7 @@ There are no contact groups on the device Create group Add to group + Create group under account Tirar foto diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 66b189b9..0ccfc198 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -24,6 +24,7 @@ There are no contact groups on the device Create group Add to group + Create group under account Снять фото diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 85177e12..7b218e5a 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -24,6 +24,7 @@ Nemáte v zariadení vytvorené žiadne skupiny kontaktov Vytvoriť skupinu Pridať do skupiny + Vytvoriť skupinu pod účet Vytvoriť foto diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 74b3aadf..cbf54e3c 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -24,6 +24,7 @@ There are no contact groups on the device Create group Add to group + Create group under account Ta foto diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index c05a2c9e..58f3265d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -24,6 +24,7 @@ 裝置內沒有聯絡人群組 建立群組 添加到群組 + Create group under account 拍照 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8d9edd77..24167197 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -24,6 +24,7 @@ There are no contact groups on the device Create group Add to group + Create group under account Take photo From 79d9e2045bc16d64d6e74314631ae41added7066 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Mar 2018 12:34:36 +0100 Subject: [PATCH 37/61] automatically choose the first group account, if only one is available --- .../contacts/dialogs/CreateNewGroupDialog.kt | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CreateNewGroupDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CreateNewGroupDialog.kt index 8ab8b4d8..5f770ba1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CreateNewGroupDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CreateNewGroupDialog.kt @@ -47,13 +47,13 @@ class CreateNewGroupDialog(val activity: BaseSimpleActivity, val callback: (newG } activity.runOnUiThread { - RadioGroupDialog(activity, items, titleId = R.string.create_group_under_account) { - val contactSource = contactSources[it as Int] - val newGroup = ContactsHelper(activity).createNewGroup(name, contactSource.name, contactSource.type) - if (newGroup != null) { - callback(newGroup) + if (items.size == 1) { + createGroupUnder(name, contactSources.first(), this) + } else { + RadioGroupDialog(activity, items, titleId = R.string.create_group_under_account) { + val contactSource = contactSources[it as Int] + createGroupUnder(name, contactSource, this) } - dismiss() } } } @@ -61,4 +61,12 @@ 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() + } } From 5076c11a214d34432e8055989ad6bdcd1fa0eded Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Mar 2018 14:14:14 +0100 Subject: [PATCH 38/61] add secret phone storage account at group destination too --- .../contacts/dialogs/CreateNewGroupDialog.kt | 2 ++ .../com/simplemobiletools/contacts/helpers/ContactsHelper.kt | 4 ++++ .../kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CreateNewGroupDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CreateNewGroupDialog.kt index 5f770ba1..33d9f348 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CreateNewGroupDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CreateNewGroupDialog.kt @@ -12,6 +12,7 @@ import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.helpers.ContactsHelper +import com.simplemobiletools.contacts.helpers.SMT_PRIVATE import com.simplemobiletools.contacts.models.ContactSource import com.simplemobiletools.contacts.models.Group import kotlinx.android.synthetic.main.dialog_create_new_group.view.* @@ -40,6 +41,7 @@ class CreateNewGroupDialog(val activity: BaseSimpleActivity, val callback: (newG ContactsHelper(activity).getContactSources { it.filter { it.type.contains("google", true) }.mapTo(contactSources, { ContactSource(it.name, it.type) }) + contactSources.add(ContactSource(activity.getString(R.string.phone_storage_hidden), SMT_PRIVATE)) val items = ArrayList() contactSources.forEachIndexed { index, contactSource -> 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 56bbd854..61c1e2d0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -394,6 +394,10 @@ class ContactsHelper(val activity: BaseSimpleActivity) { } fun createNewGroup(title: String, accountName: String, accountType: String): Group? { + if (accountType == SMT_PRIVATE) { + return activity.dbHelper.createGroup(title) + } + val operations = ArrayList() ContentProviderOperation.newInsert(ContactsContract.Groups.CONTENT_URI).apply { withValue(ContactsContract.Groups.TITLE, title) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt index 965c5256..45b448f3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -126,6 +126,10 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont mDb.update(CONTACTS_TABLE_NAME, contactValues, selection, null) } + fun createGroup(name: String): Group? { + return null + } + fun getContacts(selection: String? = null, selectionArgs: Array? = null): ArrayList { val contacts = ArrayList() val projection = arrayOf(COL_ID, COL_FIRST_NAME, COL_MIDDLE_NAME, COL_SURNAME, COL_PHONE_NUMBERS, COL_EMAILS, COL_EVENTS, COL_STARRED, From 86802dbbac19cb03edcfc9e6058e3541d0132005 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Mar 2018 17:05:14 +0100 Subject: [PATCH 39/61] add a Groups table to the local database --- .../contacts/helpers/DBHelper.kt | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt index 45b448f3..545378d3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -31,13 +31,18 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont private val COL_STARRED = "starred" private val COL_ADDRESSES = "addresses" private val COL_NOTES = "notes" + private val COL_GROUPS = "groups" + + private val GROUPS_TABLE_NAME = "groups" + private val COL_NAME = "name" private val FIRST_CONTACT_ID = 1000000 + private val FIRST_GROUP_ID = 10000 private val mDb = writableDatabase companion object { - private const val DB_VERSION = 2 + private const val DB_VERSION = 3 const val DB_NAME = "contacts.db" var dbInstance: DBHelper? = null @@ -52,10 +57,12 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont override fun onCreate(db: SQLiteDatabase) { db.execSQL("CREATE TABLE $CONTACTS_TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_FIRST_NAME TEXT, $COL_MIDDLE_NAME TEXT, " + "$COL_SURNAME TEXT, $COL_PHOTO BLOB, $COL_PHONE_NUMBERS TEXT, $COL_EMAILS TEXT, $COL_EVENTS TEXT, $COL_STARRED INTEGER, " + - "$COL_ADDRESSES TEXT, $COL_NOTES TEXT)") + "$COL_ADDRESSES TEXT, $COL_NOTES TEXT, $COL_GROUPS TEXT)") // start autoincrement ID from FIRST_CONTACT_ID to avoid conflicts db.execSQL("REPLACE INTO sqlite_sequence (name, seq) VALUES ('$CONTACTS_TABLE_NAME', $FIRST_CONTACT_ID)") + + createGroupsTable(db) } override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { @@ -63,6 +70,18 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_ADDRESSES TEXT DEFAULT ''") db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_NOTES TEXT DEFAULT ''") } + + if (oldVersion < 3) { + createGroupsTable(db) + db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_GROUPS TEXT DEFAULT ''") + } + } + + private fun createGroupsTable(db: SQLiteDatabase) { + db.execSQL("CREATE TABLE $GROUPS_TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_NAME TEXT)") + + // start autoincrement ID from FIRST_GROUP_ID to avoid conflicts + db.execSQL("REPLACE INTO sqlite_sequence (name, seq) VALUES ('$GROUPS_TABLE_NAME', $FIRST_GROUP_ID)") } fun insert(contact: Contact): Boolean { From 30d21625bf4b1523b6e56aaf2d1240a0cc1f38e2 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Mar 2018 17:27:40 +0100 Subject: [PATCH 40/61] create some db helper functions with working with groups --- .../contacts/helpers/ContactsHelper.kt | 6 ++-- .../contacts/helpers/DBHelper.kt | 33 +++++++++++++++---- 2 files changed, 30 insertions(+), 9 deletions(-) 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 61c1e2d0..7bab4b00 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -395,7 +395,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) { fun createNewGroup(title: String, accountName: String, accountType: String): Group? { if (accountType == SMT_PRIVATE) { - return activity.dbHelper.createGroup(title) + return activity.dbHelper.insertGroup(title) } val operations = ArrayList() @@ -598,7 +598,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) { fun updateContact(contact: Contact, photoUpdateStatus: Int): Boolean { return if (contact.source == SMT_PRIVATE) { - activity.dbHelper.update(contact) + activity.dbHelper.updateContact(contact) } else try { activity.toast(R.string.updating) val operations = ArrayList() @@ -942,7 +942,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) { } } - private fun insertLocalContact(contact: Contact) = activity.dbHelper.insert(contact) + private fun insertLocalContact(contact: Contact) = activity.dbHelper.insertContact(contact) private fun addFullSizePhoto(contactId: Long, fullSizePhotoData: ByteArray) { val baseUri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, contactId) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt index 545378d3..af80c3ef 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -34,7 +34,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont private val COL_GROUPS = "groups" private val GROUPS_TABLE_NAME = "groups" - private val COL_NAME = "name" + private val COL_TITLE = "title" private val FIRST_CONTACT_ID = 1000000 private val FIRST_GROUP_ID = 10000 @@ -78,19 +78,19 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont } private fun createGroupsTable(db: SQLiteDatabase) { - db.execSQL("CREATE TABLE $GROUPS_TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_NAME TEXT)") + db.execSQL("CREATE TABLE $GROUPS_TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_TITLE TEXT)") // start autoincrement ID from FIRST_GROUP_ID to avoid conflicts db.execSQL("REPLACE INTO sqlite_sequence (name, seq) VALUES ('$GROUPS_TABLE_NAME', $FIRST_GROUP_ID)") } - fun insert(contact: Contact): Boolean { + fun insertContact(contact: Contact): Boolean { val contactValues = fillContactValues(contact) val id = mDb.insert(CONTACTS_TABLE_NAME, null, contactValues).toInt() return id != -1 } - fun update(contact: Contact): Boolean { + fun updateContact(contact: Contact): Boolean { val contactValues = fillContactValues(contact) val selection = "$COL_ID = ?" val selectionArgs = arrayOf(contact.id.toString()) @@ -145,8 +145,29 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont mDb.update(CONTACTS_TABLE_NAME, contactValues, selection, null) } - fun createGroup(name: String): Group? { - return null + fun insertGroup(group: Group): Boolean { + val contactValues = fillGroupValues(group) + val id = mDb.insert(GROUPS_TABLE_NAME, null, contactValues).toInt() + return id != -1 + } + + fun updateGroup(group: Group): Boolean { + val contactValues = fillGroupValues(group) + val selection = "$COL_ID = ?" + val selectionArgs = arrayOf(group.id.toString()) + return mDb.update(GROUPS_TABLE_NAME, contactValues, selection, selectionArgs) == 1 + } + + fun deleteGroups(ids: Array) { + val args = TextUtils.join(", ", ids) + val selection = "$GROUPS_TABLE_NAME.$COL_ID IN ($args)" + mDb.delete(GROUPS_TABLE_NAME, selection, null) + } + + private fun fillGroupValues(group: Group): ContentValues { + return ContentValues().apply { + put(COL_TITLE, group.title) + } } fun getContacts(selection: String? = null, selectionArgs: Array? = null): ArrayList { From b28e85727d9c6c1e66a3d0b806c5a2b237c97720 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Mar 2018 17:40:51 +0100 Subject: [PATCH 41/61] fix local database group inserting --- .../contacts/helpers/ContactsHelper.kt | 2 +- .../com/simplemobiletools/contacts/helpers/DBHelper.kt | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) 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 7bab4b00..ff3ab534 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -395,7 +395,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) { fun createNewGroup(title: String, accountName: String, accountType: String): Group? { if (accountType == SMT_PRIVATE) { - return activity.dbHelper.insertGroup(title) + return activity.dbHelper.insertGroup(Group(0, title)) } val operations = ArrayList() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt index af80c3ef..5b9a3c8a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -145,10 +145,14 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont mDb.update(CONTACTS_TABLE_NAME, contactValues, selection, null) } - fun insertGroup(group: Group): Boolean { + fun insertGroup(group: Group): Group? { val contactValues = fillGroupValues(group) - val id = mDb.insert(GROUPS_TABLE_NAME, null, contactValues).toInt() - return id != -1 + val id = mDb.insert(GROUPS_TABLE_NAME, null, contactValues) + return if (id == -1L) { + null + } else { + Group(id, group.title) + } } fun updateGroup(group: Group): Boolean { From 30a7c1770d8ef3119bba91f4beaf418eb5d2c745 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Mar 2018 17:51:13 +0100 Subject: [PATCH 42/61] handle showing and deleting local private groups --- .../contacts/adapters/GroupsAdapter.kt | 8 +++++++- .../contacts/helpers/Constants.kt | 1 + .../contacts/helpers/ContactsHelper.kt | 1 + .../contacts/helpers/DBHelper.kt | 19 ++++++++++++++++++- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt index e1e78718..fe9b7dd3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt @@ -13,7 +13,9 @@ import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.activities.SimpleActivity import com.simplemobiletools.contacts.dialogs.RenameGroupDialog import com.simplemobiletools.contacts.extensions.config +import com.simplemobiletools.contacts.extensions.dbHelper import com.simplemobiletools.contacts.helpers.ContactsHelper +import com.simplemobiletools.contacts.helpers.FIRST_GROUP_ID import com.simplemobiletools.contacts.helpers.GROUPS_TAB_MASK import com.simplemobiletools.contacts.interfaces.RefreshContactsListener import com.simplemobiletools.contacts.models.Group @@ -97,7 +99,11 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val selectedPositions.sortedDescending().forEach { val group = groups[it] groupsToRemove.add(group) - ContactsHelper(activity).deleteGroup(group.id) + if (group.id >= FIRST_GROUP_ID) { + activity.dbHelper.deleteGroup(group.id) + } else { + ContactsHelper(activity).deleteGroup(group.id) + } } groups.removeAll(groupsToRemove) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt index 0d460631..b1a341c7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -14,6 +14,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 LOCATION_CONTACTS_TAB = 1 const val LOCATION_FAVORITES_TAB = 2 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 ff3ab534..bf955a01 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -390,6 +390,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) { cursor?.close() } + groups.addAll(activity.dbHelper.getGroups()) return groups } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt index 5b9a3c8a..0228f5b7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -13,6 +13,7 @@ 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.extensions.getByteArray import com.simplemobiletools.contacts.extensions.getPhotoThumbnailSize @@ -37,7 +38,6 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont private val COL_TITLE = "title" private val FIRST_CONTACT_ID = 1000000 - private val FIRST_GROUP_ID = 10000 private val mDb = writableDatabase @@ -162,12 +162,29 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont return mDb.update(GROUPS_TABLE_NAME, contactValues, selection, selectionArgs) == 1 } + fun deleteGroup(id: Long) = deleteGroups(arrayOf(id.toString())) + fun deleteGroups(ids: Array) { val args = TextUtils.join(", ", ids) val selection = "$GROUPS_TABLE_NAME.$COL_ID IN ($args)" 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) From bd8dffb549d4544ad4691e4bcd50e639decad026 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Mar 2018 18:07:05 +0100 Subject: [PATCH 43/61] allow renaming local private groups --- .../contacts/adapters/GroupsAdapter.kt | 3 +-- .../contacts/dialogs/RenameGroupDialog.kt | 18 ++++++++++++------ .../contacts/helpers/ContactsHelper.kt | 4 ++-- .../contacts/helpers/DBHelper.kt | 2 +- .../simplemobiletools/contacts/models/Group.kt | 3 +++ .../main/res/layout/dialog_rename_group.xml | 2 +- 6 files changed, 20 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt index fe9b7dd3..41cd4464 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt @@ -15,7 +15,6 @@ import com.simplemobiletools.contacts.dialogs.RenameGroupDialog import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.dbHelper import com.simplemobiletools.contacts.helpers.ContactsHelper -import com.simplemobiletools.contacts.helpers.FIRST_GROUP_ID import com.simplemobiletools.contacts.helpers.GROUPS_TAB_MASK import com.simplemobiletools.contacts.interfaces.RefreshContactsListener import com.simplemobiletools.contacts.models.Group @@ -99,7 +98,7 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val selectedPositions.sortedDescending().forEach { val group = groups[it] groupsToRemove.add(group) - if (group.id >= FIRST_GROUP_ID) { + if (group.isPrivateSecretGroup()) { activity.dbHelper.deleteGroup(group.id) } else { ContactsHelper(activity).deleteGroup(group.id) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/RenameGroupDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/RenameGroupDialog.kt index 95c31224..de1f654c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/RenameGroupDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/RenameGroupDialog.kt @@ -4,6 +4,7 @@ import android.support.v7.app.AlertDialog import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.extensions.dbHelper import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.models.Group import kotlinx.android.synthetic.main.dialog_rename_group.view.* @@ -12,7 +13,7 @@ class RenameGroupDialog(val activity: BaseSimpleActivity, val group: Group, val init { val view = activity.layoutInflater.inflate(R.layout.dialog_rename_group, null).apply { - rename_group_name.setText(group.title) + rename_group_title.setText(group.title) } AlertDialog.Builder(activity) @@ -20,20 +21,25 @@ class RenameGroupDialog(val activity: BaseSimpleActivity, val group: Group, val .setNegativeButton(R.string.cancel, null) .create().apply { activity.setupDialogStuff(view, this, R.string.rename) { - showKeyboard(view.rename_group_name) + showKeyboard(view.rename_group_title) getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { - val newName = view.rename_group_name.value - if (newName.isEmpty()) { + val newTitle = view.rename_group_title.value + if (newTitle.isEmpty()) { activity.toast(R.string.empty_name) return@setOnClickListener } - if (!newName.isAValidFilename()) { + if (!newTitle.isAValidFilename()) { activity.toast(R.string.invalid_name) return@setOnClickListener } - ContactsHelper(activity).renameGroup(group, newName) + group.title = newTitle + if (group.isPrivateSecretGroup()) { + activity.dbHelper.renameGroup(group) + } else { + ContactsHelper(activity).renameGroup(group) + } callback() dismiss() } 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 bf955a01..f2c1c084 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -418,13 +418,13 @@ class ContactsHelper(val activity: BaseSimpleActivity) { return null } - fun renameGroup(group: Group, newTitle: String) { + fun renameGroup(group: Group) { val operations = ArrayList() ContentProviderOperation.newUpdate(ContactsContract.Groups.CONTENT_URI).apply { val selection = "${ContactsContract.Groups._ID} = ?" val selectionArgs = arrayOf(group.id.toString()) withSelection(selection, selectionArgs) - withValue(ContactsContract.Groups.TITLE, newTitle) + withValue(ContactsContract.Groups.TITLE, group.title) operations.add(build()) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt index 0228f5b7..8834d1a5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -155,7 +155,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont } } - fun updateGroup(group: Group): Boolean { + fun renameGroup(group: Group): Boolean { val contactValues = fillGroupValues(group) val selection = "$COL_ID = ?" val selectionArgs = arrayOf(group.id.toString()) 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 12b7ba27..1b53d894 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Group.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Group.kt @@ -1,5 +1,6 @@ package com.simplemobiletools.contacts.models +import com.simplemobiletools.contacts.helpers.FIRST_GROUP_ID import java.io.Serializable data class Group(var id: Long, var title: String, var contactsCount: Int = 0) : Serializable { @@ -10,4 +11,6 @@ data class Group(var id: Long, var title: String, var contactsCount: Int = 0) : fun addContact() = contactsCount++ fun getBubbleText() = title + + fun isPrivateSecretGroup() = id >= FIRST_GROUP_ID } diff --git a/app/src/main/res/layout/dialog_rename_group.xml b/app/src/main/res/layout/dialog_rename_group.xml index fb63ce42..974d2b59 100644 --- a/app/src/main/res/layout/dialog_rename_group.xml +++ b/app/src/main/res/layout/dialog_rename_group.xml @@ -8,7 +8,7 @@ android:padding="@dimen/activity_margin"> Date: Wed, 21 Mar 2018 18:21:16 +0100 Subject: [PATCH 44/61] properly refresh View Contact screen on resume --- .../contacts/activities/ViewContactActivity.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt index 1bffbd05..d9c17a46 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt @@ -60,6 +60,7 @@ class ViewContactActivity : ContactActivity() { } private fun initContact() { + var wasLookupKeyUsed = false var contactId = intent.getIntExtra(CONTACT_ID, 0) val action = intent.action if (contactId == 0 && (action == ContactsContract.QuickContact.ACTION_QUICK_CONTACT || action == Intent.ACTION_VIEW)) { @@ -69,6 +70,7 @@ class ViewContactActivity : ContactActivity() { val lookupKey = getLookupKeyFromUri(data) if (lookupKey != null) { contact = ContactsHelper(this).getContactWithLookupKey(lookupKey) + wasLookupKeyUsed = true } getLookupUriRawId(data) @@ -82,7 +84,7 @@ class ViewContactActivity : ContactActivity() { } } - if (contactId != 0 && contact == null) { + if (contactId != 0 && !wasLookupKeyUsed) { contact = ContactsHelper(this).getContactWithId(contactId, intent.getBooleanExtra(IS_PRIVATE, false)) if (contact == null) { toast(R.string.unknown_error_occurred) From 1797f17f317c85b094d73bac80ae69563cd29473 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Mar 2018 18:27:25 +0100 Subject: [PATCH 45/61] minor cleanup to remove unnecessary indentation --- .../contacts/helpers/ContactsHelper.kt | 276 +++++++++--------- 1 file changed, 139 insertions(+), 137 deletions(-) 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 f2c1c084..da045def 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -598,10 +598,12 @@ class ContactsHelper(val activity: BaseSimpleActivity) { } fun updateContact(contact: Contact, photoUpdateStatus: Int): Boolean { - return if (contact.source == SMT_PRIVATE) { - activity.dbHelper.updateContact(contact) - } else try { - activity.toast(R.string.updating) + activity.toast(R.string.updating) + if (contact.source == SMT_PRIVATE) { + return activity.dbHelper.updateContact(contact) + } + + try { val operations = ArrayList() ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI).apply { val selection = "${ContactsContract.Data.RAW_CONTACT_ID} = ? AND ${ContactsContract.Data.MIMETYPE} = ?" @@ -737,10 +739,10 @@ class ContactsHelper(val activity: BaseSimpleActivity) { } activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) - true + return true } catch (e: Exception) { activity.showErrorToast(e) - false + return false } } @@ -807,139 +809,139 @@ class ContactsHelper(val activity: BaseSimpleActivity) { } fun insertContact(contact: Contact): Boolean { - return if (contact.source == SMT_PRIVATE) { - insertLocalContact(contact) - } else { - try { - val operations = ArrayList() - ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).apply { - withValue(ContactsContract.RawContacts.ACCOUNT_NAME, contact.source) - withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, getContactSourceType(contact.source)) - operations.add(build()) - } + if (contact.source == SMT_PRIVATE) { + return insertLocalContact(contact) + } - // names - ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { - withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) - withValue(CommonDataKinds.StructuredName.GIVEN_NAME, contact.firstName) - withValue(CommonDataKinds.StructuredName.MIDDLE_NAME, contact.middleName) - withValue(CommonDataKinds.StructuredName.FAMILY_NAME, contact.surname) - operations.add(build()) - } - - // phone numbers - contact.phoneNumbers.forEach { - ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { - withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Phone.CONTENT_ITEM_TYPE) - withValue(CommonDataKinds.Phone.NUMBER, it.value) - withValue(CommonDataKinds.Phone.TYPE, it.type) - operations.add(build()) - } - } - - // emails - contact.emails.forEach { - ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { - withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Email.CONTENT_ITEM_TYPE) - withValue(CommonDataKinds.Email.DATA, it.value) - withValue(CommonDataKinds.Email.TYPE, it.type) - operations.add(build()) - } - } - - // addresses - contact.addresses.forEach { - ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { - withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) - withValue(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, it.value) - withValue(CommonDataKinds.StructuredPostal.TYPE, it.type) - operations.add(build()) - } - } - - // events - contact.events.forEach { - ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { - withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Event.CONTENT_ITEM_TYPE) - withValue(CommonDataKinds.Event.START_DATE, it.value) - withValue(CommonDataKinds.Event.TYPE, it.type) - operations.add(build()) - } - } - - // notes - ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { - withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - withValue(ContactsContract.Data.MIMETYPE, Note.CONTENT_ITEM_TYPE) - withValue(Note.NOTE, contact.notes) - operations.add(build()) - } - - // groups - contact.groups.forEach { - ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { - withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE) - withValue(CommonDataKinds.GroupMembership.GROUP_ROW_ID, it.id) - operations.add(build()) - } - } - - // photo (inspired by https://gist.github.com/slightfoot/5985900) - var fullSizePhotoData: ByteArray? = null - var scaledSizePhotoData: ByteArray? - if (contact.photoUri.isNotEmpty()) { - val photoUri = Uri.parse(contact.photoUri) - val bitmap = MediaStore.Images.Media.getBitmap(activity.contentResolver, photoUri) - - val thumbnailSize = activity.getPhotoThumbnailSize() - val scaledPhoto = Bitmap.createScaledBitmap(bitmap, thumbnailSize, thumbnailSize, false) - scaledSizePhotoData = scaledPhoto.getByteArray() - - fullSizePhotoData = bitmap.getByteArray() - scaledPhoto.recycle() - bitmap.recycle() - - ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { - withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Photo.CONTENT_ITEM_TYPE) - withValue(CommonDataKinds.Photo.PHOTO, scaledSizePhotoData) - operations.add(build()) - } - } - - val results: Array - try { - results = activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) - } finally { - scaledSizePhotoData = null - } - - // fullsize photo - val rawId = ContentUris.parseId(results[0].uri) - if (contact.photoUri.isNotEmpty() && fullSizePhotoData != null) { - addFullSizePhoto(rawId, fullSizePhotoData) - } - - // favorite - val userId = getRealContactId(rawId) - if (userId != 0 && contact.starred == 1) { - val uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, userId.toString()) - val contentValues = ContentValues(1) - contentValues.put(ContactsContract.Contacts.STARRED, contact.starred) - activity.contentResolver.update(uri, contentValues, null, null) - } - - true - } catch (e: Exception) { - activity.showErrorToast(e) - false + try { + val operations = ArrayList() + ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).apply { + withValue(ContactsContract.RawContacts.ACCOUNT_NAME, contact.source) + withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, getContactSourceType(contact.source)) + operations.add(build()) } + + // names + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { + withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.StructuredName.GIVEN_NAME, contact.firstName) + withValue(CommonDataKinds.StructuredName.MIDDLE_NAME, contact.middleName) + withValue(CommonDataKinds.StructuredName.FAMILY_NAME, contact.surname) + operations.add(build()) + } + + // phone numbers + contact.phoneNumbers.forEach { + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { + withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Phone.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Phone.NUMBER, it.value) + withValue(CommonDataKinds.Phone.TYPE, it.type) + operations.add(build()) + } + } + + // emails + contact.emails.forEach { + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { + withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Email.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Email.DATA, it.value) + withValue(CommonDataKinds.Email.TYPE, it.type) + operations.add(build()) + } + } + + // addresses + contact.addresses.forEach { + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { + withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, it.value) + withValue(CommonDataKinds.StructuredPostal.TYPE, it.type) + operations.add(build()) + } + } + + // events + contact.events.forEach { + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { + withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Event.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Event.START_DATE, it.value) + withValue(CommonDataKinds.Event.TYPE, it.type) + operations.add(build()) + } + } + + // notes + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { + withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + withValue(ContactsContract.Data.MIMETYPE, Note.CONTENT_ITEM_TYPE) + withValue(Note.NOTE, contact.notes) + operations.add(build()) + } + + // groups + contact.groups.forEach { + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { + withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.GroupMembership.GROUP_ROW_ID, it.id) + operations.add(build()) + } + } + + // photo (inspired by https://gist.github.com/slightfoot/5985900) + var fullSizePhotoData: ByteArray? = null + var scaledSizePhotoData: ByteArray? + if (contact.photoUri.isNotEmpty()) { + val photoUri = Uri.parse(contact.photoUri) + val bitmap = MediaStore.Images.Media.getBitmap(activity.contentResolver, photoUri) + + val thumbnailSize = activity.getPhotoThumbnailSize() + val scaledPhoto = Bitmap.createScaledBitmap(bitmap, thumbnailSize, thumbnailSize, false) + scaledSizePhotoData = scaledPhoto.getByteArray() + + fullSizePhotoData = bitmap.getByteArray() + scaledPhoto.recycle() + bitmap.recycle() + + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { + withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Photo.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Photo.PHOTO, scaledSizePhotoData) + operations.add(build()) + } + } + + val results: Array + try { + results = activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + } finally { + scaledSizePhotoData = null + } + + // fullsize photo + val rawId = ContentUris.parseId(results[0].uri) + if (contact.photoUri.isNotEmpty() && fullSizePhotoData != null) { + addFullSizePhoto(rawId, fullSizePhotoData) + } + + // favorite + val userId = getRealContactId(rawId) + if (userId != 0 && contact.starred == 1) { + val uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, userId.toString()) + val contentValues = ContentValues(1) + contentValues.put(ContactsContract.Contacts.STARRED, contact.starred) + activity.contentResolver.update(uri, contentValues, null, null) + } + + return true + } catch (e: Exception) { + activity.showErrorToast(e) + return false } } From cf4b7ca9c5da065cafebe8bd0334360cb28e9aa2 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Mar 2018 18:49:28 +0100 Subject: [PATCH 46/61] allow storing groups at contacts stored in a local database --- .../contacts/helpers/ContactsHelper.kt | 4 ++-- .../contacts/helpers/DBHelper.kt | 17 ++++++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) 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 da045def..9b20adb8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -102,7 +102,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) { contacts[key]?.notes = notes.valueAt(i) } - activity.dbHelper.getContacts().forEach { + activity.dbHelper.getContacts(activity).forEach { contacts.put(it.id, it) } @@ -454,7 +454,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) { if (id == 0) { return null } else if (isLocalPrivate) { - return activity.dbHelper.getContactWithId(id) + return activity.dbHelper.getContactWithId(activity, id) } val selection = "${ContactsContract.Data.MIMETYPE} = ? AND ${ContactsContract.Data.RAW_CONTACT_ID} = ?" diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt index 8834d1a5..78760c3d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -11,6 +11,7 @@ import android.provider.MediaStore import android.text.TextUtils import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.extensions.getBlobValue import com.simplemobiletools.commons.extensions.getIntValue import com.simplemobiletools.commons.extensions.getLongValue @@ -116,6 +117,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont put(COL_EVENTS, Gson().toJson(contact.events)) put(COL_STARRED, contact.starred) put(COL_NOTES, contact.notes) + put(COL_GROUPS, Gson().toJson(contact.groups.map { it.id })) if (contact.photoUri.isNotEmpty()) { put(COL_PHOTO, getPhotoByteArray(contact.photoUri)) @@ -191,10 +193,11 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont } } - fun getContacts(selection: String? = null, selectionArgs: Array? = null): ArrayList { + fun getContacts(activity: BaseSimpleActivity, selection: String? = null, selectionArgs: Array? = null): ArrayList { + val storedGroups = ContactsHelper(activity).getStoredGroups() val contacts = ArrayList() val projection = arrayOf(COL_ID, COL_FIRST_NAME, COL_MIDDLE_NAME, COL_SURNAME, COL_PHONE_NUMBERS, COL_EMAILS, COL_EVENTS, COL_STARRED, - COL_PHOTO, COL_ADDRESSES, COL_NOTES) + COL_PHOTO, COL_ADDRESSES, COL_NOTES, COL_GROUPS) val cursor = mDb.query(CONTACTS_TABLE_NAME, projection, selection, selectionArgs, null, null, null) cursor.use { while (cursor.moveToNext()) { @@ -228,7 +231,11 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont val notes = cursor.getStringValue(COL_NOTES) val starred = cursor.getIntValue(COL_STARRED) - val groups = ArrayList() + + val groupIdsJson = cursor.getStringValue(COL_GROUPS) + val groupIdsToken = object : TypeToken>() {}.type + val groupIds = Gson().fromJson>(groupIdsJson, groupIdsToken) ?: ArrayList(1) + val groups = storedGroups.filter { groupIds.contains(it.id) } as ArrayList val contact = Contact(id, firstName, middleName, surname, "", phoneNumbers, emails, addresses, events, SMT_PRIVATE, starred, id, "", photo, notes, groups) contacts.add(contact) @@ -237,9 +244,9 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont return contacts } - fun getContactWithId(id: Int): Contact? { + fun getContactWithId(activity: BaseSimpleActivity, id: Int): Contact? { val selection = "$COL_ID = ?" val selectionArgs = arrayOf(id.toString()) - return getContacts(selection, selectionArgs).firstOrNull() + return getContacts(activity, selection, selectionArgs).firstOrNull() } } From 6eade329d6feac8703e0619a0d1a07a143d40640 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Mar 2018 19:20:55 +0100 Subject: [PATCH 47/61] add helper functions to handle contact adding and removing from groups --- .../activities/GroupContactsActivity.kt | 11 ++++----- .../contacts/adapters/ContactsAdapter.kt | 13 ++++++---- .../contacts/extensions/Activity.kt | 24 +++++++++++++++++++ .../contacts/helpers/DBHelper.kt | 8 +++++++ 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt index a3295dc4..56ae0909 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt @@ -5,10 +5,7 @@ import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.adapters.ContactsAdapter import com.simplemobiletools.contacts.dialogs.SelectContactsDialog -import com.simplemobiletools.contacts.extensions.config -import com.simplemobiletools.contacts.extensions.editContact -import com.simplemobiletools.contacts.extensions.tryStartCall -import com.simplemobiletools.contacts.extensions.viewContact +import com.simplemobiletools.contacts.extensions.* import com.simplemobiletools.contacts.helpers.* import com.simplemobiletools.contacts.interfaces.RefreshContactsListener import com.simplemobiletools.contacts.interfaces.RemoveFromGroupListener @@ -48,11 +45,11 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh private fun fabClicked() { SelectContactsDialog(this, allContacts, groupContacts) { addedContacts, removedContacts -> - ContactsHelper(this).apply { + Thread { addContactsToGroup(addedContacts, group.id) removeContactsFromGroup(removedContacts, group.id) - } - refreshContacts() + refreshContacts() + }.start() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index aa551595..7cc74c73 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -21,6 +21,7 @@ import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.activities.SimpleActivity import com.simplemobiletools.contacts.dialogs.CreateNewGroupDialog +import com.simplemobiletools.contacts.extensions.addContactsToGroup import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.editContact import com.simplemobiletools.contacts.extensions.shareContacts @@ -197,13 +198,17 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList, groupId: Long) { + val publicContacts = contacts.filter { it.source != SMT_PRIVATE } + val privateContacts = contacts.filter { it.source == SMT_PRIVATE } + if (publicContacts.isNotEmpty()) { + ContactsHelper(this).addContactsToGroup(contacts, groupId) + } + + if (privateContacts.isNotEmpty()) { + dbHelper.addContactsToGroup(contacts, groupId) + } +} + +fun BaseSimpleActivity.removeContactsFromGroup(contacts: ArrayList, groupId: Long) { + val publicContacts = contacts.filter { it.source != SMT_PRIVATE } + val privateContacts = contacts.filter { it.source == SMT_PRIVATE } + if (publicContacts.isNotEmpty()) { + ContactsHelper(this).removeContactsFromGroup(contacts, groupId) + } + + if (privateContacts.isNotEmpty()) { + dbHelper.removeContactsFromGroup(contacts, groupId) + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt index 78760c3d..b2cddb09 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -193,6 +193,14 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont } } + fun addContactsToGroup(contacts: ArrayList, groupId: Long) { + + } + + fun removeContactsFromGroup(contacts: ArrayList, groupId: Long) { + + } + fun getContacts(activity: BaseSimpleActivity, selection: String? = null, selectionArgs: Array? = null): ArrayList { val storedGroups = ContactsHelper(activity).getStoredGroups() val contacts = ArrayList() From 485e73afa7027869876677a301432907c9caf1ed Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Mar 2018 19:24:49 +0100 Subject: [PATCH 48/61] update the url to https --- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-ko-rKR/strings.xml | 2 +- app/src/main/res/values-lt/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 4de49973..28f5755a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -89,7 +89,7 @@ Beinhaltet keine Werbung oder unnötige Berechtigungen. Sie ist komplett Open Source, alle verwendeten Farben sind anpassbar. - Diese App ist nur eine aus einer größeren Serie von schlichten Apps. Der Rest davon findet sich auf http://www.simplemobiletools.com + Diese App ist nur eine aus einer größeren Serie von schlichten Apps. Der Rest davon findet sich auf https://www.simplemobiletools.com P;0;t+LT0HDY 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 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.png index ca454ba65705178b36135e1c8a9984dc4e365ca0..1626bc5e3bc9127f1d4d5abdcdbefdc36dce2afb 100644 GIT binary patch literal 59837 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 GoBs>tL^)9a literal 68065 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 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.png index 6d51e66d2be850b88dcac3cfc7c11ba6c002ea09..895ff60356428f29de686dae37195e14d6b5dba7 100644 GIT binary patch literal 92527 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 Qlz4G<6`kWbM^9h*KO!9)0RR91 literal 88462 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

U=xrhKLS~benbtdz0CWF#e8bxB%pBC5P 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

o{F-AMPBlI6Vb;ROKjEuk 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 From d3315cd37222705c13a12be2bc7f0b55dd11197c Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Mar 2018 23:18:50 +0100 Subject: [PATCH 60/61] change website to https in fastlane long description --- fastlane/metadata/android/en-US/full_description.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt index 30b18821..c5211576 100644 --- a/fastlane/metadata/android/en-US/full_description.txt +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -4,4 +4,4 @@ You can use it for managing user emails and events too. It has the ability to so Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors. -This app is just one piece of a bigger series of apps. You can find the rest of them at http://www.simplemobiletools.com +This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com From a292c855e506660c1bf12e4dba8273c65dae4ede Mon Sep 17 00:00:00 2001 From: cryoranger Date: Thu, 22 Mar 2018 16:36:38 +0200 Subject: [PATCH 61/61] greek translation --- app/src/main/res/values-el/strings.xml | 99 ++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 app/src/main/res/values-el/strings.xml diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml new file mode 100644 index 00000000..d4ff97bb --- /dev/null +++ b/app/src/main/res/values-el/strings.xml @@ -0,0 +1,99 @@ + + Απλές Επαφές + Επαφές + Διεύθυνση + Εισαγωγή... + Ενημέρωση... + Μνήμη τηλεφώνου + Μνήμη τηλεφώνου (δεν είναι ορατή από άλλες εφαρμογές) + + Νέα επαφή + Επεξεργασία επαφής + Επιλογή επαφής + Επιλογή επαφών + Όνομα + Μεσαίο όνομα + Επώνυμο + + + Δεν υπάρχουν ομάδες + Δημιουργία νέας ομάδας + Αφαίρεση από ομάδα + Η ομάδα είναι άδεια + Προσθήκη επαφών + Δεν υπάρχουν ομάδες επαφών στη συσκευή + Δημιουργία ομάδας + Προσθήκη σε ομάδα + Δημιουργία ομάδας κάτω από λογαριασμό + + + Λήψη φωτογραφίας + Επιλογή φωτογραφίας + Αφαίρεση φωτογραφίας + + + Το όνομα ξεκινά με το επώνυμο + Εμφάνιση τηλεφωνικών αριθμών στην κύρια οθόνη + Εμφάνιση μικρογραφιών επαφής + Στην επιλογή επαφής + Κλήση επαφής + Εμφάνιση λεπτομερειών επαφής + Εμφάνιση καρτέλας αγαπημένων + Εμφάνιση καρτέλας ομάδων + + + Email + Σπίτι + Εργασία + Άλλο + + + Αριθμός + Κινητό + Κύριο + Φαξ εργασίας + Φαξ σπιτιού + Βομβητής + Δεν βρέθηκε τηλεφωνικός αριθμός + + + Γενέθλια + Επέτειος + + + Φαίνεται ότι δεν έχεις προσθέσει αγαπημένες επαφές ακόμα. + Προσθήκη αγαπημένων + Προσθήκη στα αγαπημένα + Αφαίρεση από τα αγαπημένα + + + Αναζήτηση επαφών + Αναζήτηση αγαπημένων + + + Εισαγωγή επαφών + Εξαγωγή επαφών + Εισαγωγή επαφών από .vcf αρχείο + Εξαγωγή επαφών σε .vcf αρχείο + Πηγή επαφής προορισμού + Συμπερίληψη πηγών επαφών + Όνομα αρχείου (χωρίς .vcf) + + + + Μια εφαρμογή επαφών για να διαχειρίζεσαι τις επαφές σου χωρίς διαφημίσεις. + + Μια απλή εφαρμογή για δημιουργία και διαχείριση των επαφών σου από κάθε πηγή. Οι επαφές μπορεί να είναι αποθηκευμένες μόνο στη συσκευή σου, αλλά μπορούν να συγχρονίζονται στο Google, ή σε κάποιο άλλο λογαριασμό. Μπορείς να εμφανίσεις τις αγαπημένες σου επαφές σε ξεχωριστή λίστα. + + Μπορείς να τη χρησιμοποιήσεις για τη διαχείριση των email των χρηστών και τα γεγονότα. Έχει τη δυνατότητα ταξινόμησης/φιλτραρίσματος με διάφορες παραμέτρους, προαιρετικά να εμφανίζεται το επώνυμο σαν όνομα. + + Δεν περιέχει διαφημίσεις ή περιττές άδειες. Είναι πλήρως ανοικτού κώδικα, παρέχει δυνατότητα προσαρμογής των χρωμάτων. + + Αυτή η εφαρμογή είναι ένα μικρό κομμάτι μιας μεγαλύτερης συλλογής εφαρμογών. Μπορείς να βρεις τις υπόλοιπες στο https://www.simplemobiletools.com + + + +