remove everything related to Recents, due to Googles latest security rules

This commit is contained in:
tibbi 2019-01-05 17:27:11 +01:00
parent 0a150a9f82
commit ea520ab7a8
31 changed files with 22 additions and 591 deletions

View File

@ -12,10 +12,7 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
<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.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS"/>
@ -59,15 +56,6 @@
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:mimeType="vnd.android.cursor.dir/calls"/>
</intent-filter>
</activity>
<activity

View File

@ -37,10 +37,8 @@ import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_contacts.*
import kotlinx.android.synthetic.main.fragment_favorites.*
import kotlinx.android.synthetic.main.fragment_groups.*
import kotlinx.android.synthetic.main.fragment_recents.*
import java.io.FileOutputStream
class MainActivity : SimpleActivity(), RefreshContactsListener {
private var isSearchOpen = false
private var searchMenuItem: MenuItem? = null
@ -64,16 +62,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
appLaunched(BuildConfig.APPLICATION_ID)
setupTabColors()
handlePermission(PERMISSION_READ_CALL_LOG) {
if (it) {
handlePermission(PERMISSION_WRITE_CALL_LOG) {
checkContactPermissions()
}
} else {
checkContactPermissions()
}
}
storeStateVariables()
checkWhatsNewDialog()
}
@ -189,9 +178,9 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
val currentFragment = getCurrentFragment()
menu.apply {
findItem(R.id.search).isVisible = currentFragment != groups_fragment && currentFragment != recents_fragment
findItem(R.id.sort).isVisible = currentFragment != groups_fragment && currentFragment != recents_fragment
findItem(R.id.filter).isVisible = currentFragment != groups_fragment && currentFragment != recents_fragment
findItem(R.id.search).isVisible = currentFragment != groups_fragment
findItem(R.id.sort).isVisible = currentFragment != groups_fragment
findItem(R.id.filter).isVisible = currentFragment != groups_fragment
}
setupSearch(menu)
return true
@ -268,10 +257,6 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
fragments.add(favorites_fragment)
}
if (showTabs and RECENTS_TAB_MASK != 0) {
fragments.add(recents_fragment)
}
if (showTabs and GROUPS_TAB_MASK != 0) {
fragments.add(groups_fragment)
}
@ -371,11 +356,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
// selecting the proper tab sometimes glitches, add an extra selector to make sure we have it right
main_tabs_holder.onGlobalLayout {
Handler().postDelayed({
if (intent?.action == Intent.ACTION_VIEW && intent.type == "vnd.android.cursor.dir/calls") {
main_tabs_holder.getTabAt(getRecentsTabIndex())?.select()
} else {
main_tabs_holder.getTabAt(config.lastUsedViewPagerPage)?.select()
}
invalidateOptionsMenu()
}, 100L)
}
@ -392,7 +373,6 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
val drawableId = when (position) {
LOCATION_CONTACTS_TAB -> R.drawable.ic_person
LOCATION_FAVORITES_TAB -> R.drawable.ic_star_on
LOCATION_RECENTS_TAB -> R.drawable.ic_clock
else -> R.drawable.ic_group
}
@ -529,52 +509,16 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
favorites_fragment?.refreshContacts(contacts)
}
if (refreshTabsMask and RECENTS_TAB_MASK != 0) {
recents_fragment?.refreshContacts(contacts)
}
if (refreshTabsMask and GROUPS_TAB_MASK != 0) {
if (refreshTabsMask == GROUPS_TAB_MASK) {
groups_fragment.skipHashComparing = true
}
groups_fragment?.refreshContacts(contacts)
}
if (refreshTabsMask and RECENTS_TAB_MASK != 0) {
ContactsHelper(this).getRecents {
it.filter { it.name == null }.forEach {
val namelessCall = it
val contact = contacts.firstOrNull { it.doesContainPhoneNumber(namelessCall.number) }
if (contact != null) {
it.name = contact.getNameToDisplay()
}
}
runOnUiThread {
recents_fragment?.updateRecentCalls(it)
}
}
}
}
}
private fun getAllFragments() = arrayListOf(contacts_fragment, favorites_fragment, recents_fragment, groups_fragment)
private fun getRecentsTabIndex(): Int {
var index = 0
if (config.showTabs and RECENTS_TAB_MASK == 0) {
return index
}
if (config.showTabs and CONTACTS_TAB_MASK != 0) {
index++
}
if (config.showTabs and FAVORITES_TAB_MASK != 0) {
index++
}
return index
}
private fun getAllFragments() = arrayListOf(contacts_fragment, favorites_fragment, groups_fragment)
private fun checkWhatsNewDialog() {
arrayListOf<Release>().apply {

View File

@ -1,150 +0,0 @@
package com.simplemobiletools.contacts.pro.adapters
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.helpers.isNougatPlus
import com.simplemobiletools.commons.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.SimpleActivity
import com.simplemobiletools.contacts.pro.extensions.addBlockedNumber
import com.simplemobiletools.contacts.pro.extensions.config
import com.simplemobiletools.contacts.pro.extensions.startCallIntent
import com.simplemobiletools.contacts.pro.helpers.ContactsHelper
import com.simplemobiletools.contacts.pro.helpers.RECENTS_TAB_MASK
import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener
import com.simplemobiletools.contacts.pro.models.RecentCall
import kotlinx.android.synthetic.main.item_recent_call.view.*
import java.util.*
class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<RecentCall>, val refreshListener: RefreshContactsListener?, recyclerView: MyRecyclerView,
fastScroller: FastScroller, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
private val showPhoneNumbers = activity.config.showPhoneNumbers
init {
setupDragListener(true)
}
override fun getActionMenuId() = R.menu.cab_recent_calls
override fun prepareActionMode(menu: Menu) {
val selectedItems = getSelectedItems()
if (selectedItems.isEmpty()) {
return
}
menu.apply {
findItem(R.id.cab_block_number).isVisible = isNougatPlus()
findItem(R.id.cab_block_number).title = activity.getString(if (isOneItemSelected()) R.string.block_number else R.string.block_numbers)
findItem(R.id.cab_call_number).isVisible = isOneItemSelected() && selectedItems.first().name == null
}
}
override fun actionItemPressed(id: Int) {
if (selectedKeys.isEmpty()) {
return
}
when (id) {
R.id.cab_call_number -> callNumber()
R.id.cab_select_all -> selectAll()
R.id.cab_delete -> askConfirmDelete()
R.id.cab_block_number -> blockNumber()
}
}
override fun getSelectableItemCount() = recentCalls.size
override fun getIsItemSelectable(position: Int) = true
override fun getItemSelectionKey(position: Int) = recentCalls.getOrNull(position)?.id
override fun getItemKeyPosition(key: Int) = recentCalls.indexOfFirst { it.id == key }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_recent_call, parent)
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
val recentCall = recentCalls[position]
holder.bindView(recentCall, true, true) { itemView, layoutPosition ->
setupView(itemView, recentCall)
}
bindViewHolder(holder)
}
override fun getItemCount() = recentCalls.size
fun updateItems(newItems: ArrayList<RecentCall>) {
recentCalls = newItems
notifyDataSetChanged()
finishActMode()
fastScroller?.measureRecyclerView()
}
private fun callNumber() {
(activity as SimpleActivity).startCallIntent(getSelectedItems().first().number)
}
private fun askConfirmDelete() {
ConfirmationDialog(activity) {
deleteRecentCalls()
}
}
private fun deleteRecentCalls() {
if (selectedKeys.isEmpty()) {
return
}
val callsToRemove = getSelectedItems()
val positions = getSelectedItemPositions()
ContactsHelper(activity).removeRecentCalls(callsToRemove.map { it.id } as ArrayList<Int>)
recentCalls.removeAll(callsToRemove)
if (recentCalls.isEmpty()) {
refreshListener?.refreshContacts(RECENTS_TAB_MASK)
finishActMode()
} else {
removeSelectedItems(positions)
}
}
private fun blockNumber() {
Thread {
getSelectedItems().forEach {
activity.addBlockedNumber(it.number)
}
refreshListener?.refreshContacts(RECENTS_TAB_MASK)
activity.runOnUiThread {
finishActMode()
}
}.start()
}
private fun getSelectedItems() = recentCalls.filter { selectedKeys.contains(it.id) } as ArrayList<RecentCall>
private fun setupView(view: View, recentCall: RecentCall) {
view.apply {
recent_call_frame?.isSelected = selectedKeys.contains(recentCall.id)
recent_call_name.apply {
text = recentCall.name ?: recentCall.number
setTextColor(textColor)
}
recent_call_number.apply {
beVisibleIf(showPhoneNumbers && recentCall.name != null)
text = recentCall.number
setTextColor(textColor)
}
recent_call_date_time.apply {
text = recentCall.dateTime
setTextColor(textColor)
}
}
}
}

