Merge pull request #20 from SimpleMobileTools/master

upd
This commit is contained in:
solokot 2018-12-29 14:54:48 +03:00 committed by GitHub
commit 2b0062cbdc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
50 changed files with 237 additions and 116 deletions

View File

@ -1,6 +1,20 @@
Changelog
==========
Version 6.1.2 *(2018-12-28)*
----------------------------
* Improve the way contacts are fetched, more contacts should show up
* Improve contact filtering to fix some glitches
* Added a Call menu button for calling not stored numbers from Recents
* Some stability improvements
Version 6.1.1 *(2018-12-12)*
----------------------------
* Fixing a crash on Android Lollipop
* Added some translation improvements
Version 6.1.0 *(2018-11-30)*
----------------------------

View File

@ -15,8 +15,8 @@ android {
applicationId "com.simplemobiletools.contacts.pro"
minSdkVersion 21
targetSdkVersion 28
versionCode 37
versionName "6.1.0"
versionCode 39
versionName "6.1.2"
setProperty("archivesBaseName", "contacts")
}
@ -51,9 +51,9 @@ android {
}
dependencies {
implementation 'com.simplemobiletools:commons:5.5.1'
implementation 'com.simplemobiletools:commons:5.6.2'
implementation 'joda-time:joda-time:2.10.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha3'
implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.4'
kapt "androidx.room:room-compiler:2.0.0"

View File

@ -55,7 +55,7 @@ class DialpadActivity : SimpleActivity() {
ContactsHelper(this).getContacts { gotContacts(it) }
disableKeyboardPopping()
val callIcon = resources.getColoredDrawableWithColor(R.drawable.ic_phone_big, if (isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE)
val callIcon = resources.getColoredDrawableWithColor(R.drawable.ic_phone_huge, if (isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE)
dialpad_call_button.setImageDrawable(callIcon)
dialpad_call_button.background.applyColorFilter(getAdjustedPrimaryColor())
}

View File

@ -568,15 +568,19 @@ class EditContactActivity : ContactActivity() {
}
private fun setupContactSource() {
contact_source.text = getPublicContactSource(contact!!.source)
originalContactSource = contact!!.source
getPublicContactSource(contact!!.source) {
contact_source.text = it
}
}
private fun setupNewContact() {
supportActionBar?.title = resources.getString(R.string.new_contact)
originalContactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE
contact = getEmptyContact()
contact_source.text = getPublicContactSource(contact!!.source)
getPublicContactSource(contact!!.source) {
contact_source.text = it
}
}
private fun setupTypePickers() {
@ -831,7 +835,9 @@ class EditContactActivity : ContactActivity() {
private fun showSelectContactSourceDialog() {
showContactSourcePicker(contact!!.source) {
contact!!.source = if (it == getString(R.string.phone_storage_hidden)) SMT_PRIVATE else it
contact_source.text = getPublicContactSource(it)
getPublicContactSource(it) {
contact_source.text = it
}
}
}

View File

@ -191,7 +191,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
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
findItem(R.id.filter).isVisible = currentFragment != groups_fragment && currentFragment != recents_fragment
}
setupSearch(menu)
return true
@ -495,7 +495,8 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
val faqItems = arrayListOf(
FAQItem(R.string.faq_1_title, R.string.faq_1_text),
FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons)
FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons),
FAQItem(R.string.faq_6_title_commons, R.string.faq_6_text_commons)
)
startAboutActivity(R.string.app_name, licenses, BuildConfig.VERSION_NAME, faqItems, true)
@ -585,6 +586,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
add(Release(31, R.string.release_31))
add(Release(32, R.string.release_32))
add(Release(34, R.string.release_34))
add(Release(39, R.string.release_39))
checkWhatsNew(this, BuildConfig.VERSION_CODE)
}
}

View File

@ -6,6 +6,7 @@ import android.content.Intent
import android.os.Build
import android.telecom.TelecomManager
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.helpers.KEY_PHONE
import com.simplemobiletools.contacts.pro.helpers.REQUEST_CODE_SET_DEFAULT_DIALER
@ -54,7 +55,12 @@ open class SimpleActivity : BaseSimpleActivity() {
@TargetApi(Build.VERSION_CODES.M)
protected fun launchSetDefaultDialerIntent() {
val intent = Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER).putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName)
startActivityForResult(intent, REQUEST_CODE_SET_DEFAULT_DIALER)
Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER).putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName).apply {
if (resolveActivity(packageManager) != null) {
startActivityForResult(this, REQUEST_CODE_SET_DEFAULT_DIALER)
} else {
toast(R.string.no_app_found)
}
}
}
}

