diff --git a/app/build.gradle b/app/build.gradle index ce681ceb..d2546c75 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -36,6 +36,6 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.27.22' + implementation 'com.simplemobiletools:commons:5.27.23' implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d8a83138..9f6b4ba9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/RecentCallsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/RecentCallsAdapter.kt index 15944730..4a51e3dc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/RecentCallsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/RecentCallsAdapter.kt @@ -8,18 +8,21 @@ import android.view.View import android.view.ViewGroup import com.bumptech.glide.Glide import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter +import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.extensions.config +import com.simplemobiletools.dialer.helpers.RecentsHelper +import com.simplemobiletools.dialer.interfaces.RefreshRecentsListener import com.simplemobiletools.dialer.models.RecentCall import kotlinx.android.synthetic.main.item_recent_call.view.* import java.util.* -class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList, recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : - MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) { +class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList, recyclerView: MyRecyclerView, val refreshRecentsListener: RefreshRecentsListener, + itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) { private lateinit var incomingCallIcon: Drawable private lateinit var outgoingCallIcon: Drawable @@ -27,13 +30,22 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList askConfirmRemove() + } + } override fun getSelectableItemCount() = recentCalls.size @@ -51,7 +63,7 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList + holder.bindView(recentCall, true, true) { itemView, layoutPosition -> setupView(itemView, recentCall) } bindViewHolder(holder) @@ -71,6 +83,35 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList + + RecentsHelper(activity).removeRecentCalls(ids) { + recentCalls.removeAll(callsToRemove) + activity.runOnUiThread { + if (recentCalls.isEmpty()) { + refreshRecentsListener.refreshRecents() + finishActMode() + } else { + removeSelectedItems(positions) + } + } + } + } + fun updateItems(newItems: ArrayList) { if (newItems.hashCode() != recentCalls.hashCode()) { recentCalls = newItems.clone() as ArrayList @@ -79,8 +120,11 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList + private fun setupView(view: View, call: RecentCall) { view.apply { + item_recents_frame.isSelected = selectedKeys.contains(call.id) item_recents_name.apply { text = call.name setTextColor(textColor) diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/RecentsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/RecentsFragment.kt index 530933e0..6faff1bd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/RecentsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/RecentsFragment.kt @@ -3,19 +3,19 @@ package com.simplemobiletools.dialer.fragments import android.content.Context import android.util.AttributeSet import com.simplemobiletools.commons.extensions.* -import com.simplemobiletools.commons.helpers.PERMISSION_READ_CALL_LOG +import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CALL_LOG import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.activities.SimpleActivity -import com.simplemobiletools.dialer.adapters.ContactsAdapter import com.simplemobiletools.dialer.adapters.RecentCallsAdapter import com.simplemobiletools.dialer.extensions.config import com.simplemobiletools.dialer.helpers.RecentsHelper +import com.simplemobiletools.dialer.interfaces.RefreshRecentsListener import com.simplemobiletools.dialer.models.RecentCall import kotlinx.android.synthetic.main.fragment_recents.view.* -class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { +class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), RefreshRecentsListener { override fun setupFragment() { - val placeholderResId = if (context.hasPermission(PERMISSION_READ_CALL_LOG)) { + val placeholderResId = if (context.hasPermission(PERMISSION_WRITE_CALL_LOG)) { R.string.no_previous_calls } else { R.string.could_not_access_the_call_history @@ -40,10 +40,13 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage override fun primaryColorChanged(color: Int) {} + override fun refreshRecents() { + } + fun updateRecents(recents: ArrayList) { if (recents.isEmpty()) { recents_placeholder.beVisible() - recents_placeholder_2.beVisibleIf(!context.hasPermission(PERMISSION_READ_CALL_LOG)) + recents_placeholder_2.beVisibleIf(!context.hasPermission(PERMISSION_WRITE_CALL_LOG)) recents_list.beGone() } else { recents_placeholder.beGone() @@ -52,7 +55,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage val currAdapter = recents_list.adapter if (currAdapter == null) { - RecentCallsAdapter(activity as SimpleActivity, recents, recents_list) { + RecentCallsAdapter(activity as SimpleActivity, recents, recents_list, this) { activity?.launchCallIntent((it as RecentCall).phoneNumber) }.apply { recents_list.adapter = this @@ -64,7 +67,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage } private fun requestCallLogPermission() { - activity?.handlePermission(PERMISSION_READ_CALL_LOG) { + activity?.handlePermission(PERMISSION_WRITE_CALL_LOG) { if (it) { recents_placeholder.text = context.getString(R.string.no_previous_calls) recents_placeholder_2.beGone() diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/RecentsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/RecentsHelper.kt index 7ca98a8e..c24a2985 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/RecentsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/RecentsHelper.kt @@ -4,8 +4,9 @@ import android.annotation.SuppressLint import android.content.Context import android.provider.CallLog.Calls import com.simplemobiletools.commons.extensions.* -import com.simplemobiletools.commons.helpers.PERMISSION_READ_CALL_LOG +import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CALL_LOG import com.simplemobiletools.commons.helpers.ensureBackgroundThread +import com.simplemobiletools.commons.overloads.times import com.simplemobiletools.dialer.models.RecentCall class RecentsHelper(private val context: Context) { @@ -13,7 +14,7 @@ class RecentsHelper(private val context: Context) { fun getRecentCalls(callback: (ArrayList) -> Unit) { ensureBackgroundThread { val recentCalls = ArrayList() - if (!context.hasPermission(PERMISSION_READ_CALL_LOG)) { + if (!context.hasPermission(PERMISSION_WRITE_CALL_LOG)) { callback(recentCalls) return@ensureBackgroundThread } @@ -52,4 +53,19 @@ class RecentsHelper(private val context: Context) { callback(recentCalls) } } + + @SuppressLint("MissingPermission") + fun removeRecentCalls(ids: ArrayList, callback: () -> Unit) { + ensureBackgroundThread { + val uri = Calls.CONTENT_URI + ids.chunked(30).forEach { chunk -> + val selection = "${Calls._ID} IN (${getQuestionMarks(chunk.size)})" + val selectionArgs = chunk.map { it.toString() }.toTypedArray() + context.contentResolver.delete(uri, selection, selectionArgs) + } + callback() + } + } + + private fun getQuestionMarks(size: Int) = ("?," * size).trimEnd(',') } diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/interfaces/RefreshRecentsListener.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/interfaces/RefreshRecentsListener.kt new file mode 100644 index 00000000..40ad2977 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/interfaces/RefreshRecentsListener.kt @@ -0,0 +1,5 @@ +package com.simplemobiletools.dialer.interfaces + +interface RefreshRecentsListener { + fun refreshRecents() +} diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 3c0bb2aa..0ef32fc1 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -9,6 +9,7 @@ Er zijn geen gesprekken gevonden Kon geen toegang krijgen tot de oproepgeschiedenis Toegang verzoeken + Are you sure you want to remove the selected items from the Call History? Telefoonkiezer diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index dec8e551..6443c44f 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -9,6 +9,7 @@ Não existem chamadas anteriores Não foi possível aceder ao histórico de chamadas Pedir acesso + Are you sure you want to remove the selected items from the Call History? Marcador diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b92aa177..746c5c56 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,6 +9,7 @@ No previous calls have been found Could not access the call history Request access + Are you sure you want to remove the selected items from the Call History? Dialpad