View File

@ -7,7 +7,10 @@ import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.MainActivity
import com.simplemobiletools.contacts.pro.extensions.config
import com.simplemobiletools.contacts.pro.fragments.MyViewPagerFragment
import com.simplemobiletools.contacts.pro.helpers.*
import com.simplemobiletools.contacts.pro.helpers.CONTACTS_TAB_MASK
import com.simplemobiletools.contacts.pro.helpers.FAVORITES_TAB_MASK
import com.simplemobiletools.contacts.pro.helpers.GROUPS_TAB_MASK
import com.simplemobiletools.contacts.pro.helpers.tabsList
class ViewPagerAdapter(val activity: MainActivity) : PagerAdapter() {
private val showTabs = activity.config.showTabs
@ -42,10 +45,6 @@ class ViewPagerAdapter(val activity: MainActivity) : PagerAdapter() {
fragments.add(R.layout.fragment_favorites)
}
if (showTabs and RECENTS_TAB_MASK != 0) {
fragments.add(R.layout.fragment_recents)
}
if (showTabs and GROUPS_TAB_MASK != 0) {
fragments.add(R.layout.fragment_groups)
}

View File

@ -6,7 +6,10 @@ import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.views.MyAppCompatCheckbox
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.extensions.config
import com.simplemobiletools.contacts.pro.helpers.*
import com.simplemobiletools.contacts.pro.helpers.ALL_TABS_MASK
import com.simplemobiletools.contacts.pro.helpers.CONTACTS_TAB_MASK
import com.simplemobiletools.contacts.pro.helpers.FAVORITES_TAB_MASK
import com.simplemobiletools.contacts.pro.helpers.GROUPS_TAB_MASK
class ManageVisibleTabsDialog(val activity: BaseSimpleActivity) {
private var view = activity.layoutInflater.inflate(R.layout.dialog_manage_visible_tabs, null)
@ -16,7 +19,6 @@ class ManageVisibleTabsDialog(val activity: BaseSimpleActivity) {
tabs.apply {
put(CONTACTS_TAB_MASK, R.id.manage_visible_tabs_contacts)
put(FAVORITES_TAB_MASK, R.id.manage_visible_tabs_favorites)
put(RECENTS_TAB_MASK, R.id.manage_visible_tabs_recents)
put(GROUPS_TAB_MASK, R.id.manage_visible_tabs_groups)
}

View File

@ -15,7 +15,6 @@ import com.simplemobiletools.contacts.pro.activities.MainActivity
import com.simplemobiletools.contacts.pro.activities.SimpleActivity
import com.simplemobiletools.contacts.pro.adapters.ContactsAdapter
import com.simplemobiletools.contacts.pro.adapters.GroupsAdapter
import com.simplemobiletools.contacts.pro.adapters.RecentCallsAdapter
import com.simplemobiletools.contacts.pro.extensions.config
import com.simplemobiletools.contacts.pro.extensions.contactClicked
import com.simplemobiletools.contacts.pro.extensions.getVisibleContactSources
@ -59,11 +58,6 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fragment_placeholder.text = activity.getString(R.string.no_group_created)
fragment_placeholder_2.text = activity.getString(R.string.create_group)
}
this is RecentsFragment -> {
fragment_fab.beGone()
fragment_placeholder.text = activity.getString(R.string.no_recent_calls_found)
fragment_placeholder_2.text = activity.getString(R.string.request_the_required_permissions)
}
}
}
}
@ -71,7 +65,6 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fun textColorChanged(color: Int) {
when {
this is GroupsFragment -> (fragment_list.adapter as GroupsAdapter).updateTextColor(color)
this is RecentsFragment -> (fragment_list.adapter as RecentCallsAdapter).updateTextColor(color)
else -> (fragment_list.adapter as ContactsAdapter).apply {
updateTextColor(color)
initDrawables()
@ -88,7 +81,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
}
fun startNameWithSurnameChanged(startNameWithSurname: Boolean) {
if (this !is GroupsFragment && this !is RecentsFragment) {
if (this !is GroupsFragment) {
(fragment_list.adapter as? ContactsAdapter)?.apply {
config.sorting = if (startNameWithSurname) SORT_BY_SURNAME else SORT_BY_FIRST_NAME
this@MyViewPagerFragment.activity!!.refreshContacts(CONTACTS_TAB_MASK or FAVORITES_TAB_MASK)
@ -99,7 +92,6 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fun refreshContacts(contacts: ArrayList<Contact>) {
if ((config.showTabs and CONTACTS_TAB_MASK == 0 && this is ContactsFragment) ||
(config.showTabs and FAVORITES_TAB_MASK == 0 && this is FavoritesFragment) ||
(config.showTabs and RECENTS_TAB_MASK == 0 && this is RecentsFragment) ||
(config.showTabs and GROUPS_TAB_MASK == 0 && this is GroupsFragment)) {
return
}
@ -114,7 +106,6 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
val filtered = when {
this is GroupsFragment -> contacts
this is FavoritesFragment -> contacts.filter { it.starred == 1 } as ArrayList<Contact>
this is RecentsFragment -> ArrayList()
else -> {
val contactSources = activity!!.getVisibleContactSources()
contacts.filter { contactSources.contains(it.source) } as ArrayList<Contact>
@ -133,7 +124,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
private fun setupContacts(contacts: ArrayList<Contact>) {
if (this is GroupsFragment) {
setupGroupsAdapter(contacts)
} else if (this !is RecentsFragment) {
} else {
setupContactsFavoritesAdapter(contacts)
}
@ -219,7 +210,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
showContactThumbnails = showThumbnails
notifyDataSetChanged()
}
} else if (this !is RecentsFragment) {
} else {
(fragment_list.adapter as? ContactsAdapter)?.apply {
showContactThumbnails = showThumbnails
notifyDataSetChanged()

View File

@ -1,89 +0,0 @@
package com.simplemobiletools.contacts.pro.fragments
import android.annotation.TargetApi
import android.content.Context
import android.content.Intent
import android.os.Build
import android.telecom.TelecomManager
import android.util.AttributeSet
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.hasPermission
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CALL_LOG
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CALL_LOG
import com.simplemobiletools.commons.helpers.isMarshmallowPlus
import com.simplemobiletools.contacts.pro.activities.InsertOrEditContactActivity
import com.simplemobiletools.contacts.pro.adapters.RecentCallsAdapter
import com.simplemobiletools.contacts.pro.extensions.contactClicked
import com.simplemobiletools.contacts.pro.extensions.isDefaultDialer
import com.simplemobiletools.contacts.pro.extensions.normalizeNumber
import com.simplemobiletools.contacts.pro.helpers.IS_FROM_SIMPLE_CONTACTS
import com.simplemobiletools.contacts.pro.helpers.KEY_PHONE
import com.simplemobiletools.contacts.pro.helpers.RECENTS_TAB_MASK
import com.simplemobiletools.contacts.pro.models.Contact
import com.simplemobiletools.contacts.pro.models.RecentCall
import kotlinx.android.synthetic.main.fragment_layout.view.*
class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) {
override fun fabClicked() {}
@TargetApi(Build.VERSION_CODES.M)
override fun placeholderClicked() {
if (!isMarshmallowPlus() || (isMarshmallowPlus() && context.isDefaultDialer())) {
activity!!.handlePermission(PERMISSION_WRITE_CALL_LOG) {
if (it) {
activity!!.handlePermission(PERMISSION_READ_CALL_LOG) {
activity?.refreshContacts(RECENTS_TAB_MASK)
}
}
}
} else {
val intent = Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER).putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, context.packageName)
context.startActivity(intent)
}
}
fun updateRecentCalls(recentCalls: ArrayList<RecentCall>) {
if (activity == null || activity!!.isDestroyed) {
return
}
fragment_placeholder.beVisibleIf(recentCalls.isEmpty())
fragment_placeholder_2.beVisibleIf(recentCalls.isEmpty() && !activity!!.hasPermission(PERMISSION_WRITE_CALL_LOG))
fragment_list.beVisibleIf(recentCalls.isNotEmpty())
val currAdapter = fragment_list.adapter
if (currAdapter == null) {
RecentCallsAdapter(activity!!, recentCalls, activity, fragment_list, fragment_fastscroller) {
val recentCall = (it as RecentCall).number.normalizeNumber()
var selectedContact: Contact? = null
for (contact in allContacts) {
if (contact.doesContainPhoneNumber(recentCall)) {
selectedContact = contact
break
}
}
if (selectedContact != null) {
activity?.contactClicked(selectedContact)
} else {
Intent(context, InsertOrEditContactActivity::class.java).apply {
action = Intent.ACTION_INSERT_OR_EDIT
putExtra(KEY_PHONE, recentCall)
putExtra(IS_FROM_SIMPLE_CONTACTS, true)
context.startActivity(this)
}
}
}.apply {
addVerticalDividers(true)
fragment_list.adapter = this
}
fragment_fastscroller.setViews(fragment_list) {
val item = (fragment_list.adapter as RecentCallsAdapter).recentCalls.getOrNull(it)
fragment_fastscroller.updateBubbleText(item?.name ?: item?.number ?: "")
}
} else {
(currAdapter as RecentCallsAdapter).updateItems(recentCalls)
}
}
}

View File

@ -35,21 +35,18 @@ const val KEY_NAME = "name"
const val LOCATION_CONTACTS_TAB = 0
const val LOCATION_FAVORITES_TAB = 1
const val LOCATION_RECENTS_TAB = 2
const val LOCATION_GROUPS_TAB = 3
const val LOCATION_GROUP_CONTACTS = 4
const val LOCATION_DIALPAD = 5
const val LOCATION_INSERT_OR_EDIT = 6
const val LOCATION_GROUPS_TAB = 2
const val LOCATION_GROUP_CONTACTS = 3
const val LOCATION_DIALPAD = 4
const val LOCATION_INSERT_OR_EDIT = 5
const val CONTACTS_TAB_MASK = 1
const val FAVORITES_TAB_MASK = 2
const val RECENTS_TAB_MASK = 4
const val GROUPS_TAB_MASK = 8
const val ALL_TABS_MASK = 15
const val ALL_TABS_MASK = CONTACTS_TAB_MASK or FAVORITES_TAB_MASK or GROUPS_TAB_MASK
val tabsList = arrayListOf(CONTACTS_TAB_MASK,
FAVORITES_TAB_MASK,
RECENTS_TAB_MASK,
GROUPS_TAB_MASK
)

View File

@ -2,14 +2,12 @@ package com.simplemobiletools.contacts.pro.helpers
import android.accounts.Account
import android.accounts.AccountManager
import android.annotation.SuppressLint
import android.content.*
import android.database.Cursor
import android.graphics.Bitmap
import android.net.Uri
import android.os.Handler
import android.os.Looper
import android.provider.CallLog
import android.provider.ContactsContract
import android.provider.ContactsContract.CommonDataKinds
import android.provider.ContactsContract.CommonDataKinds.Nickname
@ -23,7 +21,6 @@ import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.extensions.*
import com.simplemobiletools.contacts.pro.models.*
import com.simplemobiletools.contacts.pro.overloads.times
import java.text.SimpleDateFormat
import java.util.*
import kotlin.collections.ArrayList
@ -1552,93 +1549,4 @@ class ContactsHelper(val context: Context) {
context.showErrorToast(e)
}
}
@SuppressLint("MissingPermission")
fun getRecents(callback: (ArrayList<RecentCall>) -> Unit) {
Thread {
val calls = ArrayList<RecentCall>()
if (!context.hasPermission(PERMISSION_WRITE_CALL_LOG) || !context.hasPermission(PERMISSION_READ_CALL_LOG)) {
callback(calls)
return@Thread
}
val blockedNumbers = context.getBlockedNumbers()
val uri = CallLog.Calls.CONTENT_URI
val projection = arrayOf(
CallLog.Calls._ID,
CallLog.Calls.NUMBER,
CallLog.Calls.DATE,
CallLog.Calls.CACHED_NAME
)
val sorting = "${CallLog.Calls._ID} DESC LIMIT 100"
val currentDate = Date(System.currentTimeMillis())
val currentYear = SimpleDateFormat("yyyy", Locale.getDefault()).format(currentDate)
val todayDate = SimpleDateFormat("dd MMM yyyy", Locale.getDefault()).format(currentDate)
val yesterdayDate = SimpleDateFormat("dd MMM yyyy", Locale.getDefault()).format(Date(System.currentTimeMillis() - DAY_SECONDS * 1000))
val yesterday = context.getString(R.string.yesterday)
val timeFormat = if (context.config.use24HourFormat) "HH:mm" else "h:mm a"
var prevNumber = ""
var cursor: Cursor? = null
try {
cursor = context.contentResolver.query(uri, projection, null, null, sorting)
if (cursor?.moveToFirst() == true) {
do {
val id = cursor.getIntValue(CallLog.Calls._ID)
val number = cursor.getStringValue(CallLog.Calls.NUMBER)
val date = cursor.getLongValue(CallLog.Calls.DATE)
val name = cursor.getStringValue(CallLog.Calls.CACHED_NAME)
if (number == prevNumber) {
continue
}
if (blockedNumbers.any { it.number == number || it.normalizedNumber == number }) {
continue
}
var formattedDate = SimpleDateFormat("dd MMM yyyy, $timeFormat", Locale.getDefault()).format(Date(date))
val datePart = formattedDate.substring(0, 11)
when {
datePart == todayDate -> formattedDate = formattedDate.substring(12)
datePart == yesterdayDate -> formattedDate = yesterday + formattedDate.substring(11)
formattedDate.substring(7, 11) == currentYear -> formattedDate = formattedDate.substring(0, 6) + formattedDate.substring(11)
}
prevNumber = number
val recentCall = RecentCall(id, number, formattedDate, name)
calls.add(recentCall)
} while (cursor.moveToNext())
}
} finally {
cursor?.close()
}
callback(calls)
}.start()
}
fun removeRecentCalls(ids: ArrayList<Int>) {
Thread {
try {
val operations = ArrayList<ContentProviderOperation>()
val selection = "${CallLog.Calls._ID} = ?"
ids.forEach {
ContentProviderOperation.newDelete(CallLog.Calls.CONTENT_URI).apply {
val selectionArgs = arrayOf(it.toString())
withSelection(selection, selectionArgs)
operations.add(build())
}
if (operations.size % BATCH_SIZE == 0) {
context.contentResolver.applyBatch(CallLog.AUTHORITY, operations)
operations.clear()
}
}
context.contentResolver.applyBatch(CallLog.AUTHORITY, operations)
} catch (e: Exception) {
context.showErrorToast(e)
}
}.start()
}
}

View File

@ -1,3 +0,0 @@
package com.simplemobiletools.contacts.pro.models
data class RecentCall(var id: Int, var number: String, var dateTime: String, var name: String?)

View File

@ -30,14 +30,6 @@
android:paddingTop="@dimen/activity_margin"
android:text="@string/favorites"/>
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/manage_visible_tabs_recents"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:text="@string/recent_calls"/>
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/manage_visible_tabs_groups"
android:layout_width="match_parent"

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<com.simplemobiletools.contacts.pro.fragments.RecentsFragment
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recents_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/fragment_layout"/>
</com.simplemobiletools.contacts.pro.fragments.RecentsFragment>

View File

@ -1,63 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/recent_call_frame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:foreground="@drawable/selector">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/recent_call_holder"
android:layout_width="match_parent"
android:layout_height="@dimen/contact_item_with_number_height"
android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin">
<TextView
android:id="@+id/recent_call_name"
android:layout_width="0dp"
android:layout_height="0dp"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:paddingRight="@dimen/activity_margin"
android:textSize="@dimen/big_text_size"
app:layout_constraintBottom_toTopOf="@+id/recent_call_number"
app:layout_constraintEnd_toStartOf="@+id/recent_call_date_time"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="John Doe"/>
<TextView
android:id="@+id/recent_call_number"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_below="@+id/recent_call_name"
android:maxLines="1"
android:paddingBottom="@dimen/tiny_margin"
android:textSize="@dimen/bigger_text_size"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/recent_call_date_time"
app:layout_constraintStart_toStartOf="parent"
tools:text="0123 456 789"/>
<TextView
android:id="@+id/recent_call_date_time"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:maxLines="1"
android:textSize="@dimen/normal_text_size"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteY="0dp"
tools:text="Yesterday, 17:00"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>

View File

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/cab_call_number"
android:icon="@drawable/ic_phone"
android:title="@string/call_number"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/cab_select_all"
android:icon="@drawable/ic_select_all"
android:title="@string/select_all"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/cab_block_number"
android:icon="@drawable/ic_block"
android:title="@string/block_number"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/cab_delete"
android:icon="@drawable/ic_delete"
android:title="@string/delete"
app:showAsAction="ifRoom"/>
</menu>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">Add to an existing contact</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_to_default">Set to default</string>
<string name="call_number">Call number</string>
<!-- Placeholders -->
<string name="no_contacts_found">No contacts found</string>
<string name="no_contacts_with_emails">No contacts with emails have been found</string>
<string name="no_contacts_with_phone_numbers">No contacts with phone numbers have been found</string>
<string name="no_recent_calls_found">No recent calls found</string>
<string name="new_contact">Yeni kontakt</string>
<string name="edit_contact">Redaktə et</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">Göstərilən nişanları idarə et</string>
<string name="contacts">Kontaktlar</string>
<string name="favorites">Sevimlilər</string>
<string name="recent_calls">Hazırki zənglər</string>
<string name="show_call_confirmation_dialog">Zəngə başlamazdan əvvəl zəng təsdiq pəncərəsi göstər</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">Zu einem existierenden Kontakt hinzufügen</string>
<string name="must_make_default_dialer">Du musst diese App als Standardtelefonie-App einstellen, um Nummern blockieren zu können.</string>
<string name="set_to_default">Als Standard auswählen</string>
<string name="call_number">Call number</string>
<!-- Placeholders -->
<string name="no_contacts_found">Keine Kontakte gefunden</string>
<string name="no_contacts_with_emails">Keine Kontakte mit E-Mailadressen gefunden</string>
<string name="no_contacts_with_phone_numbers">Keine Kontakte mit Telefonnummern gefunden</string>
<string name="no_recent_calls_found">Keine kürzlichen Anrufe gefunden</string>
<string name="new_contact">Neuer Kontakt</string>
<string name="edit_contact">Kontakt bearbeiten</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">Anzuzeigende Tabs festlegen</string>
<string name="contacts">Kontakte</string>
<string name="favorites">Favoriten</string>
<string name="recent_calls">Anrufliste</string>
<string name="show_call_confirmation_dialog">Bestätigungsdialog zeigen, bevor ein Anruf durchgeführt wird</string>
<string name="show_only_contacts_with_numbers">Nur Kontakte mit Telefonnummern anzeigen</string>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">Προσθήκη σε μια υπάρχουσα Επαφή</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_to_default">Set to default</string>
<string name="call_number">Call number</string>
<!-- Placeholders -->
<string name="no_contacts_found">No contacts found</string>
<string name="no_contacts_with_emails">No contacts with emails have been found</string>
<string name="no_contacts_with_phone_numbers">No contacts with phone numbers have been found</string>
<string name="no_recent_calls_found">No recent calls found</string>
<string name="new_contact">Νέα επαφή</string>
<string name="edit_contact">Επεξεργασία επαφής</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">Διαχείριση εμφανιζόμενων καρτελών</string>
<string name="contacts">Επαφές</string>
<string name="favorites">Αγαπημένες</string>
<string name="recent_calls">Πρόσφατες Κλήσεις</string>
<string name="show_call_confirmation_dialog">Εμφάνιση διαλόγου επιβεβαίωσης πριν από την έναρξη μιας κλήσης</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">Add to an existing contact</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_to_default">Set to default</string>
<string name="call_number">Call number</string>
<!-- Placeholders -->
<string name="no_contacts_found">No contacts found</string>
<string name="no_contacts_with_emails">No contacts with emails have been found</string>
<string name="no_contacts_with_phone_numbers">No contacts with phone numbers have been found</string>
<string name="no_recent_calls_found">No recent calls found</string>
<string name="new_contact">Kontaktu berria</string>
<string name="edit_contact">Editatu taldea</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">Kudeatu erakutsitako fitxak</string>
<string name="contacts">Kontaktuak</string>
<string name="favorites">Gogokoak</string>
<string name="recent_calls">Azken deiak</string>
<string name="show_call_confirmation_dialog">Erakutsi egiaztatze mezua dei bat hasi baino lehen</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">Ajouter à un contact existant</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_to_default">Set to default</string>
<string name="call_number">Call number</string>
<!-- Placeholders -->
<string name="no_contacts_found">Aucun contact n\'a été trouvé</string>
<string name="no_contacts_with_emails">Aucun contact avec une adresse de courriel n\'a été trouvé</string>
<string name="no_contacts_with_phone_numbers">Aucun contact avec un numéro de téléphone n\'a été trouvé</string>
<string name="no_recent_calls_found">Aucun appel récent n\'a été trouvé</string>
<string name="new_contact">Nouveau contact</string>
<string name="edit_contact">Modifier contact</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">Gérer les onglets affichés</string>
<string name="contacts">Contacts</string>
<string name="favorites">Favoris</string>
<string name="recent_calls">Appels récents</string>
<string name="show_call_confirmation_dialog">Afficher une demande de confirmation avant de démarrer un appel</string>
<string name="show_only_contacts_with_numbers">Afficher uniquement les contacts avec un numéro de téléphone</string>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">Add to an existing contact</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_to_default">Set to default</string>
<string name="call_number">Call number</string>
<!-- Placeholders -->
<string name="no_contacts_found">No contacts found</string>
<string name="no_contacts_with_emails">No contacts with emails have been found</string>
<string name="no_contacts_with_phone_numbers">No contacts with phone numbers have been found</string>
<string name="no_recent_calls_found">No recent calls found</string>
<string name="new_contact">Novi kontakt</string>
<string name="edit_contact">Uredi kontakt</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">Upravljaj prikazanim karticama</string>
<string name="contacts">Kontakti</string>
<string name="favorites">Favoriti</string>
<string name="recent_calls">Nedavni pozivi</string>
<string name="show_call_confirmation_dialog">Pokažite dijaloški okvir za potvrdu poziva prije pokretanja poziva</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">Aggiungi a un contatto esistente</string>
<string name="must_make_default_dialer">È necessario impostare quest\'app come predefinita per utilizzare i numeri bloccati.</string>
<string name="set_to_default">Imposta come predefinita</string>
<string name="call_number">Chiama numero</string>
<!-- Placeholders -->
<string name="no_contacts_found">Nessun contatto trovato</string>
<string name="no_contacts_with_emails">Nessun contatto trovato con un\'email</string>
<string name="no_contacts_with_phone_numbers">Nessun contatto trovato con un numero di telefono</string>
<string name="no_recent_calls_found">Nessuna chiamata recente trovata</string>
<string name="new_contact">Nuovo contatto</string>
<string name="edit_contact">Modifica contatto</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">Gestisci le schede mostrate</string>
<string name="contacts">Contatti</string>
<string name="favorites">Preferiti</string>
<string name="recent_calls">Chiamate recenti</string>
<string name="show_call_confirmation_dialog">Mostra un messaggio di conferma prima di iniziare una chiamata</string>
<string name="show_only_contacts_with_numbers">Mostra solamente i contatti con almeno un numero telefonico</string>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">既存の連絡先に追加</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_to_default">Set to default</string>
<string name="call_number">Call number</string>
<!-- Placeholders -->
<string name="no_contacts_found">連絡先が見つかりません</string>
<string name="no_contacts_with_emails">メールアドレスが登録された連絡先が見つかりません</string>
<string name="no_contacts_with_phone_numbers">電話番号が登録された連絡先が見つかりません</string>
<string name="no_recent_calls_found">通話履歴はありません</string>
<string name="new_contact">新しい連絡先</string>
<string name="edit_contact">連絡先を編集</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">表示するタブを管理</string>
<string name="contacts">連絡先</string>
<string name="favorites">お気に入り</string>
<string name="recent_calls">通話履歴</string>
<string name="show_call_confirmation_dialog">発信する前に確認ダイアログを表示する</string>
<string name="show_only_contacts_with_numbers">電話番号が登録された連絡先のみ表示する</string>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">Add to an existing contact</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_to_default">Set to default</string>
<string name="call_number">Call number</string>
<!-- Placeholders -->
<string name="no_contacts_found">No contacts found</string>
<string name="no_contacts_with_emails">No contacts with emails have been found</string>
<string name="no_contacts_with_phone_numbers">No contacts with phone numbers have been found</string>
<string name="no_recent_calls_found">No recent calls found</string>
<string name="new_contact">새로운 연락처</string>
<string name="edit_contact">연락처 수정</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">Manage shown tabs</string>
<string name="contacts">Contacts</string>
<string name="favorites">Favorites</string>
<string name="recent_calls">Recent calls</string>
<string name="show_call_confirmation_dialog">Show a call confirmation dialog before initiating a call</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">Add to an existing contact</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_to_default">Set to default</string>
<string name="call_number">Call number</string>
<!-- Placeholders -->
<string name="no_contacts_found">No contacts found</string>
<string name="no_contacts_with_emails">No contacts with emails have been found</string>
<string name="no_contacts_with_phone_numbers">No contacts with phone numbers have been found</string>
<string name="no_recent_calls_found">No recent calls found</string>
<string name="new_contact">Naujas kontaktas</string>
<string name="edit_contact">Redaguoti kontaktą</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">Manage shown tabs</string>
<string name="contacts">Contacts</string>
<string name="favorites">Favorites</string>
<string name="recent_calls">Recent calls</string>
<string name="show_call_confirmation_dialog">Show a call confirmation dialog before initiating a call</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">Adicionar a contacto existente</string>
<string name="must_make_default_dialer">Tem que tornar esta a aplicação padrão para poder bloquear números.</string>
<string name="set_to_default">Definir como padrão</string>
<string name="call_number">Call number</string>
<!-- Placeholders -->
<string name="no_contacts_found">Não existem contactos</string>
<string name="no_contacts_with_emails">Não existem contactos com endereço de e-mail</string>
<string name="no_contacts_with_phone_numbers">Não existem contactos com número de telefone</string>
<string name="no_recent_calls_found">Não existem chamadas recentes</string>
<string name="new_contact">Novo contacto</string>
<string name="edit_contact">Editar contacto</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">Gerir separadores a exibir</string>
<string name="contacts">Contactos</string>
<string name="favorites">Favoritos</string>
<string name="recent_calls">Chamadas recentes</string>
<string name="show_call_confirmation_dialog">Mostrar diálogo para confirmar a chamada</string>
<string name="show_only_contacts_with_numbers">Mostrar apenas contactos com número de telefone</string>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">Добавить к существующему контакту</string>
<string name="must_make_default_dialer">Вы должны сделать \"Simple Contacts\" приложением по умолчанию для набора номера для использования блокировки номеров.</string>
<string name="set_to_default">Сделать по умолчанию</string>
<string name="call_number">Набрать номер</string>
<!-- Placeholders -->
<string name="no_contacts_found">Контакты не найдены</string>
<string name="no_contacts_with_emails">Контакты с адресами электронной почты не найдены</string>
<string name="no_contacts_with_phone_numbers">Контакты с номерами телефонов не найдены</string>
<string name="no_recent_calls_found">Недавние вызовы не найдены</string>
<string name="new_contact">Новый контакт</string>
<string name="edit_contact">Редактировать контакт</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">Управление отображаемыми вкладками</string>
<string name="contacts">Контакты</string>
<string name="favorites">Избранное</string>
<string name="recent_calls">Недавние вызовы</string>
<string name="show_call_confirmation_dialog">Показывать диалог подтверждения вызова</string>
<string name="show_only_contacts_with_numbers">Показывать только контакты с номерами телефонов</string>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">Pridať k existujúcemu kontaktu</string>
<string name="must_make_default_dialer">Pre použitie blokovania čísel musíte nastaviť aplikáciu ako predvolenú pre správu hovorov.</string>
<string name="set_to_default">Nastaviť ako predvolenú</string>
<string name="call_number">Zavolať číslo</string>
<!-- Placeholders -->
<string name="no_contacts_found">Nenašli sa žiadne kontakty</string>
<string name="no_contacts_with_emails">Nenašli sa žiadne kontakty s emailami</string>
<string name="no_contacts_with_phone_numbers">Nenašli sa žiadne kontakty s telefónnymi číslami</string>
<string name="no_recent_calls_found">Nenašli sa žiadne posledné hovory</string>
<string name="new_contact">Nový kontakt</string>
<string name="edit_contact">Upraviť kontakt</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">Spravovať zobrazené karty</string>
<string name="contacts">Kontakty</string>
<string name="favorites">Obľúbené</string>
<string name="recent_calls">Predošlé hovory</string>
<string name="show_call_confirmation_dialog">Zobraziť pred spustením hovoru okno na jeho potvrdenie</string>
<string name="show_only_contacts_with_numbers">Zobraziť iba kontakty s telefónnymi číslami</string>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">Lägg till i en befintlig kontakt</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_to_default">Set to default</string>
<string name="call_number">Call number</string>
<!-- Placeholders -->
<string name="no_contacts_found">Inga kontakter hittades</string>
<string name="no_contacts_with_emails">Inga kontakter med e-postadresser hittades</string>
<string name="no_contacts_with_phone_numbers">Inga kontakter med telefonnummer hittades</string>
<string name="no_recent_calls_found">No recent calls found</string>
<string name="new_contact">Ny kontakt</string>
<string name="edit_contact">Redigera kontakt</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">Hantera visade flikar</string>
<string name="contacts">Kontakter</string>
<string name="favorites">Favoriter</string>
<string name="recent_calls">Senaste samtal</string>
<string name="show_call_confirmation_dialog">Visa en bekräftelsedialogruta före uppringning</string>
<string name="show_only_contacts_with_numbers">Visa bara kontakter med telefonnummer</string>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">Mevcut bir kişiye ekle</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_to_default">Set to default</string>
<string name="call_number">Call number</string>
<!-- Placeholders -->
<string name="no_contacts_found">Kişi bulunamadı</string>
<string name="no_contacts_with_emails">E-posta ile hiç bağlantı bulunamadı</string>
<string name="no_contacts_with_phone_numbers">Telefon numaralarını içeren kişi bulunamadı</string>
<string name="no_recent_calls_found">No recent calls found</string>
<string name="new_contact">Yeni kişi</string>
<string name="edit_contact">Kişiyi düzenle</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">Gösterilen sekmeleri yönet</string>
<string name="contacts">Kişiler</string>
<string name="favorites">Favoriler</string>
<string name="recent_calls">Son aramalar</string>
<string name="show_call_confirmation_dialog">Arama başlatmadan önce arama onayı penceresi göster</string>
<string name="show_only_contacts_with_numbers">Sadece telefon numaralarını içeren kişileri göster</string>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">添加至已存在的聯絡人</string>
<string name="must_make_default_dialer">你必須將這應用程式設為預設的撥號程式來使用黑名單。</string>
<string name="set_to_default">設為預設</string>
<string name="call_number">撥打號碼</string>
<!-- Placeholders -->
<string name="no_contacts_found">未發現聯絡人</string>
<string name="no_contacts_with_emails">未發現含有電子信箱的聯絡人</string>
<string name="no_contacts_with_phone_numbers">未發現含有電話號碼的聯絡人</string>
<string name="no_recent_calls_found">未發現通話紀錄</string>
<string name="new_contact">新聯絡人</string>
<string name="edit_contact">編輯聯絡人</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">管理顯示的頁面</string>
<string name="contacts">聯絡人</string>
<string name="favorites">我的最愛</string>
<string name="recent_calls">通話紀錄</string>
<string name="show_call_confirmation_dialog">開始通話前顯示通話確認框</string>
<string name="show_only_contacts_with_numbers">只顯示含有電話話碼的聯絡人</string>

View File

@ -19,13 +19,11 @@
<string name="add_to_existing_contact">Add to an existing contact</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_to_default">Set to default</string>
<string name="call_number">Call number</string>
<!-- Placeholders -->
<string name="no_contacts_found">No contacts found</string>
<string name="no_contacts_with_emails">No contacts with emails have been found</string>
<string name="no_contacts_with_phone_numbers">No contacts with phone numbers have been found</string>
<string name="no_recent_calls_found">No recent calls found</string>
<string name="new_contact">New contact</string>
<string name="edit_contact">Edit contact</string>
@ -65,7 +63,6 @@
<string name="manage_shown_tabs">Manage shown tabs</string>
<string name="contacts">Contacts</string>
<string name="favorites">Favorites</string>
<string name="recent_calls">Recent calls</string>
<string name="show_call_confirmation_dialog">Show a call confirmation dialog before initiating a call</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>