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 {
|
dependencies {
|
||||||
implementation 'com.simplemobiletools:commons:5.27.22'
|
implementation 'com.simplemobiletools:commons:5.27.23'
|
||||||
implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a'
|
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.READ_PHONE_STATE" />
|
||||||
<uses-permission android:name="android.permission.CALL_PHONE" />
|
<uses-permission android:name="android.permission.CALL_PHONE" />
|
||||||
<uses-permission android:name="android.permission.READ_CALL_LOG" />
|
<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.WAKE_LOCK" />
|
||||||
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
|
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
@ -8,18 +8,21 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
|
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
|
||||||
|
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
|
||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
import com.simplemobiletools.commons.helpers.SimpleContactsHelper
|
import com.simplemobiletools.commons.helpers.SimpleContactsHelper
|
||||||
import com.simplemobiletools.commons.views.MyRecyclerView
|
import com.simplemobiletools.commons.views.MyRecyclerView
|
||||||
import com.simplemobiletools.dialer.R
|
import com.simplemobiletools.dialer.R
|
||||||
import com.simplemobiletools.dialer.activities.SimpleActivity
|
import com.simplemobiletools.dialer.activities.SimpleActivity
|
||||||
import com.simplemobiletools.dialer.extensions.config
|
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 com.simplemobiletools.dialer.models.RecentCall
|
||||||
import kotlinx.android.synthetic.main.item_recent_call.view.*
|
import kotlinx.android.synthetic.main.item_recent_call.view.*
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<RecentCall>, recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) :
|
class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<RecentCall>, recyclerView: MyRecyclerView, val refreshRecentsListener: RefreshRecentsListener,
|
||||||
MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
|
itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
|
||||||
|
|
||||||
private lateinit var incomingCallIcon: Drawable
|
private lateinit var incomingCallIcon: Drawable
|
||||||
private lateinit var outgoingCallIcon: Drawable
|
private lateinit var outgoingCallIcon: Drawable
|
||||||
@ -27,13 +30,22 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<Re
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
initDrawables()
|
initDrawables()
|
||||||
|
setupDragListener(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getActionMenuId() = 0
|
override fun getActionMenuId() = R.menu.cab_remove_only
|
||||||
|
|
||||||
override fun prepareActionMode(menu: Menu) {}
|
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
|
override fun getSelectableItemCount() = recentCalls.size
|
||||||
|
|
||||||
@ -51,7 +63,7 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<Re
|
|||||||
|
|
||||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
val recentCall = recentCalls[position]
|
val recentCall = recentCalls[position]
|
||||||
holder.bindView(recentCall, true, false) { itemView, layoutPosition ->
|
holder.bindView(recentCall, true, true) { itemView, layoutPosition ->
|
||||||
setupView(itemView, recentCall)
|
setupView(itemView, recentCall)
|
||||||
}
|
}
|
||||||
bindViewHolder(holder)
|
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)
|
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>) {
|
fun updateItems(newItems: ArrayList<RecentCall>) {
|
||||||
if (newItems.hashCode() != recentCalls.hashCode()) {
|
if (newItems.hashCode() != recentCalls.hashCode()) {
|
||||||
recentCalls = newItems.clone() as ArrayList<RecentCall>
|
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) {
|
private fun setupView(view: View, call: RecentCall) {
|
||||||
view.apply {
|
view.apply {
|
||||||
|
item_recents_frame.isSelected = selectedKeys.contains(call.id)
|
||||||
item_recents_name.apply {
|
item_recents_name.apply {
|
||||||
text = call.name
|
text = call.name
|
||||||
setTextColor(textColor)
|
setTextColor(textColor)
|
||||||
|
@ -3,19 +3,19 @@ package com.simplemobiletools.dialer.fragments
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import com.simplemobiletools.commons.extensions.*
|
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.R
|
||||||
import com.simplemobiletools.dialer.activities.SimpleActivity
|
import com.simplemobiletools.dialer.activities.SimpleActivity
|
||||||
import com.simplemobiletools.dialer.adapters.ContactsAdapter
|
|
||||||
import com.simplemobiletools.dialer.adapters.RecentCallsAdapter
|
import com.simplemobiletools.dialer.adapters.RecentCallsAdapter
|
||||||
import com.simplemobiletools.dialer.extensions.config
|
import com.simplemobiletools.dialer.extensions.config
|
||||||
import com.simplemobiletools.dialer.helpers.RecentsHelper
|
import com.simplemobiletools.dialer.helpers.RecentsHelper
|
||||||
|
import com.simplemobiletools.dialer.interfaces.RefreshRecentsListener
|
||||||
import com.simplemobiletools.dialer.models.RecentCall
|
import com.simplemobiletools.dialer.models.RecentCall
|
||||||
import kotlinx.android.synthetic.main.fragment_recents.view.*
|
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() {
|
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
|
R.string.no_previous_calls
|
||||||
} else {
|
} else {
|
||||||
R.string.could_not_access_the_call_history
|
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 primaryColorChanged(color: Int) {}
|
||||||
|
|
||||||
|
override fun refreshRecents() {
|
||||||
|
}
|
||||||
|
|
||||||
fun updateRecents(recents: ArrayList<RecentCall>) {
|
fun updateRecents(recents: ArrayList<RecentCall>) {
|
||||||
if (recents.isEmpty()) {
|
if (recents.isEmpty()) {
|
||||||
recents_placeholder.beVisible()
|
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()
|
recents_list.beGone()
|
||||||
} else {
|
} else {
|
||||||
recents_placeholder.beGone()
|
recents_placeholder.beGone()
|
||||||
@ -52,7 +55,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
|
|||||||
|
|
||||||
val currAdapter = recents_list.adapter
|
val currAdapter = recents_list.adapter
|
||||||
if (currAdapter == null) {
|
if (currAdapter == null) {
|
||||||
RecentCallsAdapter(activity as SimpleActivity, recents, recents_list) {
|
RecentCallsAdapter(activity as SimpleActivity, recents, recents_list, this) {
|
||||||
activity?.launchCallIntent((it as RecentCall).phoneNumber)
|
activity?.launchCallIntent((it as RecentCall).phoneNumber)
|
||||||
}.apply {
|
}.apply {
|
||||||
recents_list.adapter = this
|
recents_list.adapter = this
|
||||||
@ -64,7 +67,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun requestCallLogPermission() {
|
private fun requestCallLogPermission() {
|
||||||
activity?.handlePermission(PERMISSION_READ_CALL_LOG) {
|
activity?.handlePermission(PERMISSION_WRITE_CALL_LOG) {
|
||||||
if (it) {
|
if (it) {
|
||||||
recents_placeholder.text = context.getString(R.string.no_previous_calls)
|
recents_placeholder.text = context.getString(R.string.no_previous_calls)
|
||||||
recents_placeholder_2.beGone()
|
recents_placeholder_2.beGone()
|
||||||
|
@ -4,8 +4,9 @@ import android.annotation.SuppressLint
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.provider.CallLog.Calls
|
import android.provider.CallLog.Calls
|
||||||
import com.simplemobiletools.commons.extensions.*
|
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.helpers.ensureBackgroundThread
|
||||||
|
import com.simplemobiletools.commons.overloads.times
|
||||||
import com.simplemobiletools.dialer.models.RecentCall
|
import com.simplemobiletools.dialer.models.RecentCall
|
||||||
|
|
||||||
class RecentsHelper(private val context: Context) {
|
class RecentsHelper(private val context: Context) {
|
||||||
@ -13,7 +14,7 @@ class RecentsHelper(private val context: Context) {
|
|||||||
fun getRecentCalls(callback: (ArrayList<RecentCall>) -> Unit) {
|
fun getRecentCalls(callback: (ArrayList<RecentCall>) -> Unit) {
|
||||||
ensureBackgroundThread {
|
ensureBackgroundThread {
|
||||||
val recentCalls = ArrayList<RecentCall>()
|
val recentCalls = ArrayList<RecentCall>()
|
||||||
if (!context.hasPermission(PERMISSION_READ_CALL_LOG)) {
|
if (!context.hasPermission(PERMISSION_WRITE_CALL_LOG)) {
|
||||||
callback(recentCalls)
|
callback(recentCalls)
|
||||||
return@ensureBackgroundThread
|
return@ensureBackgroundThread
|
||||||
}
|
}
|
||||||
@ -52,4 +53,19 @@ class RecentsHelper(private val context: Context) {
|
|||||||
callback(recentCalls)
|
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="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="could_not_access_the_call_history">Kon geen toegang krijgen tot de oproepgeschiedenis</string>
|
||||||
<string name="request_access">Toegang verzoeken</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 -->
|
<!-- Dialpad -->
|
||||||
<string name="dialpad">Telefoonkiezer</string>
|
<string name="dialpad">Telefoonkiezer</string>
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
<string name="no_previous_calls">Não existem chamadas anteriores</string>
|
<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="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="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 -->
|
<!-- Dialpad -->
|
||||||
<string name="dialpad">Marcador</string>
|
<string name="dialpad">Marcador</string>
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
<string name="no_previous_calls">No previous calls have been found</string>
|
<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="could_not_access_the_call_history">Could not access the call history</string>
|
||||||
<string name="request_access">Request access</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 -->
|
<!-- Dialpad -->
|
||||||
<string name="dialpad">Dialpad</string>
|
<string name="dialpad">Dialpad</string>
|
||||||
|
Reference in New Issue
Block a user