mirror of
https://github.com/SimpleMobileTools/Simple-Dialer.git
synced 2025-06-05 21:49:23 +02:00
allow deleting items from Recents
This commit is contained in:
@ -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'
|
||||
}
|
||||
|
@ -8,6 +8,7 @@
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
||||
<uses-permission android:name="android.permission.CALL_PHONE" />
|
||||
<uses-permission android:name="android.permission.READ_CALL_LOG" />
|
||||
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
|
@ -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<RecentCall>, recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) :
|
||||
MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
|
||||
class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<RecentCall>, 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<Re
|
||||
|
||||
init {
|
||||
initDrawables()
|
||||
setupDragListener(true)
|
||||
}
|
||||
|
||||
override fun getActionMenuId() = 0
|
||||
override fun getActionMenuId() = R.menu.cab_remove_only
|
||||
|
||||
override fun prepareActionMode(menu: Menu) {}
|
||||
|
||||
override fun actionItemPressed(id: Int) {}
|
||||
override fun actionItemPressed(id: Int) {
|
||||
if (selectedKeys.isEmpty()) {
|
||||
return
|
||||
}
|
||||
|
||||
when (id) {
|
||||
R.id.cab_remove -> askConfirmRemove()
|
||||
}
|
||||
}
|
||||
|
||||
override fun getSelectableItemCount() = recentCalls.size
|
||||
|
||||
@ -51,7 +63,7 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<Re
|
||||
|
||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||
val recentCall = recentCalls[position]
|
||||
holder.bindView(recentCall, true, false) { itemView, layoutPosition ->
|
||||
holder.bindView(recentCall, true, true) { itemView, layoutPosition ->
|
||||
setupView(itemView, recentCall)
|
||||
}
|
||||
bindViewHolder(holder)
|
||||
@ -71,6 +83,35 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<Re
|
||||
outgoingCallIcon = activity.resources.getColoredDrawableWithColor(R.drawable.ic_outgoing_call_vector, activity.config.textColor)
|
||||
}
|
||||
|
||||
|
||||
private fun askConfirmRemove() {
|
||||
ConfirmationDialog(activity, activity.getString(R.string.remove_confirmation)) {
|
||||
removeRecents()
|
||||
}
|
||||
}
|
||||
|
||||
private fun removeRecents() {
|
||||
if (selectedKeys.isEmpty()) {
|
||||
return
|
||||
}
|
||||
|
||||
val callsToRemove = getSelectedItems()
|
||||
val positions = getSelectedItemPositions()
|
||||
val ids = selectedKeys.toMutableList() as ArrayList<Int>
|
||||
|
||||
RecentsHelper(activity).removeRecentCalls(ids) {
|
||||
recentCalls.removeAll(callsToRemove)
|
||||
activity.runOnUiThread {
|
||||
if (recentCalls.isEmpty()) {
|
||||
refreshRecentsListener.refreshRecents()
|
||||
finishActMode()
|
||||
} else {
|
||||
removeSelectedItems(positions)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun updateItems(newItems: ArrayList<RecentCall>) {
|
||||
if (newItems.hashCode() != recentCalls.hashCode()) {
|
||||
recentCalls = newItems.clone() as ArrayList<RecentCall>
|
||||
@ -79,8 +120,11 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<Re
|
||||
}
|
||||
}
|
||||
|
||||
private fun getSelectedItems() = recentCalls.filter { selectedKeys.contains(it.id) } as ArrayList<RecentCall>
|
||||
|
||||
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)
|
||||
|
@ -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<RecentCall>) {
|
||||
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()
|
||||
|
@ -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<RecentCall>) -> Unit) {
|
||||
ensureBackgroundThread {
|
||||
val recentCalls = ArrayList<RecentCall>()
|
||||
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<Int>, 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(',')
|
||||
}
|
||||
|
@ -0,0 +1,5 @@
|
||||
package com.simplemobiletools.dialer.interfaces
|
||||
|
||||
interface RefreshRecentsListener {
|
||||
fun refreshRecents()
|
||||
}
|
@ -9,6 +9,7 @@
|
||||
<string name="no_previous_calls">Er zijn geen gesprekken gevonden</string>
|
||||
<string name="could_not_access_the_call_history">Kon geen toegang krijgen tot de oproepgeschiedenis</string>
|
||||
<string name="request_access">Toegang verzoeken</string>
|
||||
<string name="remove_confirmation">Are you sure you want to remove the selected items from the Call History?</string>
|
||||
|
||||
<!-- Dialpad -->
|
||||
<string name="dialpad">Telefoonkiezer</string>
|
||||
|
@ -9,6 +9,7 @@
|
||||
<string name="no_previous_calls">Não existem chamadas anteriores</string>
|
||||
<string name="could_not_access_the_call_history">Não foi possível aceder ao histórico de chamadas</string>
|
||||
<string name="request_access">Pedir acesso</string>
|
||||
<string name="remove_confirmation">Are you sure you want to remove the selected items from the Call History?</string>
|
||||
|
||||
<!-- Dialpad -->
|
||||
<string name="dialpad">Marcador</string>
|
||||
|
@ -9,6 +9,7 @@
|
||||
<string name="no_previous_calls">No previous calls have been found</string>
|
||||
<string name="could_not_access_the_call_history">Could not access the call history</string>
|
||||
<string name="request_access">Request access</string>
|
||||
<string name="remove_confirmation">Are you sure you want to remove the selected items from the Call History?</string>
|
||||
|
||||
<!-- Dialpad -->
|
||||
<string name="dialpad">Dialpad</string>
|
||||
|
Reference in New Issue
Block a user