allow deleting items from Recents

This commit is contained in:
tibbi
2020-05-11 13:16:33 +02:00
parent 8dcd610811
commit b4683d946c
9 changed files with 87 additions and 15 deletions

View File

@ -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'
}

View File

@ -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" />

View File

@ -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)

View File

@ -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()

View File

@ -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(',')
}

View File

@ -0,0 +1,5 @@
package com.simplemobiletools.dialer.interfaces
interface RefreshRecentsListener {
fun refreshRecents()
}

View File

@ -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>

View File

@ -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>

View File

@ -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>