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