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

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