View File

@ -446,11 +446,12 @@ class ViewContactActivity : ContactActivity() {
private fun setupContactSource() {
if (showFields and SHOW_CONTACT_SOURCE_FIELD != 0) {
val contactSourceValue = getPublicContactSource(contact!!.source)
contact_source.text = contactSourceValue
getPublicContactSource(contact!!.source) {
contact_source.text = it
contact_source.copyOnLongClick(it)
}
contact_source_image.beVisible()
contact_source.beVisible()
contact_source.copyOnLongClick(contactSourceValue)
} else {
contact_source_image.beGone()
contact_source.beGone()

View File

@ -62,7 +62,7 @@ class FilterContactSourcesAdapter(val activity: SimpleActivity, private val cont
itemView.apply {
filter_contact_source_checkbox.isChecked = isSelected
filter_contact_source_checkbox.setColors(activity.config.textColor, activity.getAdjustedPrimaryColor(), activity.config.backgroundColor)
filter_contact_source_checkbox.text = contactSource.name
filter_contact_source_checkbox.text = contactSource.publicName
filter_contact_source_holder.setOnClickListener { viewClicked(!isSelected, contactSource) }
}

View File

@ -13,6 +13,7 @@ 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
@ -31,9 +32,15 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<Re
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
}
}
@ -43,6 +50,7 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<Re
}
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()
@ -76,6 +84,10 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<Re
fastScroller?.measureRecyclerView()
}
private fun callNumber() {
(activity as SimpleActivity).startCallIntent(getSelectedItems().first().number)
}
private fun askConfirmDelete() {
ConfirmationDialog(activity) {
deleteRecentCalls()

View File

@ -36,12 +36,14 @@ class CreateNewGroupDialog(val activity: BaseSimpleActivity, val callback: (newG
val contactSources = ArrayList<ContactSource>()
if (activity.config.localAccountName.isNotEmpty()) {
contactSources.add(ContactSource(activity.config.localAccountName, activity.config.localAccountType))
val localAccountName = activity.config.localAccountName
contactSources.add(ContactSource(localAccountName, activity.config.localAccountType, localAccountName))
}
ContactsHelper(activity).getContactSources {
it.filter { it.type.contains("google", true) }.mapTo(contactSources, { ContactSource(it.name, it.type) })
contactSources.add(ContactSource(activity.getString(R.string.phone_storage_hidden), SMT_PRIVATE))
it.filter { it.type.contains("google", true) }.mapTo(contactSources) { ContactSource(it.name, it.type, it.name) }
val phoneSecret = activity.getString(R.string.phone_storage_hidden)
contactSources.add(ContactSource(phoneSecret, SMT_PRIVATE, phoneSecret))
val items = ArrayList<RadioItem>()
contactSources.forEachIndexed { index, contactSource ->

View File

@ -41,12 +41,12 @@ class FilterContactSourcesDialog(val activity: SimpleActivity, private val callb
private fun confirmEventTypes() {
val selectedContactSources = (view.filter_contact_sources_list.adapter as FilterContactSourcesAdapter).getSelectedContactSources()
val ignoredContactSourceNames = contactSources.filter { !selectedContactSources.contains(it) }.map {
if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.name
val ignoredContactSources = contactSources.filter { !selectedContactSources.contains(it) }.map {
if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.getFullIdentifier()
}.toHashSet()
if (activity.getVisibleContactSources() != ignoredContactSourceNames) {
activity.config.ignoredContactSources = ignoredContactSourceNames
if (activity.getVisibleContactSources() != ignoredContactSources) {
activity.config.ignoredContactSources = ignoredContactSources
callback()
}
dialog?.dismiss()

View File

@ -20,11 +20,16 @@ class ImportContactsDialog(val activity: SimpleActivity, val path: String, priva
init {
val view = (activity.layoutInflater.inflate(R.layout.dialog_import_contacts, null) as ViewGroup).apply {
targetContactSource = activity.config.lastUsedContactSource
import_contacts_title.text = activity.getPublicContactSource(targetContactSource)
activity.getPublicContactSource(targetContactSource) {
import_contacts_title.text = it
}
import_contacts_title.setOnClickListener {
activity.showContactSourcePicker(targetContactSource) {
targetContactSource = if (it == activity.getString(R.string.phone_storage_hidden)) SMT_PRIVATE else it
import_contacts_title.text = activity.getPublicContactSource(it)
activity.getPublicContactSource(it) {
import_contacts_title.text = it
}
}
}
}

View File

@ -65,8 +65,11 @@ fun SimpleActivity.showContactSourcePicker(currentSource: String, callback: (new
)
val items = ArrayList<RadioItem>()
val sources = it.filter { !ignoredTypes.contains(it.type) }.map { it.name }
var currentSourceIndex = -1
val filteredSources = it.filter { !ignoredTypes.contains(it.type) }
var sources = filteredSources.map { it.name }
var currentSourceIndex = sources.indexOfFirst { it == currentSource }
sources = filteredSources.map { it.publicName }
sources.forEachIndexed { index, account ->
var publicAccount = account
if (account == config.localAccountName) {
@ -74,16 +77,14 @@ fun SimpleActivity.showContactSourcePicker(currentSource: String, callback: (new
}
items.add(RadioItem(index, publicAccount))
if (account == currentSource) {
currentSourceIndex = index
} else if (currentSource == SMT_PRIVATE && account == getString(R.string.phone_storage_hidden)) {
if (currentSource == SMT_PRIVATE && account == getString(R.string.phone_storage_hidden)) {
currentSourceIndex = index
}
}
runOnUiThread {
RadioGroupDialog(this, items, currentSourceIndex) {
callback(sources[it as Int])
callback(filteredSources[it as Int].name)
}
}
}

View File

@ -7,6 +7,8 @@ import android.content.Intent
import android.database.Cursor
import android.net.Uri
import android.os.Build
import android.os.Handler
import android.os.Looper
import android.provider.BlockedNumberContract
import android.provider.BlockedNumberContract.BlockedNumbers
import android.provider.ContactsContract
@ -15,6 +17,7 @@ import androidx.core.content.FileProvider
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
import com.simplemobiletools.commons.helpers.isMarshmallowPlus
import com.simplemobiletools.commons.helpers.isNougatPlus
import com.simplemobiletools.contacts.pro.BuildConfig
import com.simplemobiletools.contacts.pro.R
@ -192,11 +195,26 @@ fun Context.getPhotoThumbnailSize(): Int {
fun Context.hasContactPermissions() = hasPermission(PERMISSION_READ_CONTACTS) && hasPermission(PERMISSION_WRITE_CONTACTS)
fun Context.getPublicContactSource(source: String): String {
return when (source) {
config.localAccountName -> getString(R.string.phone_storage)
SMT_PRIVATE -> getString(R.string.phone_storage_hidden)
else -> source
fun Context.getPublicContactSource(source: String, callback: (String) -> Unit) {
when (source) {
config.localAccountName -> callback(getString(R.string.phone_storage))
SMT_PRIVATE -> callback(getString(R.string.phone_storage_hidden))
else -> {
Thread {
ContactsHelper(this).getContactSources {
var newSource = source
for (contactSource in it) {
if (contactSource.name == source && contactSource.type == TELEGRAM_PACKAGE) {
newSource += " (${getString(R.string.telegram)})"
break
}
}
Handler(Looper.getMainLooper()).post {
callback(newSource)
}
}
}.start()
}
}
}
@ -288,9 +306,11 @@ fun Context.getContactPublicUri(contact: Contact): Uri {
fun Context.getVisibleContactSources(): ArrayList<String> {
val sources = ContactsHelper(this).getDeviceContactSources()
sources.add(ContactSource(getString(R.string.phone_storage_hidden), SMT_PRIVATE))
val sourceNames = ArrayList(sources).map { if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.name }.toMutableList() as ArrayList<String>
sourceNames.removeAll(config.ignoredContactSources)
val phoneSecret = getString(R.string.phone_storage_hidden)
sources.add(ContactSource(phoneSecret, SMT_PRIVATE, phoneSecret))
val ignoredContactSources = config.ignoredContactSources
val sourceNames = ArrayList(sources).filter { !ignoredContactSources.contains(it.getFullIdentifier()) }
.map { if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.name }.toMutableList() as ArrayList<String>
return sourceNames
}
@ -331,7 +351,11 @@ fun Context.getBlockedNumbers(): ArrayList<BlockedNumber> {
fun Context.addBlockedNumber(number: String) {
ContentValues().apply {
put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, number)
contentResolver.insert(BlockedNumbers.CONTENT_URI, this)
try {
contentResolver.insert(BlockedNumbers.CONTENT_URI, this)
} catch (e: Exception) {
showErrorToast(e)
}
}
}
@ -344,4 +368,4 @@ fun Context.deleteBlockedNumber(number: String) {
}
@TargetApi(Build.VERSION_CODES.M)
fun Context.isDefaultDialer() = telecomManager.defaultDialerPackage == packageName
fun Context.isDefaultDialer() = isMarshmallowPlus() && telecomManager.defaultDialerPackage == packageName

View File

@ -7,7 +7,7 @@ import com.simplemobiletools.contacts.pro.models.LocalContact
const val SHOW_CONTACT_THUMBNAILS = "show_contact_thumbnails"
const val SHOW_PHONE_NUMBERS = "show_phone_numbers"
const val SHOW_ONLY_CONTACTS_WITH_NUMBERS = "show_only_contacts_with_numbers"
const val IGNORED_CONTACT_SOURCES = "ignored_contact_sources"
const val IGNORED_CONTACT_SOURCES = "ignored_contact_sources_2"
const val START_NAME_WITH_SURNAME = "start_name_with_surname"
const val LAST_USED_CONTACT_SOURCE = "last_used_contact_source"
const val LOCAL_ACCOUNT_NAME = "local_account_name"

View File

@ -108,7 +108,12 @@ class ContactsHelper(val context: Context) {
do {
val name = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_NAME) ?: ""
val type = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_TYPE) ?: ""
val source = ContactSource(name, type)
var publicName = name
if (type == TELEGRAM_PACKAGE) {
publicName += " (${context.getString(R.string.telegram)})"
}
val source = ContactSource(name, type, publicName)
sources.add(source)
} while (cursor.moveToNext())
}
@ -125,10 +130,12 @@ class ContactsHelper(val context: Context) {
return
}
val ignoredSources = context.config.ignoredContactSources
val uri = ContactsContract.Data.CONTENT_URI
val projection = getContactProjection()
val selection = getSourcesSelection(true)
val selectionArgs = getSourcesSelectionArgs(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
val selection = "${ContactsContract.Data.MIMETYPE} = ?"
val selectionArgs = arrayOf(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
val sortOrder = getSortString()
var cursor: Cursor? = null
@ -136,6 +143,12 @@ class ContactsHelper(val context: Context) {
cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
if (cursor?.moveToFirst() == true) {
do {
val accountName = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_NAME) ?: ""
val accountType = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_TYPE) ?: ""
if (ignoredSources.contains("$accountName:$accountType")) {
continue
}
val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
val prefix = cursor.getStringValue(CommonDataKinds.StructuredName.PREFIX) ?: ""
val firstName = cursor.getStringValue(CommonDataKinds.StructuredName.GIVEN_NAME) ?: ""
@ -148,7 +161,6 @@ class ContactsHelper(val context: Context) {
val emails = ArrayList<Email>()
val addresses = ArrayList<Address>()
val events = ArrayList<Event>()
val accountName = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_NAME) ?: ""
val starred = cursor.getIntValue(CommonDataKinds.StructuredName.STARRED)
val contactId = cursor.getIntValue(ContactsContract.Data.CONTACT_ID)
val thumbnailUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI) ?: ""
@ -825,7 +837,8 @@ class ContactsHelper(val context: Context) {
private fun getContactSourcesSync(): ArrayList<ContactSource> {
val sources = getDeviceContactSources()
sources.add(ContactSource(context.getString(R.string.phone_storage_hidden), SMT_PRIVATE))
val phoneSecret = context.getString(R.string.phone_storage_hidden)
sources.add(ContactSource(phoneSecret, SMT_PRIVATE, phoneSecret))
return ArrayList(sources)
}
@ -838,10 +851,11 @@ class ContactsHelper(val context: Context) {
val accounts = AccountManager.get(context).accounts
accounts.forEach {
if (ContentResolver.getIsSyncable(it, ContactsContract.AUTHORITY) == 1) {
val contactSource = ContactSource(it.name, it.type)
var publicName = it.name
if (it.type == TELEGRAM_PACKAGE) {
contactSource.name += " (${context.getString(R.string.telegram)})"
publicName += " (${context.getString(R.string.telegram)})"
}
val contactSource = ContactSource(it.name, it.type, publicName)
sources.add(contactSource)
}
}
@ -852,7 +866,7 @@ class ContactsHelper(val context: Context) {
sources.addAll(contentResolverAccounts)
if (sources.isEmpty() && context.config.localAccountName.isEmpty() && context.config.localAccountType.isEmpty()) {
sources.add(ContactSource("", ""))
sources.add(ContactSource("", "", ""))
}
return sources
@ -871,7 +885,8 @@ class ContactsHelper(val context: Context) {
CommonDataKinds.StructuredName.PHOTO_URI,
CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI,
CommonDataKinds.StructuredName.STARRED,
ContactsContract.RawContacts.ACCOUNT_NAME
ContactsContract.RawContacts.ACCOUNT_NAME,
ContactsContract.RawContacts.ACCOUNT_TYPE
)
private fun getSortString(): String {

View File

@ -119,7 +119,7 @@ data class Contact(var id: Int, var prefix: String, var firstName: String, var m
fun getHashToCompare() = getStringToCompare().hashCode()
fun getFullCompany(): String {
private fun getFullCompany(): String {
var fullOrganization = if (organization.company.isEmpty()) "" else "${organization.company}, "
fullOrganization += organization.jobPosition
return fullOrganization.trim().trimEnd(',')

View File

@ -1,3 +1,13 @@
package com.simplemobiletools.contacts.pro.models
data class ContactSource(var name: String, var type: String)
import com.simplemobiletools.contacts.pro.helpers.SMT_PRIVATE
data class ContactSource(var name: String, var type: String, var publicName: String) {
fun getFullIdentifier(): String {
return if (type == SMT_PRIVATE) {
type
} else {
"$name:$type"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 B

View File

Before

Width:  |  Height:  |  Size: 566 B

After

Width:  |  Height:  |  Size: 566 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

View File

Before

Width:  |  Height:  |  Size: 716 B

After

Width:  |  Height:  |  Size: 716 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 B

View File

Before

Width:  |  Height:  |  Size: 993 B

After

Width:  |  Height:  |  Size: 993 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 716 B

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -238,7 +238,7 @@
android:background="@drawable/circle_background"
android:elevation="@dimen/medium_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_phone_big"
android:src="@drawable/ic_phone_huge"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"/>

View File

@ -64,7 +64,7 @@
android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:scaleType="center"
android:src="@drawable/ic_phone"/>
android:src="@drawable/ic_phone_big"/>
<ImageView
android:id="@+id/contact_send_sms"
@ -196,7 +196,7 @@
android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_phone"/>
android:src="@drawable/ic_phone_big"/>
<LinearLayout
android:id="@+id/contact_numbers_holder"

View File

@ -65,7 +65,7 @@
android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:scaleType="center"
android:src="@drawable/ic_phone"/>
android:src="@drawable/ic_phone_big"/>
<ImageView
android:id="@+id/contact_send_sms"
@ -197,7 +197,7 @@
android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_phone"/>
android:src="@drawable/ic_phone_big"/>
<LinearLayout
android:id="@+id/contact_numbers_holder"

View File

@ -13,6 +13,6 @@
android:layout_centerInParent="true"
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/activity_margin"
android:src="@drawable/ic_phone_big"/>
android:src="@drawable/ic_phone_huge"/>
</RelativeLayout>

View File

@ -2,9 +2,9 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/cab_delete"
android:icon="@drawable/ic_delete"
android:title="@string/delete"
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"
@ -16,4 +16,9 @@
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,6 +19,7 @@
<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>

View File

@ -17,14 +17,15 @@
<string name="request_the_required_permissions">Benötigte Berechtigungen anfordern</string>
<string name="create_new_contact">Neuen Kontakt erstellen</string>
<string name="add_to_existing_contact">Zu einem existierenden Kontakt hinzufügen</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="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">No recent calls found</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>
@ -55,7 +56,7 @@
<string name="start_name_with_surname">Namen mit Nachnamen beginnen</string>
<string name="show_phone_numbers">Telefonnummern im Hauptmenü zeigen</string>
<string name="show_contact_thumbnails">Vorschaubilder der Kontakte zeigen</string>
<string name="show_dialpad_button">Show a dialpad button on the main screen</string>
<string name="show_dialpad_button">Eine Wählfehldschaltfläche auf dem Hauptbildschirm anzeigen</string>
<string name="on_contact_click">Beim Klicken auf den Kontakt</string>
<string name="call_contact">Kontakt anrufen</string>
<string name="view_contact">Kontaktdetails anzeigen</string>
@ -113,13 +114,13 @@
<!-- Dialer -->
<string name="dialer">Dialer</string>
<string name="calling">Calling</string>
<string name="incoming_call">Incoming call</string>
<string name="incoming_call_from">Incoming call from</string>
<string name="ongoing_call">Ongoing call</string>
<string name="disconnected">Disconnected</string>
<string name="decline_call">Decline</string>
<string name="answer_call">Answer</string>
<string name="calling">Anrufaufbau</string>
<string name="incoming_call">Eingehender Anruf</string>
<string name="incoming_call_from">Eingehender Anruf von</string>
<string name="ongoing_call">Laufender Anruf</string>
<string name="disconnected">Getrennt</string>
<string name="decline_call">Ablehnen</string>
<string name="answer_call">Antworten</string>
<!-- Visible fields -->
<string name="select_fields_to_show">Sichtbare Felder auswählen</string>
@ -137,12 +138,12 @@
<string name="instant_messaging">Instant messaging (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Manage blocked numbers</string>
<string name="not_blocking_anyone">You are not blocking anyone.</string>
<string name="add_a_blocked_number">Add a blocked number</string>
<string name="block_number">Block number</string>
<string name="block_numbers">Block numbers</string>
<string name="blocked_numbers">Blocked numbers</string>
<string name="manage_blocked_numbers">Blockierte Nummern verwalten</string>
<string name="not_blocking_anyone">Du blockierst niemanden.</string>
<string name="add_a_blocked_number">Eine blockierte Nummer hinzufügen</string>
<string name="block_number">Nummer blockieren</string>
<string name="block_numbers">Nummern blockieren</string>
<string name="blocked_numbers">Blockierte Nummern</string>
<!-- FAQ -->
<string name="faq_1_title">Ich möchte die sichtbaren Kontaktfelder ändern. Kann ich das machen?</string>

View File

@ -19,6 +19,7 @@
<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>

View File

@ -19,6 +19,7 @@
<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>

View File

@ -19,6 +19,7 @@
<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>
@ -139,10 +140,10 @@
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Manage blocked numbers</string>
<string name="not_blocking_anyone">You are not blocking anyone.</string>
<string name="add_a_blocked_number">Add a blocked number</string>
<string name="block_number">Block number</string>
<string name="block_numbers">Block numbers</string>
<string name="blocked_numbers">Blocked numbers</string>
<string name="add_a_blocked_number">Ajouter un numéro bloqué</string>
<string name="block_number">Numéro bloquer</string>
<string name="block_numbers">Numéros bloquer</string>
<string name="blocked_numbers">Numéros bloquer</string>
<!-- FAQ -->
<string name="faq_1_title">Je veux modifier les champs affichés sur les fiches de mes contacts. Puis-je le faire ?</string>
@ -152,12 +153,12 @@
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Une application répertoire pour gérer vos contacts sans publicité.</string>
<string name="app_long_description">
Un outil simple pour créer et gérer vos contacts depuis n\'importe quelle source. Les contacts peuvent être stockés sur votre appareil mais aussi synchronisés via votre compte Google ou d\'autres comptes. Vous pouvez afficher vos contacts favoris dans une liste séparée.
Vous pouvez l\'utiliser pour gérer les adresses de courriels et les événements de vos contacts. Cet outil permet de trier/filtrer à l\'aide de multiples paramètres, par exemple : afficher le surnom en premier.
L\'application ne contient ni publicité, ni autorisation inutile. Elle est totalement opensource et est également fournie avec des couleurs personnalisables.
Un outil simple pour créer et gérer vos contacts depuis n\'importe quelle source. Les contacts peuvent être stockés sur votre appareil mais aussi synchronisés via votre compte Google ou d\'autres comptes. Vous pouvez afficher vos contacts favoris dans une liste séparée.
Vous pouvez l\'utiliser pour gérer les adresses de courriels et les événements de vos contacts. Cet outil permet de trier/filtrer à l\'aide de multiples paramètres, par exemple : afficher le surnom en premier.
L\'application ne contient ni publicité, ni autorisation inutile. Elle est totalement opensource et est également fournie avec des couleurs personnalisables.
Cette application fait partie d\'une plus grande suite. Vous pouvez trouver les autres applications sur https://www.simplemobiletools.com
</string>

View File

@ -19,6 +19,7 @@
<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>

View File

@ -1,12 +1,12 @@
<resources>
<string name="app_name">Simple Contacts</string>
<string name="app_name">Semplice Contatti</string>
<string name="app_launcher_name">Contatti</string>
<string name="address">Indirizzo</string>
<string name="inserting">Inserimento in corso…</string>
<string name="updating">Aggiornamento in corso…</string>
<string name="phone_storage">Memoria del telefono</string>
<string name="phone_storage_hidden">Memoria del telefono (non visibile alle altre applicazioni)</string>
<string name="company">Compagnia</string>
<string name="company">Società</string>
<string name="job_position">Posizione lavorativa</string>
<string name="website">Sito web</string>
<string name="send_sms_to_contacts">Invia un SMS ai contatti</string>
@ -16,9 +16,10 @@
<string name="call_person">Chiama %s</string>
<string name="request_the_required_permissions">Richiedi le permissioni necessarie</string>
<string name="create_new_contact">Crea un nuovo contatto</string>
<string name="add_to_existing_contact">Aggiungi ad un contatto esistente</string>
<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">Call number</string>
<!-- Placeholders -->
<string name="no_contacts_found">Nessun contatto trovato</string>
@ -47,25 +48,25 @@
<string name="create_group_under_account">Crea un gruppo con un account</string>
<!-- Photo -->
<string name="take_photo">Scatta un foto</string>
<string name="take_photo">Scatta una foto</string>
<string name="choose_photo">Scegli una foto</string>
<string name="remove_photo">Rimuovi foto</string>
<string name="remove_photo">Rimuovi la foto</string>
<!-- Settings -->
<string name="start_name_with_surname">Prima il nome poi il cognome</string>
<string name="show_phone_numbers">Mostra i numeri di telefono nella schermata principale</string>
<string name="show_contact_thumbnails">Mostra le anteprime dei contatti</string>
<string name="show_dialpad_button">Mostra il pulante per la tastiera nello schermo principale</string>
<string name="on_contact_click">Al click sul contatto</string>
<string name="show_dialpad_button">Mostra il pulante per il tastierino nello schermo principale</string>
<string name="on_contact_click">Alla pressione sul contatto</string>
<string name="call_contact">Chiama contatto</string>
<string name="view_contact">Visualizza i dettagli del contatto</string>
<string name="manage_shown_contact_fields">Gestisci i campi mostrati</string>
<string name="filter_duplicates">Prova a filtrare i contatti duplicati</string>
<string name="filter_duplicates">Unisci i contatti duplicati</string>
<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 dialogo di conferma prima di iniziare una chiamata</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>
<!-- Emails -->
@ -88,11 +89,11 @@
<string name="anniversary">Anniversario</string>
<!-- Favorites -->
<string name="no_favorites">Sembra che ancora non si ha nessun contatto preferito.</string>
<string name="no_favorites">Non si ha ancora nessun contatto preferito.</string>
<string name="add_favorites">Aggiungi preferito</string>
<string name="add_to_favorites">Aggiungi ai preferiti</string>
<string name="remove_from_favorites">Rimuovi dai preferiti</string>
<string name="must_be_at_edit">Devi stare nella schermata di modifica per modificare un contatto</string>
<string name="must_be_at_edit">Si deve stare nella schermata di modifica per modificare un contatto</string>
<!-- Search -->
<string name="search_contacts">Cerca contatti</string>
@ -138,7 +139,7 @@
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Gestisci i numeri bloccati</string>
<string name="not_blocking_anyone">Non si sta blocccando alcun numero.</string>
<string name="not_blocking_anyone">Nessun numero bloccato.</string>
<string name="add_a_blocked_number">Aggiungi un numero da bloccare</string>
<string name="block_number">Blocca numero</string>
<string name="block_numbers">Blocca numeri</string>
@ -146,19 +147,19 @@
<!-- FAQ -->
<string name="faq_1_title">Voglio cambiare i campi visibili ai contatti. Come posso fare?</string>
<string name="faq_1_text">Puoi farlo andando in Impostazioni -> Gestisci i campi mostrati. Qui puoi selezionare i campi che saranno visibili. Alcuni sono anche disabilitati in maniera predefinita, quindi potresti trovare qualche nuovo campo.</string>
<string name="faq_1_text">Si può farlo andando in Impostazioni -> Gestisci i campi mostrati. Qui si possono selezionare i campi che saranno visibili, alcuni sono disabilitati in maniera predefinita, quindi si possono trovare campi aggiuntivi.</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Un\'applicazioni contatti per gestire i propri contatti senza pubblicità.</string>
<string name="app_long_description">
Una semplice applicazione per creare o gestire i propri contatti da qualsiasi provenienza. I contatti saranno salvati solamente nel dispositivo, ma possono essere sincronizzati con Google, o con altri servizi. Si possono visualizzare i contatti preferiti in una list separata.
Una semplice applicazione per creare o gestire i propri contatti di qualsiasi tipo. I contatti saranno salvati nel dispositivo, ma possono essere eventualmente sincronizzati con Google o con altri servizi. Si possono visualizzare i contatti preferiti in una lista separata.
Si può utilizzare l\'applicazione anche per gestire le email e gli eventi. Può ordinare e filtrare per parametri multipli, ed opzionalmente visualizzare il cognome come nome
Si può utilizzare l\'applicazione anche per gestire l\'email e gli eventi. Si possono ordinare e filtrare per diversi criteri, opzionalmente si può visualizzare il cognome come nome.
Non contiene pubblicità nè chiede permessi non necessari. È completamente open source ed offre colori personalizzabili.
L\'applicazione non contiene pubblicità o permessi non necessari; è completamente opensource e la si può personalizzare con i propri colori preferiti.
Quest\'app fa parte di una serie più grande. Puoi trovare le altre su https://www.simplemobiletools.com
Questa è solamente una delle tante applicazioni della serie Simple Mobile Tools. Si possono trovare le altre su https://www.simplemobiletools.com
</string>
<!--

View File

@ -19,6 +19,7 @@
<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>

View File

@ -19,6 +19,7 @@
<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>

View File

@ -19,6 +19,7 @@
<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>

View File

@ -17,8 +17,9 @@
<string name="request_the_required_permissions">Pedir a permissão necessária</string>
<string name="create_new_contact">Criar novo contacto</string>
<string name="add_to_existing_contact">Adicionar a contacto existente</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="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>
@ -104,7 +105,7 @@
<string name="import_contacts_from_vcf">Importar contactos de um ficheiro .vcf</string>
<string name="export_contacts_to_vcf">Exportar contactos para um ficheiro .vcf</string>
<string name="target_contact_source">Destino da origem do contacto</string>
<string name="include_contact_sources">Incluir fontes dos contactos</string>
<string name="include_contact_sources">Incluir fonte dos contactos</string>
<string name="filename_without_vcf">Nome do ficheiro (sem .vcf)</string>
<!-- Dialpad -->
@ -137,12 +138,12 @@
<string name="instant_messaging">Mensagem instantânea (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Manage blocked numbers</string>
<string name="not_blocking_anyone">You are not blocking anyone.</string>
<string name="add_a_blocked_number">Add a blocked number</string>
<string name="block_number">Block number</string>
<string name="block_numbers">Block numbers</string>
<string name="blocked_numbers">Blocked numbers</string>
<string name="manage_blocked_numbers">Gerir números bloqueados</string>
<string name="not_blocking_anyone">Não existem números bloqueados</string>
<string name="add_a_blocked_number">Adicionar um número a bloquear</string>
<string name="block_number">Bloquear número</string>
<string name="block_numbers">Bloquear números</string>
<string name="blocked_numbers">Números bloqueados</string>
<!-- FAQ -->
<string name="faq_1_title">I want to change what fields are visible at contacts. Can I do it?</string>

View File

@ -19,6 +19,7 @@
<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">Call number</string>
<!-- Placeholders -->
<string name="no_contacts_found">Контакты не найдены</string>

View File

@ -19,6 +19,7 @@
<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>

View File

@ -19,6 +19,7 @@
<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>

View File

@ -19,6 +19,7 @@
<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>

View File

@ -19,6 +19,7 @@
<string name="add_to_existing_contact">添加至已存在的聯絡人</string>
<string name="must_make_default_dialer">你必須將這應用程式設為預設的撥號程式來使用黑名單。</string>
<string name="set_to_default">設為預設</string>
<string name="call_number">Call number</string>
<!-- Placeholders -->
<string name="no_contacts_found">未發現聯絡人</string>

View File

@ -13,6 +13,7 @@
<string name="telegram">Telegram</string>
<!-- Release notes -->
<string name="release_39">Changed the way contacts are fetched, please reset your filters.</string>
<string name="release_34">Added new options for toggling 24 hour time format and showing only contacts with phone numbers</string>
<string name="release_32">Added a simple dialpad, dialer will come soon</string>
<string name="release_31">

View File

@ -19,6 +19,7 @@
<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>

View File

@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = '1.3.10'
ext.kotlin_version = '1.3.11'
repositories {
google()