Merge pull request #17 from SimpleMobileTools/master

upd
This commit is contained in:
solokot 2018-10-31 00:19:42 +03:00 committed by GitHub
commit 48201c851e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
80 changed files with 905 additions and 526 deletions

15
.gitignore vendored
View File

@ -1,21 +1,6 @@
# Temp files
*~
*.bak
*.backup
\#*
.\#*
*\#
*.swp
*.swap
*.sav
*.save
*.autosav
*.autosave
*.iml *.iml
.gradle .gradle
/local.properties /local.properties
/gradle.properties
/.idea/ /.idea/
.DS_Store .DS_Store
/build /build

View File

@ -1,6 +1,24 @@
Changelog Changelog
========== ==========
Version 5.1.0 *(2018-10-28)*
----------------------------
* Added an option for toggling 24 hour time format
* Added an option to show only contacts with phone numbers
* Do not allow creating contacts under WhatsApp contact source
* Try fixing the issue with disappearing contacts under some circumstances
* Fix some bugs related to selecting contact photo from the device storage
* Show the contact email at the list, if name and organization are empty
* Properly sort groups containing UTF-8 characters at title
* Use a different placeholder image for business contacts
Version 5.0.0 *(2018-10-15)*
----------------------------
* Increased the minimal required Android OS version to 5
* Try fixing the issue with disappearing fresh contacts
Version 4.5.0 *(2018-09-28)* Version 4.5.0 *(2018-09-28)*
---------------------------- ----------------------------

View File

@ -15,7 +15,7 @@ This app is just one piece of a bigger series of apps. You can find the rest of
<div style="display:flex;"> <div style="display:flex;">
<img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/app.png" width="30%"> <img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/app.png" width="30%">
<img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.png" width="30%"> <img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.png" width="30%">
<img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.png" width="30%"> <img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.png" width="30%">
</div> </div>
License License

View File

@ -8,10 +8,10 @@ android {
defaultConfig { defaultConfig {
applicationId "com.simplemobiletools.contacts" applicationId "com.simplemobiletools.contacts"
minSdkVersion 16 minSdkVersion 21
targetSdkVersion 28 targetSdkVersion 28
versionCode 32 versionCode 34
versionName "4.5.0" versionName "5.1.0"
setProperty("archivesBaseName", "contacts") setProperty("archivesBaseName", "contacts")
} }
@ -41,11 +41,11 @@ android {
} }
dependencies { dependencies {
implementation 'com.simplemobiletools:commons:4.8.0' implementation 'com.simplemobiletools:commons:5.2.11'
implementation 'joda-time:joda-time:2.9.9' implementation 'joda-time:joda-time:2.9.9'
implementation 'com.facebook.stetho:stetho:1.5.0' implementation 'com.facebook.stetho:stetho:1.5.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
compile 'com.googlecode.ez-vcard:ez-vcard:0.10.4' implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.4'
} }
Properties props = new Properties() Properties props = new Properties()

View File

@ -194,7 +194,7 @@
android:parentActivityName=".activities.MainActivity"/> android:parentActivityName=".activities.MainActivity"/>
<provider <provider
android:name="android.support.v4.content.FileProvider" android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider" android:authorities="${applicationId}.provider"
android:exported="false" android:exported="false"
android:grantUriPermissions="true"> android:grantUriPermissions="true">

View File

@ -1,21 +1,16 @@
package com.simplemobiletools.contacts.activities package com.simplemobiletools.contacts.activities
import android.annotation.TargetApi
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.text.InputType
import android.view.KeyEvent import android.view.KeyEvent
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.isLollipopPlus
import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.R
import com.simplemobiletools.contacts.adapters.ContactsAdapter import com.simplemobiletools.contacts.adapters.ContactsAdapter
import com.simplemobiletools.contacts.dialogs.CallConfirmationDialog import com.simplemobiletools.contacts.dialogs.CallConfirmationDialog
import com.simplemobiletools.contacts.extensions.afterTextChanged
import com.simplemobiletools.contacts.extensions.callContact import com.simplemobiletools.contacts.extensions.callContact
import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.config
import com.simplemobiletools.contacts.extensions.startCallIntent import com.simplemobiletools.contacts.extensions.startCallIntent
@ -47,7 +42,7 @@ class DialpadActivity : SimpleActivity() {
dialpad_clear_char.setOnClickListener { clearChar(it) } dialpad_clear_char.setOnClickListener { clearChar(it) }
dialpad_clear_char.setOnLongClickListener { clearInput(); true } dialpad_clear_char.setOnLongClickListener { clearInput(); true }
dialpad_call_button.setOnClickListener { initCall() } dialpad_call_button.setOnClickListener { initCall() }
dialpad_input.afterTextChanged { dialpadValueChanged(it) } dialpad_input.onTextChangeListener { dialpadValueChanged(it) }
ContactsHelper(this).getContacts { gotContacts(it) } ContactsHelper(this).getContacts { gotContacts(it) }
disableKeyboardPopping() disableKeyboardPopping()
@ -120,13 +115,8 @@ class DialpadActivity : SimpleActivity() {
else -> KeyEvent.KEYCODE_POUND else -> KeyEvent.KEYCODE_POUND
} }
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private fun disableKeyboardPopping() { private fun disableKeyboardPopping() {
if (isLollipopPlus()) { dialpad_input.showSoftInputOnFocus = false
dialpad_input.showSoftInputOnFocus = false
} else {
dialpad_input.inputType = InputType.TYPE_NULL
}
} }
private fun gotContacts(newContacts: ArrayList<Contact>) { private fun gotContacts(newContacts: ArrayList<Contact>) {

View File

@ -5,6 +5,7 @@ import android.app.DatePickerDialog
import android.content.ClipData import android.content.ClipData
import android.content.ContentValues import android.content.ContentValues
import android.content.Intent import android.content.Intent
import android.graphics.Bitmap
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
@ -114,7 +115,7 @@ class EditContactActivity : ContactActivity() {
super.onActivityResult(requestCode, resultCode, resultData) super.onActivityResult(requestCode, resultCode, resultData)
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
when (requestCode) { when (requestCode) {
INTENT_TAKE_PHOTO, INTENT_CHOOSE_PHOTO -> startCropPhotoIntent(lastPhotoIntentUri) INTENT_TAKE_PHOTO, INTENT_CHOOSE_PHOTO -> startCropPhotoIntent(lastPhotoIntentUri, resultData?.data)
INTENT_CROP_PHOTO -> updateContactPhoto(lastPhotoIntentUri.toString(), contact_photo) INTENT_CROP_PHOTO -> updateContactPhoto(lastPhotoIntentUri.toString(), contact_photo)
} }
} }
@ -260,15 +261,28 @@ class EditContactActivity : ContactActivity() {
} }
} }
private fun startCropPhotoIntent(uri: Uri?) { private fun startCropPhotoIntent(primaryUri: Uri?, backupUri: Uri?) {
if (uri == null) { if (primaryUri == null) {
toast(R.string.unknown_error_occurred) toast(R.string.unknown_error_occurred)
return return
} }
var imageUri = primaryUri
var bitmap = MediaStore.Images.Media.getBitmap(contentResolver, primaryUri)
if (bitmap == null) {
imageUri = backupUri
bitmap = MediaStore.Images.Media.getBitmap(contentResolver, backupUri) ?: return
// we might have received an URI which we have no permission to send further, so just copy the received image in a new uri (for example from Google Photos)
val newFile = getCachePhoto()
val fos = newFile.outputStream()
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos)
imageUri = getCachePhotoUri(newFile)
}
lastPhotoIntentUri = getCachePhotoUri() lastPhotoIntentUri = getCachePhotoUri()
Intent("com.android.camera.action.CROP").apply { Intent("com.android.camera.action.CROP").apply {
setDataAndType(uri, "image/*") setDataAndType(imageUri, "image/*")
putExtra(MediaStore.EXTRA_OUTPUT, lastPhotoIntentUri) putExtra(MediaStore.EXTRA_OUTPUT, lastPhotoIntentUri)
putExtra("outputX", 720) putExtra("outputX", 720)
putExtra("outputY", 720) putExtra("outputY", 720)
@ -277,7 +291,7 @@ class EditContactActivity : ContactActivity() {
putExtra("crop", "true") putExtra("crop", "true")
putExtra("scale", "true") putExtra("scale", "true")
putExtra("scaleUpIfNeeded", "true") putExtra("scaleUpIfNeeded", "true")
clipData = ClipData("Attachment", arrayOf("text/uri-list"), ClipData.Item(lastPhotoIntentUri)) clipData = ClipData("Attachment", arrayOf("text/primaryUri-list"), ClipData.Item(lastPhotoIntentUri))
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
if (resolveActivity(packageManager) != null) { if (resolveActivity(packageManager) != null) {
startActivityForResult(this, INTENT_CROP_PHOTO) startActivityForResult(this, INTENT_CROP_PHOTO)

View File

@ -9,11 +9,11 @@ import android.graphics.drawable.Drawable
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.support.v4.view.MenuItemCompat
import android.support.v4.view.ViewPager
import android.support.v7.widget.SearchView
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat
import androidx.viewpager.widget.ViewPager
import com.simplemobiletools.commons.dialogs.FilePickerDialog import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.helpers.*
@ -27,7 +27,6 @@ import com.simplemobiletools.contacts.dialogs.ExportContactsDialog
import com.simplemobiletools.contacts.dialogs.FilterContactSourcesDialog import com.simplemobiletools.contacts.dialogs.FilterContactSourcesDialog
import com.simplemobiletools.contacts.dialogs.ImportContactsDialog import com.simplemobiletools.contacts.dialogs.ImportContactsDialog
import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.config
import com.simplemobiletools.contacts.extensions.dbHelper
import com.simplemobiletools.contacts.extensions.getTempFile import com.simplemobiletools.contacts.extensions.getTempFile
import com.simplemobiletools.contacts.fragments.MyViewPagerFragment import com.simplemobiletools.contacts.fragments.MyViewPagerFragment
import com.simplemobiletools.contacts.helpers.* import com.simplemobiletools.contacts.helpers.*
@ -63,9 +62,6 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
appLaunched(BuildConfig.APPLICATION_ID) appLaunched(BuildConfig.APPLICATION_ID)
setupTabColors() setupTabColors()
// just get a reference to the database to make sure it is created properly
dbHelper
handlePermission(PERMISSION_READ_CALL_LOG) { handlePermission(PERMISSION_READ_CALL_LOG) {
if (it) { if (it) {
handlePermission(PERMISSION_WRITE_CALL_LOG) { handlePermission(PERMISSION_WRITE_CALL_LOG) {
@ -308,10 +304,10 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
} }
} }
private fun getInactiveTabIndexes(activeIndex: Int) = arrayListOf(0, 1, 2, 3).filter { it != activeIndex } private fun getInactiveTabIndexes(activeIndex: Int) = (0 until tabsList.size).filter { it != activeIndex }
private fun initFragments() { private fun initFragments() {
viewpager.offscreenPageLimit = 3 viewpager.offscreenPageLimit = tabsList.size - 1
viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) { override fun onPageScrollStateChanged(state: Int) {
if (isSearchOpen) { if (isSearchOpen) {
@ -320,8 +316,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
} }
} }
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
}
override fun onPageSelected(position: Int) { override fun onPageSelected(position: Int) {
main_tabs_holder.getTabAt(position)?.select() main_tabs_holder.getTabAt(position)?.select()
@ -373,7 +368,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
}, 100L) }, 100L)
} }
main_tabs_holder.beVisibleIf(skippedTabs < 3) main_tabs_holder.beVisibleIf(skippedTabs < tabsList.size - 1)
main_dialpad_button.setOnClickListener { main_dialpad_button.setOnClickListener {
val intent = Intent(applicationContext, DialpadActivity::class.java) val intent = Intent(applicationContext, DialpadActivity::class.java)
@ -401,7 +396,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
fun showFilterDialog() { fun showFilterDialog() {
FilterContactSourcesDialog(this) { FilterContactSourcesDialog(this) {
contacts_fragment?.forceListRedraw = true contacts_fragment?.forceListRedraw = true
refreshContacts(CONTACTS_TAB_MASK) refreshContacts(CONTACTS_TAB_MASK or FAVORITES_TAB_MASK)
} }
} }
@ -484,7 +479,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
} }
private fun launchAbout() { private fun launchAbout() {
val licenses = LICENSE_MULTISELECT or LICENSE_JODA or LICENSE_GLIDE or LICENSE_GSON or LICENSE_STETHO val licenses = LICENSE_JODA or LICENSE_GLIDE or LICENSE_GSON or LICENSE_STETHO
val faqItems = arrayListOf( val faqItems = arrayListOf(
FAQItem(R.string.faq_1_title, R.string.faq_1_text), FAQItem(R.string.faq_1_title, R.string.faq_1_text),
@ -495,9 +490,10 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
} }
override fun refreshContacts(refreshTabsMask: Int) { override fun refreshContacts(refreshTabsMask: Int) {
if (isActivityDestroyed() || isGettingContacts) { if (isDestroyed || isGettingContacts) {
return return
} }
isGettingContacts = true isGettingContacts = true
if (viewpager.adapter == null) { if (viewpager.adapter == null) {
@ -507,7 +503,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
ContactsHelper(this).getContacts { ContactsHelper(this).getContacts {
isGettingContacts = false isGettingContacts = false
if (isActivityDestroyed()) { if (isDestroyed) {
return@getContacts return@getContacts
} }
@ -551,6 +547,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
add(Release(29, R.string.release_29)) add(Release(29, R.string.release_29))
add(Release(31, R.string.release_31)) add(Release(31, R.string.release_31))
add(Release(32, R.string.release_32)) add(Release(32, R.string.release_32))
add(Release(34, R.string.release_34))
checkWhatsNew(this, BuildConfig.VERSION_CODE) checkWhatsNew(this, BuildConfig.VERSION_CODE)
} }
} }

View File

@ -6,9 +6,7 @@ import android.os.Bundle
import android.provider.ContactsContract import android.provider.ContactsContract
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import com.simplemobiletools.commons.extensions.baseConfig import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.extensions.isActivityDestroyed
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.R
@ -21,14 +19,15 @@ import com.simplemobiletools.contacts.extensions.getVisibleContactSources
import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.helpers.ContactsHelper
import com.simplemobiletools.contacts.helpers.SMT_PRIVATE import com.simplemobiletools.contacts.helpers.SMT_PRIVATE
import com.simplemobiletools.contacts.models.Contact import com.simplemobiletools.contacts.models.Contact
import kotlinx.android.synthetic.main.layout_select_contact.* import kotlinx.android.synthetic.main.activity_select_contact.*
class SelectContactActivity : SimpleActivity() { class SelectContactActivity : SimpleActivity() {
private var specialMimeType: String? = null private var specialMimeType: String? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.layout_select_contact) setContentView(R.layout.activity_select_contact)
setupPlaceholders()
handlePermission(PERMISSION_READ_CONTACTS) { handlePermission(PERMISSION_READ_CONTACTS) {
if (it) { if (it) {
@ -80,7 +79,7 @@ class SelectContactActivity : SimpleActivity() {
private fun initContacts() { private fun initContacts() {
ContactsHelper(this).getContacts { ContactsHelper(this).getContacts {
if (isActivityDestroyed()) { if (isDestroyed) {
return@getContacts return@getContacts
} }
@ -105,8 +104,11 @@ class SelectContactActivity : SimpleActivity() {
contacts.sort() contacts.sort()
runOnUiThread { runOnUiThread {
select_contact_list.adapter = SelectContactsAdapter(this, contacts, ArrayList(), false) { updatePlaceholderVisibility(contacts)
SelectContactsAdapter(this, contacts, ArrayList(), false, select_contact_list) {
confirmSelection(it) confirmSelection(it)
}.apply {
select_contact_list.adapter = this
} }
select_contact_fastscroller.allowBubbleDisplay = baseConfig.showInfoBubble select_contact_fastscroller.allowBubbleDisplay = baseConfig.showInfoBubble
@ -132,9 +134,29 @@ class SelectContactActivity : SimpleActivity() {
val contactId = ContactsHelper(this).getContactMimeTypeId(contact.id.toString(), specialMimeType!!) val contactId = ContactsHelper(this).getContactMimeTypeId(contact.id.toString(), specialMimeType!!)
Uri.withAppendedPath(ContactsContract.Data.CONTENT_URI, contactId) Uri.withAppendedPath(ContactsContract.Data.CONTENT_URI, contactId)
} }
else -> { else -> getContactPublicUri(contact)
getContactPublicUri(contact) }
}
private fun setupPlaceholders() {
select_contact_placeholder.setTextColor(config.textColor)
select_contact_placeholder_2.setTextColor(getAdjustedPrimaryColor())
select_contact_placeholder_2.underlineText()
select_contact_placeholder_2.setOnClickListener {
FilterContactSourcesDialog(this) {
initContacts()
} }
} }
} }
private fun updatePlaceholderVisibility(contacts: ArrayList<Contact>) {
select_contact_list.beVisibleIf(contacts.isNotEmpty())
select_contact_placeholder_2.beVisibleIf(contacts.isEmpty())
select_contact_placeholder.beVisibleIf(contacts.isEmpty())
select_contact_placeholder.setText(when (specialMimeType) {
ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_emails
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_phone_numbers
else -> R.string.no_contacts_found
})
}
} }

View File

@ -35,7 +35,9 @@ class SettingsActivity : SimpleActivity() {
setupShowInfoBubble() setupShowInfoBubble()
setupShowContactThumbnails() setupShowContactThumbnails()
setupShowPhoneNumbers() setupShowPhoneNumbers()
setupShowContactsWithNumbers()
setupStartNameWithSurname() setupStartNameWithSurname()
setupUse24HourTimeFormat()
setupFilterDuplicates() setupFilterDuplicates()
setupShowCallConfirmation() setupShowCallConfirmation()
setupOnContactClick() setupOnContactClick()
@ -109,6 +111,14 @@ class SettingsActivity : SimpleActivity() {
} }
} }
private fun setupShowContactsWithNumbers() {
settings_show_only_contacts_with_numbers.isChecked = config.showOnlyContactsWithNumbers
settings_show_only_contacts_with_numbers_holder.setOnClickListener {
settings_show_only_contacts_with_numbers.toggle()
config.showOnlyContactsWithNumbers = settings_show_only_contacts_with_numbers.isChecked
}
}
private fun setupStartNameWithSurname() { private fun setupStartNameWithSurname() {
settings_start_with_surname.isChecked = config.startNameWithSurname settings_start_with_surname.isChecked = config.startNameWithSurname
settings_start_with_surname_holder.setOnClickListener { settings_start_with_surname_holder.setOnClickListener {
@ -117,6 +127,14 @@ class SettingsActivity : SimpleActivity() {
} }
} }
private fun setupUse24HourTimeFormat() {
settings_use_24_hour_time_format.isChecked = config.use24HourFormat
settings_use_24_hour_time_format_holder.setOnClickListener {
settings_use_24_hour_time_format.toggle()
config.use24HourFormat = settings_use_24_hour_time_format.isChecked
}
}
private fun setupFilterDuplicates() { private fun setupFilterDuplicates() {
settings_filter_duplicates.isChecked = config.filterDuplicates settings_filter_duplicates.isChecked = config.filterDuplicates
settings_filter_duplicates_holder.setOnClickListener { settings_filter_duplicates_holder.setOnClickListener {

View File

@ -354,12 +354,16 @@ class ViewContactActivity : ContactActivity() {
private fun setupOrganization() { private fun setupOrganization() {
val organization = contact!!.organization val organization = contact!!.organization
if (!organization.isEmpty() && showFields and SHOW_ORGANIZATION_FIELD != 0) { if (organization.isNotEmpty() && showFields and SHOW_ORGANIZATION_FIELD != 0) {
contact_organization_company.text = organization.company contact_organization_company.text = organization.company
contact_organization_job_position.text = organization.jobPosition contact_organization_job_position.text = organization.jobPosition
contact_organization_image.beGoneIf(organization.isEmpty()) contact_organization_image.beGoneIf(organization.isEmpty())
contact_organization_company.beGoneIf(organization.company.isEmpty()) contact_organization_company.beGoneIf(organization.company.isEmpty())
contact_organization_job_position.beGoneIf(organization.jobPosition.isEmpty()) contact_organization_job_position.beGoneIf(organization.jobPosition.isEmpty())
if (organization.company.isEmpty() && organization.jobPosition.isNotEmpty()) {
(contact_organization_image.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.ALIGN_TOP, contact_organization_job_position.id)
}
} else { } else {
contact_organization_image.beGone() contact_organization_image.beGone()
contact_organization_company.beGone() contact_organization_company.beGone()

View File

@ -12,7 +12,10 @@ import com.bumptech.glide.signature.ObjectKey
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor
import com.simplemobiletools.commons.extensions.highlightTextPart
import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.commons.views.MyRecyclerView
@ -33,6 +36,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
private lateinit var contactDrawable: Drawable private lateinit var contactDrawable: Drawable
private lateinit var businessContactDrawable: Drawable
private var config = activity.config private var config = activity.config
private var textToHighlight = highlightText private var textToHighlight = highlightText
@ -72,14 +76,8 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
} }
} }
override fun prepareItemSelection(viewHolder: ViewHolder) {}
override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
viewHolder?.itemView?.contact_frame?.isSelected = select
}
override fun actionItemPressed(id: Int) { override fun actionItemPressed(id: Int) {
if (selectedPositions.isEmpty()) { if (selectedKeys.isEmpty()) {
return return
} }
@ -100,6 +98,10 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
override fun getIsItemSelectable(position: Int) = true override fun getIsItemSelectable(position: Int) = true
override fun getItemSelectionKey(position: Int) = contactItems.getOrNull(position)?.id
override fun getItemKeyPosition(key: Int) = contactItems.indexOfFirst { it.id == key }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val layout = if (showPhoneNumbers) R.layout.item_contact_with_number else R.layout.item_contact_without_number val layout = if (showPhoneNumbers) R.layout.item_contact_with_number else R.layout.item_contact_without_number
return createViewHolder(layout, parent) return createViewHolder(layout, parent)
@ -108,16 +110,19 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) { override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
val contact = contactItems[position] val contact = contactItems[position]
val allowLongClick = location != LOCATION_INSERT_OR_EDIT val allowLongClick = location != LOCATION_INSERT_OR_EDIT
val view = holder.bindView(contact, true, allowLongClick) { itemView, layoutPosition -> holder.bindView(contact, true, allowLongClick) { itemView, layoutPosition ->
setupView(itemView, contact) setupView(itemView, contact)
} }
bindViewHolder(holder, position, view) bindViewHolder(holder)
} }
override fun getItemCount() = contactItems.size override fun getItemCount() = contactItems.size
private fun getItemWithKey(key: Int): Contact? = contactItems.firstOrNull { it.id == key }
fun initDrawables() { fun initDrawables() {
contactDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_person, textColor) contactDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_person, textColor)
businessContactDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_business, textColor)
} }
fun updateItems(newItems: ArrayList<Contact>, highlightText: String = "") { fun updateItems(newItems: ArrayList<Contact>, highlightText: String = "") {
@ -134,7 +139,8 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
} }
private fun editContact() { private fun editContact() {
activity.editContact(contactItems[selectedPositions.first()]) val contact = getItemWithKey(selectedKeys.first()) ?: return
activity.editContact(contact)
} }
private fun askConfirmDelete() { private fun askConfirmDelete() {
@ -144,17 +150,12 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
} }
private fun deleteContacts() { private fun deleteContacts() {
if (selectedPositions.isEmpty()) { if (selectedKeys.isEmpty()) {
return return
} }
val contactsToRemove = ArrayList<Contact>() val contactsToRemove = getSelectedItems()
selectedPositions.sortedDescending().forEach { val positions = getSelectedItemPositions()
val contact = contactItems.getOrNull(it)
if (contact != null) {
contactsToRemove.add(contact)
}
}
contactItems.removeAll(contactsToRemove) contactItems.removeAll(contactsToRemove)
ContactsHelper(activity).deleteContacts(contactsToRemove) ContactsHelper(activity).deleteContacts(contactsToRemove)
@ -162,16 +163,15 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
refreshListener?.refreshContacts(ALL_TABS_MASK) refreshListener?.refreshContacts(ALL_TABS_MASK)
finishActMode() finishActMode()
} else { } else {
removeSelectedItems() removeSelectedItems(positions)
refreshListener?.refreshContacts(CONTACTS_TAB_MASK or FAVORITES_TAB_MASK) refreshListener?.refreshContacts(CONTACTS_TAB_MASK or FAVORITES_TAB_MASK)
} }
} }
// used for removing contacts from groups or favorites, not deleting actual contacts
private fun removeContacts() { private fun removeContacts() {
val contactsToRemove = ArrayList<Contact>() val contactsToRemove = getSelectedItems()
selectedPositions.sortedDescending().forEach { val positions = getSelectedItemPositions()
contactsToRemove.add(contactItems[it])
}
contactItems.removeAll(contactsToRemove) contactItems.removeAll(contactsToRemove)
if (location == LOCATION_FAVORITES_TAB) { if (location == LOCATION_FAVORITES_TAB) {
@ -180,22 +180,22 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
refreshListener?.refreshContacts(FAVORITES_TAB_MASK) refreshListener?.refreshContacts(FAVORITES_TAB_MASK)
finishActMode() finishActMode()
} else { } else {
removeSelectedItems() removeSelectedItems(positions)
} }
} else if (location == LOCATION_GROUP_CONTACTS) { } else if (location == LOCATION_GROUP_CONTACTS) {
removeListener?.removeFromGroup(contactsToRemove) removeListener?.removeFromGroup(contactsToRemove)
removeSelectedItems() removeSelectedItems(positions)
} }
} }
private fun addToFavorites() { private fun addToFavorites() {
ContactsHelper(activity).addFavorites(getSelectedContacts()) ContactsHelper(activity).addFavorites(getSelectedItems())
refreshListener?.refreshContacts(FAVORITES_TAB_MASK) refreshListener?.refreshContacts(FAVORITES_TAB_MASK)
finishActMode() finishActMode()
} }
private fun addToGroup() { private fun addToGroup() {
val selectedContacts = getSelectedContacts() val selectedContacts = getSelectedItems()
val NEW_GROUP_ID = -1 val NEW_GROUP_ID = -1
val items = ArrayList<RadioItem>() val items = ArrayList<RadioItem>()
ContactsHelper(activity).getStoredGroups().forEach { ContactsHelper(activity).getStoredGroups().forEach {
@ -223,41 +223,30 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
} }
private fun shareContacts() { private fun shareContacts() {
val contactsIDs = ArrayList<Int>() activity.shareContacts(getSelectedItems())
selectedPositions.forEach {
contactsIDs.add(contactItems[it].id)
}
val filtered = contactItems.filter { contactsIDs.contains(it.id) } as ArrayList<Contact>
activity.shareContacts(filtered)
} }
private fun sendSMSToContacts() { private fun sendSMSToContacts() {
activity.sendSMSToContacts(getSelectedContacts()) activity.sendSMSToContacts(getSelectedItems())
} }
private fun sendEmailToContacts() { private fun sendEmailToContacts() {
activity.sendEmailToContacts(getSelectedContacts()) activity.sendEmailToContacts(getSelectedItems())
} }
private fun getSelectedContacts(): ArrayList<Contact> { private fun getSelectedItems() = contactItems.filter { selectedKeys.contains(it.id) } as ArrayList<Contact>
val contacts = ArrayList<Contact>()
selectedPositions.forEach {
contacts.add(contactItems[it])
}
return contacts
}
override fun onViewRecycled(holder: ViewHolder) { override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder) super.onViewRecycled(holder)
if (!activity.isActivityDestroyed()) { if (!activity.isDestroyed) {
Glide.with(activity).clear(holder.itemView?.contact_tmb!!) Glide.with(activity).clear(holder.itemView.contact_tmb)
} }
} }
private fun setupView(view: View, contact: Contact) { private fun setupView(view: View, contact: Contact) {
view.apply { view.apply {
val fullName = contact.getFullName() contact_frame?.isSelected = selectedKeys.contains(contact.id)
val fullName = contact.getNameToDisplay()
contact_name.text = if (textToHighlight.isEmpty()) fullName else fullName.highlightTextPart(textToHighlight, adjustedPrimaryColor) contact_name.text = if (textToHighlight.isEmpty()) fullName else fullName.highlightTextPart(textToHighlight, adjustedPrimaryColor)
contact_name.setTextColor(textColor) contact_name.setTextColor(textColor)
contact_name.setPadding(if (showContactThumbnails) smallPadding else bigPadding, smallPadding, smallPadding, 0) contact_name.setPadding(if (showContactThumbnails) smallPadding else bigPadding, smallPadding, smallPadding, 0)
@ -278,12 +267,13 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
contact_tmb.beVisibleIf(showContactThumbnails) contact_tmb.beVisibleIf(showContactThumbnails)
if (showContactThumbnails) { if (showContactThumbnails) {
val placeholderImage = if (contact.isABusinessContact()) businessContactDrawable else contactDrawable
when { when {
contact.photoUri.isNotEmpty() -> { contact.photoUri.isNotEmpty() -> {
val options = RequestOptions() val options = RequestOptions()
.signature(ObjectKey(contact.photoUri)) .signature(ObjectKey(contact.photoUri))
.diskCacheStrategy(DiskCacheStrategy.RESOURCE) .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.error(contactDrawable) .error(placeholderImage)
.centerCrop() .centerCrop()
Glide.with(activity).load(contact.photoUri).transition(DrawableTransitionOptions.withCrossFade()).apply(options).into(contact_tmb) Glide.with(activity).load(contact.photoUri).transition(DrawableTransitionOptions.withCrossFade()).apply(options).into(contact_tmb)
@ -292,12 +282,12 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
val options = RequestOptions() val options = RequestOptions()
.signature(ObjectKey(contact.photo!!)) .signature(ObjectKey(contact.photo!!))
.diskCacheStrategy(DiskCacheStrategy.RESOURCE) .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.error(contactDrawable) .error(placeholderImage)
.centerCrop() .centerCrop()
Glide.with(activity).load(contact.photo).transition(DrawableTransitionOptions.withCrossFade()).apply(options).into(contact_tmb) Glide.with(activity).load(contact.photo).transition(DrawableTransitionOptions.withCrossFade()).apply(options).into(contact_tmb)
} }
else -> contact_tmb.setImageDrawable(contactDrawable) else -> contact_tmb.setImageDrawable(placeholderImage)
} }
} }
} }

View File

@ -1,11 +1,9 @@
package com.simplemobiletools.contacts.adapters package com.simplemobiletools.contacts.adapters
import android.support.v7.widget.RecyclerView
import android.util.SparseArray
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
import com.simplemobiletools.commons.interfaces.MyAdapterListener
import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.R
import com.simplemobiletools.contacts.activities.SimpleActivity import com.simplemobiletools.contacts.activities.SimpleActivity
import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.config
@ -16,13 +14,12 @@ import java.util.*
class FilterContactSourcesAdapter(val activity: SimpleActivity, private val contactSources: List<ContactSource>, private val displayContactSources: ArrayList<String>) : class FilterContactSourcesAdapter(val activity: SimpleActivity, private val contactSources: List<ContactSource>, private val displayContactSources: ArrayList<String>) :
RecyclerView.Adapter<FilterContactSourcesAdapter.ViewHolder>() { RecyclerView.Adapter<FilterContactSourcesAdapter.ViewHolder>() {
private val itemViews = SparseArray<View>() private val selectedKeys = HashSet<Int>()
private val selectedPositions = HashSet<Int>()
init { init {
contactSources.forEachIndexed { index, contactSource -> contactSources.forEachIndexed { index, contactSource ->
if (displayContactSources.contains(contactSource.name)) { if (displayContactSources.contains(contactSource.name)) {
selectedPositions.add(index) selectedKeys.add(contactSource.hashCode())
} }
if (contactSource.name == activity.config.localAccountName && contactSource.type == activity.config.localAccountType) { if (contactSource.name == activity.config.localAccountName && contactSource.type == activity.config.localAccountType) {
@ -30,61 +27,50 @@ class FilterContactSourcesAdapter(val activity: SimpleActivity, private val cont
} }
if (contactSource.type == SMT_PRIVATE && displayContactSources.contains(SMT_PRIVATE)) { if (contactSource.type == SMT_PRIVATE && displayContactSources.contains(SMT_PRIVATE)) {
selectedPositions.add(index) selectedKeys.add(contactSource.hashCode())
} }
} }
} }
private fun toggleItemSelection(select: Boolean, pos: Int) { private fun toggleItemSelection(select: Boolean, contactSource: ContactSource, position: Int) {
if (select) { if (select) {
if (itemViews[pos] != null) { selectedKeys.add(contactSource.hashCode())
selectedPositions.add(pos)
}
} else { } else {
selectedPositions.remove(pos) selectedKeys.remove(contactSource.hashCode())
} }
itemViews[pos]?.filter_contact_source_checkbox?.isChecked = select notifyItemChanged(position)
} }
private val adapterListener = object : MyAdapterListener { fun getSelectedContactSources() = contactSources.filter { selectedKeys.contains(it.hashCode()) }
override fun toggleItemSelectionAdapter(select: Boolean, position: Int) {
toggleItemSelection(select, position)
}
override fun getSelectedPositions() = selectedPositions
override fun itemLongClicked(position: Int) {}
}
fun getSelectedItemsSet() = selectedPositions
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = activity.layoutInflater.inflate(R.layout.item_filter_contact_source, parent, false) val view = activity.layoutInflater.inflate(R.layout.item_filter_contact_source, parent, false)
return ViewHolder(view, adapterListener, activity) return ViewHolder(view)
} }
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val contactSource = contactSources[position] val contactSource = contactSources[position]
itemViews.put(position, holder.bindView(contactSource.name)) holder.bindView(contactSource)
toggleItemSelection(selectedPositions.contains(position), position)
} }
override fun getItemCount() = contactSources.size override fun getItemCount() = contactSources.size
class ViewHolder(view: View, private val adapterListener: MyAdapterListener, val activity: SimpleActivity) : RecyclerView.ViewHolder(view) { inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bindView(contactSource: String): View { fun bindView(contactSource: ContactSource): View {
val isSelected = selectedKeys.contains(contactSource.hashCode())
itemView.apply { 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.setColors(activity.config.textColor, activity.getAdjustedPrimaryColor(), activity.config.backgroundColor)
filter_contact_source_checkbox.text = contactSource filter_contact_source_checkbox.text = contactSource.name
filter_contact_source_holder.setOnClickListener { viewClicked(!filter_contact_source_checkbox.isChecked) } filter_contact_source_holder.setOnClickListener { viewClicked(!isSelected, contactSource) }
} }
return itemView return itemView
} }
private fun viewClicked(select: Boolean) { private fun viewClicked(select: Boolean, contactSource: ContactSource) {
adapterListener.toggleItemSelectionAdapter(select, adapterPosition) toggleItemSelection(select, contactSource, adapterPosition)
} }
} }
} }

View File

@ -41,14 +41,8 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList<Group>, val
} }
} }
override fun prepareItemSelection(viewHolder: ViewHolder) {}
override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
viewHolder?.itemView?.group_frame?.isSelected = select
}
override fun actionItemPressed(id: Int) { override fun actionItemPressed(id: Int) {
if (selectedPositions.isEmpty()) { if (selectedKeys.isEmpty()) {
return return
} }
@ -63,18 +57,24 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList<Group>, val
override fun getIsItemSelectable(position: Int) = true override fun getIsItemSelectable(position: Int) = true
override fun getItemSelectionKey(position: Int) = groups.getOrNull(position)?.id?.toInt()
override fun getItemKeyPosition(key: Int) = groups.indexOfFirst { it.id.toInt() == key }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_group, parent) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_group, parent)
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) { override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
val group = groups[position] val group = groups[position]
val view = holder.bindView(group, true, true) { itemView, layoutPosition -> holder.bindView(group, true, true) { itemView, layoutPosition ->
setupView(itemView, group) setupView(itemView, group)
} }
bindViewHolder(holder, position, view) bindViewHolder(holder)
} }
override fun getItemCount() = groups.size override fun getItemCount() = groups.size
private fun getItemWithKey(key: Int): Group? = groups.firstOrNull { it.id.toInt() == key }
fun updateItems(newItems: ArrayList<Group>) { fun updateItems(newItems: ArrayList<Group>) {
groups = newItems groups = newItems
notifyDataSetChanged() notifyDataSetChanged()
@ -83,7 +83,8 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList<Group>, val
} }
private fun renameGroup() { private fun renameGroup() {
RenameGroupDialog(activity, groups[selectedPositions.first()]) { val group = getItemWithKey(selectedKeys.first()) ?: return
RenameGroupDialog(activity, group) {
finishActMode() finishActMode()
refreshListener?.refreshContacts(GROUPS_TAB_MASK) refreshListener?.refreshContacts(GROUPS_TAB_MASK)
} }
@ -96,18 +97,17 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList<Group>, val
} }
private fun deleteGroups() { private fun deleteGroups() {
if (selectedPositions.isEmpty()) { if (selectedKeys.isEmpty()) {
return return
} }
val groupsToRemove = ArrayList<Group>() val groupsToRemove = groups.filter { selectedKeys.contains(it.id.toInt()) } as ArrayList<Group>
selectedPositions.sortedDescending().forEach { val positions = getSelectedItemPositions()
val group = groups[it] groupsToRemove.forEach {
groupsToRemove.add(group) if (it.isPrivateSecretGroup()) {
if (group.isPrivateSecretGroup()) { activity.dbHelper.deleteGroup(it.id)
activity.dbHelper.deleteGroup(group.id)
} else { } else {
ContactsHelper(activity).deleteGroup(group.id) ContactsHelper(activity).deleteGroup(it.id)
} }
} }
groups.removeAll(groupsToRemove) groups.removeAll(groupsToRemove)
@ -116,12 +116,13 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList<Group>, val
refreshListener?.refreshContacts(GROUPS_TAB_MASK) refreshListener?.refreshContacts(GROUPS_TAB_MASK)
finishActMode() finishActMode()
} else { } else {
removeSelectedItems() removeSelectedItems(positions)
} }
} }
private fun setupView(view: View, group: Group) { private fun setupView(view: View, group: Group) {
view.apply { view.apply {
group_frame?.isSelected = selectedKeys.contains(group.id.toInt())
group_name.apply { group_name.apply {
setTextColor(textColor) setTextColor(textColor)
text = String.format(activity.getString(R.string.groups_placeholder), group.title, group.contactsCount.toString()) text = String.format(activity.getString(R.string.groups_placeholder), group.title, group.contactsCount.toString())

View File

@ -30,14 +30,8 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<Re
override fun prepareActionMode(menu: Menu) {} override fun prepareActionMode(menu: Menu) {}
override fun prepareItemSelection(viewHolder: ViewHolder) {}
override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
viewHolder?.itemView?.recent_call_frame?.isSelected = select
}
override fun actionItemPressed(id: Int) { override fun actionItemPressed(id: Int) {
if (selectedPositions.isEmpty()) { if (selectedKeys.isEmpty()) {
return return
} }
@ -51,14 +45,18 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<Re
override fun getIsItemSelectable(position: Int) = true 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 onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_recent_call, parent)
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) { override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
val recentCall = recentCalls[position] val recentCall = recentCalls[position]
val view = holder.bindView(recentCall, true, true) { itemView, layoutPosition -> holder.bindView(recentCall, true, true) { itemView, layoutPosition ->
setupView(itemView, recentCall) setupView(itemView, recentCall)
} }
bindViewHolder(holder, position, view) bindViewHolder(holder)
} }
override fun getItemCount() = recentCalls.size override fun getItemCount() = recentCalls.size
@ -77,15 +75,12 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<Re
} }
private fun deleteRecentCalls() { private fun deleteRecentCalls() {
if (selectedPositions.isEmpty()) { if (selectedKeys.isEmpty()) {
return return
} }
val callsToRemove = ArrayList<RecentCall>() val callsToRemove = getSelectedItems()
selectedPositions.sortedDescending().forEach { val positions = getSelectedItemPositions()
val call = recentCalls[it]
callsToRemove.add(call)
}
ContactsHelper(activity).removeRecentCalls(callsToRemove.map { it.id } as ArrayList<Int>) ContactsHelper(activity).removeRecentCalls(callsToRemove.map { it.id } as ArrayList<Int>)
recentCalls.removeAll(callsToRemove) recentCalls.removeAll(callsToRemove)
@ -93,12 +88,15 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<Re
refreshListener?.refreshContacts(RECENTS_TAB_MASK) refreshListener?.refreshContacts(RECENTS_TAB_MASK)
finishActMode() finishActMode()
} else { } else {
removeSelectedItems() removeSelectedItems(positions)
} }
} }
private fun getSelectedItems() = recentCalls.filter { selectedKeys.contains(it.id) } as ArrayList<RecentCall>
private fun setupView(view: View, recentCall: RecentCall) { private fun setupView(view: View, recentCall: RecentCall) {
view.apply { view.apply {
recent_call_frame?.isSelected = selectedKeys.contains(recentCall.id)
recent_call_name.apply { recent_call_name.apply {
text = recentCall.name ?: recentCall.number text = recentCall.name ?: recentCall.number
setTextColor(textColor) setTextColor(textColor)

View File

@ -1,10 +1,11 @@
package com.simplemobiletools.contacts.adapters package com.simplemobiletools.contacts.adapters
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.support.v7.widget.RecyclerView
import android.util.SparseArray import android.util.SparseArray
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
@ -13,8 +14,7 @@ import com.bumptech.glide.signature.ObjectKey
import com.simplemobiletools.commons.extensions.beVisibleIf import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor
import com.simplemobiletools.commons.extensions.isActivityDestroyed import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.commons.interfaces.MyAdapterListener
import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.R
import com.simplemobiletools.contacts.activities.SimpleActivity import com.simplemobiletools.contacts.activities.SimpleActivity
import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.config
@ -24,7 +24,7 @@ import kotlinx.android.synthetic.main.item_add_favorite_with_number.view.*
import java.util.* import java.util.*
class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Contact>, private val selectedContacts: ArrayList<Contact>, private val allowPickMultiple: Boolean, class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Contact>, private val selectedContacts: ArrayList<Contact>, private val allowPickMultiple: Boolean,
private val itemClick: ((Contact) -> Unit)? = null) : RecyclerView.Adapter<SelectContactsAdapter.ViewHolder>() { private val recyclerView: MyRecyclerView, private val itemClick: ((Contact) -> Unit)? = null) : RecyclerView.Adapter<SelectContactsAdapter.ViewHolder>() {
private val itemViews = SparseArray<View>() private val itemViews = SparseArray<View>()
private val selectedPositions = HashSet<Int>() private val selectedPositions = HashSet<Int>()
private val config = activity.config private val config = activity.config
@ -38,10 +38,19 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Con
init { init {
contacts.forEachIndexed { index, contact -> contacts.forEachIndexed { index, contact ->
if (selectedContacts.map { it.id }.contains(contact.id)) { if (selectedContacts.asSequence().map { it.id }.contains(contact.id)) {
selectedPositions.add(index) selectedPositions.add(index)
} }
} }
if (recyclerView.itemDecorationCount > 0) {
recyclerView.removeItemDecorationAt(0)
}
DividerItemDecoration(activity, DividerItemDecoration.VERTICAL).apply {
setDrawable(activity.resources.getDrawable(R.drawable.divider))
recyclerView.addItemDecoration(this)
}
} }
private fun toggleItemSelection(select: Boolean, pos: Int) { private fun toggleItemSelection(select: Boolean, pos: Int) {
@ -56,16 +65,6 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Con
itemViews[pos]?.contact_checkbox?.isChecked = select itemViews[pos]?.contact_checkbox?.isChecked = select
} }
private val adapterListener = object : MyAdapterListener {
override fun toggleItemSelectionAdapter(select: Boolean, position: Int) {
toggleItemSelection(select, position)
}
override fun getSelectedPositions() = selectedPositions
override fun itemLongClicked(position: Int) {}
}
fun getSelectedItemsSet(): HashSet<Contact> { fun getSelectedItemsSet(): HashSet<Contact> {
val selectedItemsSet = HashSet<Contact>(selectedPositions.size) val selectedItemsSet = HashSet<Contact>(selectedPositions.size)
selectedPositions.forEach { selectedItemsSet.add(contacts[it]) } selectedPositions.forEach { selectedItemsSet.add(contacts[it]) }
@ -74,7 +73,7 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Con
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = activity.layoutInflater.inflate(itemLayout, parent, false) val view = activity.layoutInflater.inflate(itemLayout, parent, false)
return ViewHolder(view, adapterListener, activity, allowPickMultiple, itemClick) return ViewHolder(view)
} }
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
@ -85,16 +84,15 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Con
override fun getItemCount() = contacts.size override fun getItemCount() = contacts.size
class ViewHolder(view: View, private val adapterListener: MyAdapterListener, val activity: SimpleActivity, private val showCheckbox: Boolean, inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
private val itemClick: ((Contact) -> Unit)?) : RecyclerView.ViewHolder(view) {
fun bindView(contact: Contact, contactDrawable: Drawable, config: Config, showContactThumbnails: Boolean, fun bindView(contact: Contact, contactDrawable: Drawable, config: Config, showContactThumbnails: Boolean,
smallPadding: Int, bigPadding: Int): View { smallPadding: Int, bigPadding: Int): View {
itemView.apply { itemView.apply {
contact_checkbox.beVisibleIf(showCheckbox) contact_checkbox.beVisibleIf(allowPickMultiple)
contact_checkbox.setColors(config.textColor, context.getAdjustedPrimaryColor(), config.backgroundColor) contact_checkbox.setColors(config.textColor, context.getAdjustedPrimaryColor(), config.backgroundColor)
val textColor = config.textColor val textColor = config.textColor
contact_name.text = contact.getFullName() contact_name.text = contact.getNameToDisplay()
contact_name.setTextColor(textColor) contact_name.setTextColor(textColor)
contact_name.setPadding(if (showContactThumbnails) smallPadding else bigPadding, smallPadding, smallPadding, 0) contact_name.setPadding(if (showContactThumbnails) smallPadding else bigPadding, smallPadding, smallPadding, 0)
@ -119,7 +117,7 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Con
.error(contactDrawable) .error(contactDrawable)
.centerCrop() .centerCrop()
if (activity.isActivityDestroyed()) { if (activity.isDestroyed) {
Glide.with(activity).load(contact.photoUri).transition(DrawableTransitionOptions.withCrossFade()).apply(options).into(contact_tmb) Glide.with(activity).load(contact.photoUri).transition(DrawableTransitionOptions.withCrossFade()).apply(options).into(contact_tmb)
} }
} else { } else {
@ -132,14 +130,14 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Con
} }
private fun viewClicked(select: Boolean) { private fun viewClicked(select: Boolean) {
adapterListener.toggleItemSelectionAdapter(select, adapterPosition) toggleItemSelection(select, adapterPosition)
} }
} }
override fun onViewRecycled(holder: ViewHolder) { override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder) super.onViewRecycled(holder)
if (!activity.isActivityDestroyed()) { if (!activity.isDestroyed) {
Glide.with(activity).clear(holder.itemView?.contact_tmb!!) Glide.with(activity).clear(holder.itemView.contact_tmb)
} }
} }
} }

View File

@ -1,8 +1,8 @@
package com.simplemobiletools.contacts.adapters package com.simplemobiletools.contacts.adapters
import android.support.v4.view.PagerAdapter
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.viewpager.widget.PagerAdapter
import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.R
import com.simplemobiletools.contacts.activities.MainActivity import com.simplemobiletools.contacts.activities.MainActivity
import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.config

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.contacts.dialogs package com.simplemobiletools.contacts.dialogs
import android.support.v7.app.AlertDialog import androidx.appcompat.app.AlertDialog
import android.view.animation.AnimationUtils import android.view.animation.AnimationUtils
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.applyColorFilter import com.simplemobiletools.commons.extensions.applyColorFilter

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.contacts.dialogs package com.simplemobiletools.contacts.dialogs
import android.support.v7.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.contacts.dialogs package com.simplemobiletools.contacts.dialogs
import android.support.v7.app.AlertDialog import androidx.appcompat.app.AlertDialog
import android.view.View import android.view.View
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.contacts.dialogs package com.simplemobiletools.contacts.dialogs
import android.support.v7.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.extensions.showKeyboard import com.simplemobiletools.commons.extensions.showKeyboard

View File

@ -1,7 +1,7 @@
package com.simplemobiletools.contacts.dialogs package com.simplemobiletools.contacts.dialogs
import android.support.v7.app.AlertDialog
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.R
import com.simplemobiletools.contacts.activities.SimpleActivity import com.simplemobiletools.contacts.activities.SimpleActivity
@ -23,7 +23,7 @@ class ExportContactsDialog(val activity: SimpleActivity, val path: String, priva
export_contacts_filename.setText("contacts_${activity.getCurrentFormattedDateTime()}") export_contacts_filename.setText("contacts_${activity.getCurrentFormattedDateTime()}")
ContactsHelper(activity).getContactSources { ContactsHelper(activity).getContactSources {
it.mapTo(contactSources, { it.copy() }) it.mapTo(contactSources) { it.copy() }
activity.runOnUiThread { activity.runOnUiThread {
export_contacts_list.adapter = FilterContactSourcesAdapter(activity, it, activity.getVisibleContactSources()) export_contacts_list.adapter = FilterContactSourcesAdapter(activity, it, activity.getVisibleContactSources())
} }
@ -34,34 +34,34 @@ class ExportContactsDialog(val activity: SimpleActivity, val path: String, priva
.setPositiveButton(R.string.ok, null) .setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
.create().apply { .create().apply {
activity.setupDialogStuff(view, this, R.string.export_contacts) { activity.setupDialogStuff(view, this, R.string.export_contacts) {
getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
if (view.export_contacts_list.adapter == null) { if (view.export_contacts_list.adapter == null) {
return@setOnClickListener
}
val filename = view.export_contacts_filename.value
when {
filename.isEmpty() -> activity.toast(R.string.empty_name)
filename.isAValidFilename() -> {
val file = File(path, "$filename.vcf")
if (file.exists()) {
activity.toast(R.string.name_taken)
return@setOnClickListener return@setOnClickListener
} }
val selectedIndexes = (view.export_contacts_list.adapter as FilterContactSourcesAdapter).getSelectedItemsSet() val filename = view.export_contacts_filename.value
val selectedContactSources = HashSet<String>() when {
selectedIndexes.forEach { filename.isEmpty() -> activity.toast(R.string.empty_name)
selectedContactSources.add(if (contactSources[it].type == SMT_PRIVATE) SMT_PRIVATE else contactSources[it].name) filename.isAValidFilename() -> {
val file = File(path, "$filename.vcf")
if (file.exists()) {
activity.toast(R.string.name_taken)
return@setOnClickListener
}
val selectedSources = (view.export_contacts_list.adapter as FilterContactSourcesAdapter).getSelectedContactSources()
val selectedContactSourceNames = HashSet<String>()
selectedSources.forEach {
selectedContactSourceNames.add(if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.name)
}
callback(file, selectedContactSourceNames)
dismiss()
}
else -> activity.toast(R.string.invalid_name)
} }
callback(file, selectedContactSources)
dismiss()
} }
else -> activity.toast(R.string.invalid_name)
} }
} }
}
}
} }
} }

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.contacts.dialogs package com.simplemobiletools.contacts.dialogs
import android.support.v7.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.R
import com.simplemobiletools.contacts.activities.SimpleActivity import com.simplemobiletools.contacts.activities.SimpleActivity
@ -24,13 +24,13 @@ class FilterContactSourcesDialog(val activity: SimpleActivity, private val callb
return@getContactSources return@getContactSources
} }
it.mapTo(contactSources, { it.copy() }) it.mapTo(contactSources) { it.copy() }
val selectedSources = activity.getVisibleContactSources() val selectedSources = activity.getVisibleContactSources()
activity.runOnUiThread { activity.runOnUiThread {
view.filter_contact_sources_list.adapter = FilterContactSourcesAdapter(activity, it, selectedSources) view.filter_contact_sources_list.adapter = FilterContactSourcesAdapter(activity, it, selectedSources)
dialog = AlertDialog.Builder(activity) dialog = AlertDialog.Builder(activity)
.setPositiveButton(R.string.ok, { dialogInterface, i -> confirmEventTypes() }) .setPositiveButton(R.string.ok) { dialogInterface, i -> confirmEventTypes() }
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
.create().apply { .create().apply {
activity.setupDialogStuff(view, this) activity.setupDialogStuff(view, this)
@ -40,21 +40,13 @@ class FilterContactSourcesDialog(val activity: SimpleActivity, private val callb
} }
private fun confirmEventTypes() { private fun confirmEventTypes() {
val selectedIndexes = (view.filter_contact_sources_list.adapter as FilterContactSourcesAdapter).getSelectedItemsSet() val selectedContactSources = (view.filter_contact_sources_list.adapter as FilterContactSourcesAdapter).getSelectedContactSources()
val ignoredIndexes = ArrayList<Int>() val ignoredContactSourceNames = contactSources.filter { !selectedContactSources.contains(it) }.map {
for (i in 0 until contactSources.size) { if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.name
if (!selectedIndexes.contains(i)) { }.toHashSet()
ignoredIndexes.add(i)
}
}
val ignoredContactSources = HashSet<String>() if (activity.getVisibleContactSources() != ignoredContactSourceNames) {
ignoredIndexes.forEach { activity.config.ignoredContactSources = ignoredContactSourceNames
ignoredContactSources.add(if (contactSources[it].type == SMT_PRIVATE) SMT_PRIVATE else contactSources[it].name)
}
if (activity.getVisibleContactSources() != ignoredContactSources) {
activity.config.ignoredContactSources = ignoredContactSources
callback() callback()
} }
dialog?.dismiss() dialog?.dismiss()

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.contacts.dialogs package com.simplemobiletools.contacts.dialogs
import android.support.v7.app.AlertDialog import androidx.appcompat.app.AlertDialog
import android.view.ViewGroup import android.view.ViewGroup
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.extensions.toast

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.contacts.dialogs package com.simplemobiletools.contacts.dialogs
import android.support.v7.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.views.MyAppCompatCheckbox import com.simplemobiletools.commons.views.MyAppCompatCheckbox

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.contacts.dialogs package com.simplemobiletools.contacts.dialogs
import android.support.v7.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.views.MyAppCompatCheckbox import com.simplemobiletools.commons.views.MyAppCompatCheckbox

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.contacts.dialogs package com.simplemobiletools.contacts.dialogs
import android.support.v7.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.R

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.contacts.dialogs package com.simplemobiletools.contacts.dialogs
import android.support.v7.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.extensions.baseConfig import com.simplemobiletools.commons.extensions.baseConfig
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.R
@ -33,7 +33,7 @@ class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayL
activity.runOnUiThread { activity.runOnUiThread {
view.apply { view.apply {
select_contact_list.adapter = SelectContactsAdapter(activity, allContacts, initiallySelectedContacts, true) select_contact_list.adapter = SelectContactsAdapter(activity, allContacts, initiallySelectedContacts, true, select_contact_list)
select_contact_fastscroller.allowBubbleDisplay = activity.baseConfig.showInfoBubble select_contact_fastscroller.allowBubbleDisplay = activity.baseConfig.showInfoBubble
select_contact_fastscroller.setViews(select_contact_list) { select_contact_fastscroller.setViews(select_contact_list) {
select_contact_fastscroller.updateBubbleText(allContacts[it].getBubbleText()) select_contact_fastscroller.updateBubbleText(allContacts[it].getBubbleText())
@ -42,7 +42,7 @@ class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayL
} }
AlertDialog.Builder(activity) AlertDialog.Builder(activity)
.setPositiveButton(R.string.ok, { dialog, which -> dialogConfirmed() }) .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
.create().apply { .create().apply {
activity.setupDialogStuff(view, this) activity.setupDialogStuff(view, this)

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.contacts.dialogs package com.simplemobiletools.contacts.dialogs
import android.support.v7.app.AlertDialog import androidx.appcompat.app.AlertDialog
import android.view.ViewGroup import android.view.ViewGroup
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.views.MyAppCompatCheckbox import com.simplemobiletools.commons.views.MyAppCompatCheckbox

View File

@ -36,7 +36,7 @@ fun SimpleActivity.startCallIntent(recipient: String) {
fun SimpleActivity.tryStartCall(contact: Contact) { fun SimpleActivity.tryStartCall(contact: Contact) {
if (config.showCallConfirmation) { if (config.showCallConfirmation) {
CallConfirmationDialog(this, contact.getFullName()) { CallConfirmationDialog(this, contact.getNameToDisplay()) {
startCall(contact) startCall(contact)
} }
} else { } else {
@ -63,8 +63,9 @@ fun SimpleActivity.startCall(contact: Contact) {
fun SimpleActivity.showContactSourcePicker(currentSource: String, callback: (newSource: String) -> Unit) { fun SimpleActivity.showContactSourcePicker(currentSource: String, callback: (newSource: String) -> Unit) {
ContactsHelper(this).getContactSources { ContactsHelper(this).getContactSources {
val ignoredTypes = arrayListOf( val ignoredTypes = arrayListOf(
"org.thoughtcrime.securesms", // Signal SIGNAL_PACKAGE,
"org.telegram.messenger" // Telegram TELEGRAM_PACKAGE,
WHATSAPP_PACKAGE
) )
val items = ArrayList<RadioItem>() val items = ArrayList<RadioItem>()

View File

@ -1,19 +1,16 @@
package com.simplemobiletools.contacts.extensions package com.simplemobiletools.contacts.extensions
import android.annotation.TargetApi
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.database.Cursor import android.database.Cursor
import android.net.Uri import android.net.Uri
import android.os.Build
import android.provider.ContactsContract import android.provider.ContactsContract
import android.support.v4.content.FileProvider import androidx.core.content.FileProvider
import com.simplemobiletools.commons.extensions.getIntValue import com.simplemobiletools.commons.extensions.getIntValue
import com.simplemobiletools.commons.extensions.hasPermission import com.simplemobiletools.commons.extensions.hasPermission
import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
import com.simplemobiletools.commons.helpers.isLollipopPlus
import com.simplemobiletools.contacts.BuildConfig import com.simplemobiletools.contacts.BuildConfig
import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.R
import com.simplemobiletools.contacts.activities.EditContactActivity import com.simplemobiletools.contacts.activities.EditContactActivity
@ -88,10 +85,9 @@ fun Context.openWebsiteIntent(url: String) {
} }
} }
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
fun Context.getLookupUriRawId(dataUri: Uri): Int { fun Context.getLookupUriRawId(dataUri: Uri): Int {
val lookupKey = getLookupKeyFromUri(dataUri) val lookupKey = getLookupKeyFromUri(dataUri)
if (lookupKey != null && isLollipopPlus()) { if (lookupKey != null) {
val uri = lookupContactUri(lookupKey, this) val uri = lookupContactUri(lookupKey, this)
if (uri != null) { if (uri != null) {
return getContactUriRawId(uri) return getContactUriRawId(uri)
@ -100,7 +96,6 @@ fun Context.getLookupUriRawId(dataUri: Uri): Int {
return -1 return -1
} }
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
fun Context.getContactUriRawId(uri: Uri): Int { fun Context.getContactUriRawId(uri: Uri): Int {
val projection = arrayOf(ContactsContract.Contacts.NAME_RAW_CONTACT_ID) val projection = arrayOf(ContactsContract.Contacts.NAME_RAW_CONTACT_ID)
var cursor: Cursor? = null var cursor: Cursor? = null

View File

@ -1,13 +0,0 @@
package com.simplemobiletools.contacts.extensions
import android.text.Editable
import android.text.TextWatcher
import android.widget.EditText
fun EditText.afterTextChanged(callback: (String) -> Unit) = addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(text: Editable) = callback(text.toString())
})

View File

@ -2,9 +2,9 @@ package com.simplemobiletools.contacts.fragments
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.support.design.widget.CoordinatorLayout
import android.util.AttributeSet import android.util.AttributeSet
import android.view.ViewGroup import android.view.ViewGroup
import androidx.coordinatorlayout.widget.CoordinatorLayout
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME
@ -88,7 +88,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fun startNameWithSurnameChanged(startNameWithSurname: Boolean) { fun startNameWithSurnameChanged(startNameWithSurname: Boolean) {
if (this !is GroupsFragment && this !is RecentsFragment) { if (this !is GroupsFragment && this !is RecentsFragment) {
(fragment_list.adapter as ContactsAdapter).apply { (fragment_list.adapter as? ContactsAdapter)?.apply {
config.sorting = if (startNameWithSurname) SORT_BY_SURNAME else SORT_BY_FIRST_NAME config.sorting = if (startNameWithSurname) SORT_BY_SURNAME else SORT_BY_FIRST_NAME
this@MyViewPagerFragment.activity!!.refreshContacts(CONTACTS_TAB_MASK or FAVORITES_TAB_MASK) this@MyViewPagerFragment.activity!!.refreshContacts(CONTACTS_TAB_MASK or FAVORITES_TAB_MASK)
} }
@ -104,7 +104,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
} }
if (config.lastUsedContactSource.isEmpty()) { if (config.lastUsedContactSource.isEmpty()) {
val grouped = contacts.groupBy { it.source }.maxWith(compareBy { it.value.size }) val grouped = contacts.asSequence().groupBy { it.source }.maxWith(compareBy { it.value.size })
config.lastUsedContactSource = grouped?.key ?: "" config.lastUsedContactSource = grouped?.key ?: ""
} }
@ -154,7 +154,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
} }
} }
storedGroups = storedGroups.sortedWith(compareBy { it.title }).toMutableList() as ArrayList<Group> storedGroups = storedGroups.asSequence().sortedWith(compareBy { it.title.normalizeString() }).toMutableList() as ArrayList<Group>
fragment_placeholder_2.beVisibleIf(storedGroups.isEmpty()) fragment_placeholder_2.beVisibleIf(storedGroups.isEmpty())
fragment_placeholder.beVisibleIf(storedGroups.isEmpty()) fragment_placeholder.beVisibleIf(storedGroups.isEmpty())
@ -239,7 +239,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
val shouldNormalize = text.normalizeString() == text val shouldNormalize = text.normalizeString() == text
(fragment_list.adapter as? ContactsAdapter)?.apply { (fragment_list.adapter as? ContactsAdapter)?.apply {
val filtered = contactsIgnoringSearch.filter { val filtered = contactsIgnoringSearch.filter {
getProperText(it.getFullName(), shouldNormalize).contains(text, true) || getProperText(it.getNameToDisplay(), shouldNormalize).contains(text, true) ||
getProperText(it.nickname, shouldNormalize).contains(text, true) || getProperText(it.nickname, shouldNormalize).contains(text, true) ||
it.doesContainPhoneNumber(text) || it.doesContainPhoneNumber(text) ||
it.emails.any { it.value.contains(text, true) } || it.emails.any { it.value.contains(text, true) } ||
@ -254,7 +254,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
Contact.sorting = config.sorting Contact.sorting = config.sorting
Contact.startWithSurname = config.startNameWithSurname Contact.startWithSurname = config.startNameWithSurname
filtered.sort() filtered.sort()
filtered.sortBy { !getProperText(it.getFullName(), shouldNormalize).startsWith(text, true) } filtered.sortBy { !getProperText(it.getNameToDisplay(), shouldNormalize).startsWith(text, true) }
if (filtered.isEmpty() && this@MyViewPagerFragment is FavoritesFragment) { if (filtered.isEmpty() && this@MyViewPagerFragment is FavoritesFragment) {
fragment_placeholder.text = activity.getString(R.string.no_items_found) fragment_placeholder.text = activity.getString(R.string.no_items_found)

View File

@ -5,7 +5,6 @@ import android.content.Intent
import android.util.AttributeSet import android.util.AttributeSet
import com.simplemobiletools.commons.extensions.beVisibleIf import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.hasPermission import com.simplemobiletools.commons.extensions.hasPermission
import com.simplemobiletools.commons.extensions.isActivityDestroyed
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CALL_LOG import com.simplemobiletools.commons.helpers.PERMISSION_READ_CALL_LOG
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CALL_LOG import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CALL_LOG
import com.simplemobiletools.contacts.activities.EditContactActivity import com.simplemobiletools.contacts.activities.EditContactActivity
@ -33,7 +32,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
} }
fun updateRecentCalls(recentCalls: ArrayList<RecentCall>) { fun updateRecentCalls(recentCalls: ArrayList<RecentCall>) {
if (activity == null || activity!!.isActivityDestroyed()) { if (activity == null || activity!!.isDestroyed) {
return return
} }

View File

@ -20,6 +20,10 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getBoolean(SHOW_PHONE_NUMBERS, false) get() = prefs.getBoolean(SHOW_PHONE_NUMBERS, false)
set(showPhoneNumbers) = prefs.edit().putBoolean(SHOW_PHONE_NUMBERS, showPhoneNumbers).apply() set(showPhoneNumbers) = prefs.edit().putBoolean(SHOW_PHONE_NUMBERS, showPhoneNumbers).apply()
var showOnlyContactsWithNumbers: Boolean
get() = prefs.getBoolean(SHOW_ONLY_CONTACTS_WITH_NUMBERS, false)
set(showOnlyContactsWithNumbers) = prefs.edit().putBoolean(SHOW_ONLY_CONTACTS_WITH_NUMBERS, showOnlyContactsWithNumbers).apply()
var startNameWithSurname: Boolean var startNameWithSurname: Boolean
get() = prefs.getBoolean(START_NAME_WITH_SURNAME, false) get() = prefs.getBoolean(START_NAME_WITH_SURNAME, false)
set(startNameWithSurname) = prefs.edit().putBoolean(START_NAME_WITH_SURNAME, startNameWithSurname).apply() set(startNameWithSurname) = prefs.edit().putBoolean(START_NAME_WITH_SURNAME, startNameWithSurname).apply()

View File

@ -5,6 +5,7 @@ import android.provider.ContactsContract.CommonDataKinds
// shared prefs // shared prefs
const val SHOW_CONTACT_THUMBNAILS = "show_contact_thumbnails" const val SHOW_CONTACT_THUMBNAILS = "show_contact_thumbnails"
const val SHOW_PHONE_NUMBERS = "show_phone_numbers" 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"
const val START_NAME_WITH_SURNAME = "start_name_with_surname" const val START_NAME_WITH_SURNAME = "start_name_with_surname"
const val LAST_USED_CONTACT_SOURCE = "last_used_contact_source" const val LAST_USED_CONTACT_SOURCE = "last_used_contact_source"
@ -113,3 +114,8 @@ val localAccountTypes = arrayListOf("vnd.sec.contact.phone",
"com.android.huawei.phone", "com.android.huawei.phone",
"Local Phone Account" "Local Phone Account"
) )
// apps with special handling
const val TELEGRAM_PACKAGE = "org.telegram.messenger"
const val SIGNAL_PACKAGE = "org.thoughtcrime.securesms"
const val WHATSAPP_PACKAGE = "com.whatsapp"

View File

@ -43,15 +43,26 @@ class ContactsHelper(val activity: Activity) {
} }
val contactsSize = contacts.size() val contactsSize = contacts.size()
val showOnlyContactsWithNumbers = activity.config.showOnlyContactsWithNumbers
var tempContacts = ArrayList<Contact>(contactsSize) var tempContacts = ArrayList<Contact>(contactsSize)
val resultContacts = ArrayList<Contact>(contactsSize) val resultContacts = ArrayList<Contact>(contactsSize)
(0 until contactsSize).mapTo(tempContacts) { contacts.valueAt(it) }
(0 until contactsSize).filter {
if (showOnlyContactsWithNumbers) {
contacts.valueAt(it).phoneNumbers.isNotEmpty()
} else {
true
}
}.mapTo(tempContacts) {
contacts.valueAt(it)
}
if (activity.config.filterDuplicates) { if (activity.config.filterDuplicates) {
tempContacts = tempContacts.distinctBy { tempContacts = tempContacts.distinctBy {
it.getHashToCompare() it.getHashToCompare()
} as ArrayList<Contact> } as ArrayList<Contact>
tempContacts.groupBy { "${it.getFullName().toLowerCase()}${it.emails}" }.values.forEach { tempContacts.groupBy { "${it.getNameToDisplay().toLowerCase()}${it.emails}" }.values.forEach {
if (it.size == 1) { if (it.size == 1) {
resultContacts.add(it.first()) resultContacts.add(it.first())
} else { } else {
@ -819,6 +830,9 @@ class ContactsHelper(val activity: Activity) {
accounts.forEach { accounts.forEach {
if (ContentResolver.getIsSyncable(it, ContactsContract.AUTHORITY) == 1) { if (ContentResolver.getIsSyncable(it, ContactsContract.AUTHORITY) == 1) {
val contactSource = ContactSource(it.name, it.type) val contactSource = ContactSource(it.name, it.type)
if (it.type == TELEGRAM_PACKAGE) {
contactSource.name += " (${activity.getString(R.string.telegram)})"
}
sources.add(contactSource) sources.add(contactSource)
} }
} }
@ -1207,6 +1221,7 @@ class ContactsHelper(val activity: Activity) {
ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).apply { ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).apply {
withValue(ContactsContract.RawContacts.ACCOUNT_NAME, contact.source) withValue(ContactsContract.RawContacts.ACCOUNT_NAME, contact.source)
withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, getContactSourceType(contact.source)) withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, getContactSourceType(contact.source))
withValue(ContactsContract.RawContacts.DIRTY, false)
operations.add(build()) operations.add(build())
} }
@ -1298,7 +1313,7 @@ class ContactsHelper(val activity: Activity) {
} }
// organization // organization
if (!contact.organization.isEmpty()) { if (contact.organization.isNotEmpty()) {
ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply {
withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Organization.CONTENT_ITEM_TYPE) withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
@ -1533,6 +1548,7 @@ class ContactsHelper(val activity: Activity) {
val todayDate = SimpleDateFormat("dd MMM 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 yesterdayDate = SimpleDateFormat("dd MMM yyyy", Locale.getDefault()).format(Date(System.currentTimeMillis() - DAY_SECONDS * 1000))
val yesterday = activity.getString(R.string.yesterday) val yesterday = activity.getString(R.string.yesterday)
val timeFormat = if (activity.config.use24HourFormat) "HH:mm" else "h:mm a"
var prevNumber = "" var prevNumber = ""
var cursor: Cursor? = null var cursor: Cursor? = null
@ -1548,7 +1564,7 @@ class ContactsHelper(val activity: Activity) {
continue continue
} }
var formattedDate = SimpleDateFormat("dd MMM yyyy, HH:mm", Locale.getDefault()).format(Date(date)) var formattedDate = SimpleDateFormat("dd MMM yyyy, $timeFormat", Locale.getDefault()).format(Date(date))
val datePart = formattedDate.substring(0, 11) val datePart = formattedDate.substring(0, 11)
when { when {
datePart == todayDate -> formattedDate = formattedDate.substring(12) datePart == todayDate -> formattedDate = formattedDate.substring(12)

View File

@ -122,7 +122,7 @@ class VcfExporter {
card.addNote(contact.notes) card.addNote(contact.notes)
} }
if (!contact.organization.isEmpty()) { if (contact.organization.isNotEmpty()) {
val organization = Organization() val organization = Organization()
organization.values.add(contact.organization.company) organization.values.add(contact.organization.company)
card.organization = organization card.organization = organization

View File

@ -139,7 +139,7 @@ class VcfImporter(val activity: SimpleActivity) {
targetContactSource, starred, contactId, thumbnailUri, photo, notes, groups, organization, websites, cleanPhoneNumbers, IMs) targetContactSource, starred, contactId, thumbnailUri, photo, notes, groups, organization, websites, cleanPhoneNumbers, IMs)
// if there is no N and ORG fields at the given contact, only FN, treat it as an organization // if there is no N and ORG fields at the given contact, only FN, treat it as an organization
if (contact.getFullName().isEmpty() && contact.organization.isEmpty() && ezContact.formattedName.value.isNotEmpty()) { if (contact.getNameToDisplay().isEmpty() && contact.organization.isEmpty() && ezContact.formattedName.value.isNotEmpty()) {
contact.organization.company = ezContact.formattedName.value contact.organization.company = ezContact.formattedName.value
} }

View File

@ -37,12 +37,22 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
} }
} }
if (firstString.isEmpty() && firstName.isEmpty() && middleName.isEmpty() && surname.isEmpty() && organization.company.isNotEmpty()) { if (firstString.isEmpty() && firstName.isEmpty() && middleName.isEmpty() && surname.isEmpty()) {
firstString = organization.company.normalizeString() val fullCompany = getFullCompany()
if (fullCompany.isNotEmpty()) {
firstString = fullCompany.normalizeString()
} else if (emails.isNotEmpty()) {
firstString = emails.first().value
}
} }
if (secondString.isEmpty() && other.firstName.isEmpty() && other.middleName.isEmpty() && other.surname.isEmpty() && other.organization.company.isNotEmpty()) { if (secondString.isEmpty() && other.firstName.isEmpty() && other.middleName.isEmpty() && other.surname.isEmpty()) {
secondString = other.organization.company.normalizeString() val otherFullCompany = other.getFullCompany()
if (otherFullCompany.isNotEmpty()) {
secondString = otherFullCompany.normalizeString()
} else if (other.emails.isNotEmpty()) {
secondString = other.emails.first().value
}
} }
var result = if (firstString.firstOrNull()?.isLetter() == true && secondString.firstOrNull()?.isLetter() == false) { var result = if (firstString.firstOrNull()?.isLetter() == true && secondString.firstOrNull()?.isLetter() == false) {
@ -56,7 +66,7 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
-1 -1
} else { } else {
if (firstString.toLowerCase() == secondString.toLowerCase()) { if (firstString.toLowerCase() == secondString.toLowerCase()) {
getFullName().compareTo(other.getFullName(), true) getNameToDisplay().compareTo(other.getNameToDisplay(), true)
} else { } else {
firstString.compareTo(secondString, true) firstString.compareTo(secondString, true)
} }
@ -76,7 +86,7 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
else -> surname else -> surname
} }
fun getFullName(): String { fun getNameToDisplay(): String {
var firstPart = if (startWithSurname) surname else firstName var firstPart = if (startWithSurname) surname else firstName
if (middleName.isNotEmpty()) { if (middleName.isNotEmpty()) {
firstPart += " $middleName" firstPart += " $middleName"
@ -86,9 +96,11 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
val suffixComma = if (suffix.isEmpty()) "" else ", $suffix" val suffixComma = if (suffix.isEmpty()) "" else ", $suffix"
val fullName = "$prefix $firstPart $lastPart$suffixComma".trim() val fullName = "$prefix $firstPart $lastPart$suffixComma".trim()
return if (fullName.isEmpty()) { return if (fullName.isEmpty()) {
var fullOrganization = if (organization.jobPosition.isEmpty()) "" else "${organization.jobPosition}, " if (organization.isNotEmpty()) {
fullOrganization += organization.company getFullCompany()
fullOrganization.trim().trimEnd(',') } else {
emails.firstOrNull()?.value?.trim() ?: ""
}
} else { } else {
fullName fullName
} }
@ -98,7 +110,7 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
val newEmails = ArrayList<Email>() val newEmails = ArrayList<Email>()
emails.mapTo(newEmails) { Email(it.value, 0, "") } emails.mapTo(newEmails) { Email(it.value, 0, "") }
return copy(id = 0, prefix = "", firstName = getFullName().toLowerCase(), middleName = "", surname = "", suffix = "", nickname = "", photoUri = "", return copy(id = 0, prefix = "", firstName = getNameToDisplay().toLowerCase(), middleName = "", surname = "", suffix = "", nickname = "", photoUri = "",
phoneNumbers = ArrayList(), events = ArrayList(), addresses = ArrayList(), emails = newEmails, source = "", starred = 0, phoneNumbers = ArrayList(), events = ArrayList(), addresses = ArrayList(), emails = newEmails, source = "", starred = 0,
contactId = 0, thumbnailUri = "", notes = "", groups = ArrayList(), websites = ArrayList(), organization = Organization("", ""), contactId = 0, thumbnailUri = "", notes = "", groups = ArrayList(), websites = ArrayList(), organization = Organization("", ""),
IMs = ArrayList()).toString() IMs = ArrayList()).toString()
@ -106,6 +118,14 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
fun getHashToCompare() = getStringToCompare().hashCode() fun getHashToCompare() = getStringToCompare().hashCode()
fun getFullCompany(): String {
var fullOrganization = if (organization.company.isEmpty()) "" else "${organization.company}, "
fullOrganization += organization.jobPosition
return fullOrganization.trim().trimEnd(',')
}
fun isABusinessContact() = prefix.isEmpty() && firstName.isEmpty() && middleName.isEmpty() && surname.isEmpty() && suffix.isEmpty() && organization.isNotEmpty()
// do a more advanced phone number check here, compare numbers and and search query with dashes, spaces and everything but numbers removed // do a more advanced phone number check here, compare numbers and and search query with dashes, spaces and everything but numbers removed
fun doesContainPhoneNumber(text: String): Boolean { fun doesContainPhoneNumber(text: String): Boolean {
if (text.isNotEmpty()) { if (text.isNotEmpty()) {

View File

@ -2,4 +2,6 @@ package com.simplemobiletools.contacts.models
data class Organization(var company: String, var jobPosition: String) { data class Organization(var company: String, var jobPosition: String) {
fun isEmpty() = company.isEmpty() && jobPosition.isEmpty() fun isEmpty() = company.isEmpty() && jobPosition.isEmpty()
fun isNotEmpty() = !isEmpty()
} }

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/dialpad_holder" android:id="@+id/dialpad_holder"
@ -56,10 +56,10 @@
<ImageView <ImageView
android:id="@+id/dialpad_clear_char" android:id="@+id/dialpad_clear_char"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginRight="@dimen/activity_margin" android:layout_marginRight="@dimen/activity_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin" android:paddingRight="@dimen/activity_margin"
android:src="@drawable/ic_clear_char" android:src="@drawable/ic_clear_char"
@ -186,9 +186,9 @@
<RelativeLayout <RelativeLayout
android:id="@+id/dialpad_0_holder" android:id="@+id/dialpad_0_holder"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless"
app:layout_constraintBottom_toTopOf="@+id/dialpad_call_button" app:layout_constraintBottom_toTopOf="@+id/dialpad_call_button"
app:layout_constraintEnd_toStartOf="@+id/dialpad_hashtag" app:layout_constraintEnd_toStartOf="@+id/dialpad_hashtag"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
@ -243,4 +243,4 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"/> app:layout_constraintStart_toStartOf="parent"/>
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -10,10 +10,10 @@
android:id="@+id/contact_holder" android:id="@+id/contact_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingBottom="@dimen/medium_margin"
android:paddingLeft="@dimen/normal_margin" android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin" android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"> android:paddingBottom="@dimen/medium_margin">
<ImageView <ImageView
android:id="@+id/contact_photo" android:id="@+id/contact_photo"
@ -23,14 +23,14 @@
<ImageView <ImageView
android:id="@+id/contact_toggle_favorite" android:id="@+id/contact_toggle_favorite"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="@dimen/contact_actions_size" android:layout_width="@dimen/contact_actions_size"
android:layout_height="@dimen/contact_actions_size" android:layout_height="@dimen/contact_actions_size"
android:layout_alignBottom="@id/contact_photo"
android:layout_alignTop="@+id/contact_photo" android:layout_alignTop="@+id/contact_photo"
android:layout_alignBottom="@id/contact_photo"
android:layout_marginLeft="@dimen/medium_margin" android:layout_marginLeft="@dimen/medium_margin"
android:layout_toRightOf="@+id/contact_photo" android:layout_toRightOf="@+id/contact_photo"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/tiny_margin" android:padding="@dimen/tiny_margin"
android:src="@drawable/ic_star_off_big"/> android:src="@drawable/ic_star_off_big"/>
@ -38,16 +38,16 @@
android:id="@+id/contact_actions_holder" android:id="@+id/contact_actions_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignBottom="@id/contact_photo"
android:layout_alignTop="@+id/contact_photo" android:layout_alignTop="@+id/contact_photo"
android:layout_alignBottom="@id/contact_photo"
android:gravity="center_vertical|right"> android:gravity="center_vertical|right">
<ImageView <ImageView
android:id="@+id/contact_send_email" android:id="@+id/contact_send_email"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="@dimen/contact_actions_size" android:layout_width="@dimen/contact_actions_size"
android:layout_height="@dimen/contact_actions_size" android:layout_height="@dimen/contact_actions_size"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:background="?attr/selectableItemBackgroundBorderless"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin" android:paddingRight="@dimen/activity_margin"
android:scaleType="center" android:scaleType="center"
@ -55,11 +55,11 @@
<ImageView <ImageView
android:id="@+id/contact_start_call" android:id="@+id/contact_start_call"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="@dimen/contact_actions_size" android:layout_width="@dimen/contact_actions_size"
android:layout_height="@dimen/contact_actions_size" android:layout_height="@dimen/contact_actions_size"
android:layout_marginLeft="@dimen/normal_margin" android:layout_marginLeft="@dimen/normal_margin"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:background="?attr/selectableItemBackgroundBorderless"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin" android:paddingRight="@dimen/activity_margin"
android:scaleType="center" android:scaleType="center"
@ -67,11 +67,11 @@
<ImageView <ImageView
android:id="@+id/contact_send_sms" android:id="@+id/contact_send_sms"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="@dimen/contact_actions_size" android:layout_width="@dimen/contact_actions_size"
android:layout_height="@dimen/contact_actions_size" android:layout_height="@dimen/contact_actions_size"
android:layout_marginLeft="@dimen/normal_margin" android:layout_marginLeft="@dimen/normal_margin"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:background="?attr/selectableItemBackgroundBorderless"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin" android:paddingRight="@dimen/activity_margin"
android:scaleType="center" android:scaleType="center"
@ -84,10 +84,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_below="@+id/contact_photo" android:layout_below="@+id/contact_photo"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_person"/> android:src="@drawable/ic_person"/>
<com.simplemobiletools.commons.views.MyEditText <com.simplemobiletools.commons.views.MyEditText
@ -191,10 +191,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_numbers_holder" android:layout_alignTop="@+id/contact_numbers_holder"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_phone"/> android:src="@drawable/ic_phone"/>
<LinearLayout <LinearLayout
@ -218,10 +218,10 @@
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_marginBottom="@dimen/medium_margin" android:layout_marginBottom="@dimen/medium_margin"
android:background="@drawable/button_background" android:background="@drawable/button_background"
android:paddingBottom="@dimen/medium_margin"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingTop="@dimen/medium_margin" android:paddingTop="@dimen/medium_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingBottom="@dimen/medium_margin"
android:src="@drawable/ic_plus"/> android:src="@drawable/ic_plus"/>
<ImageView <ImageView
@ -229,10 +229,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_emails_holder" android:layout_alignTop="@+id/contact_emails_holder"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_email"/> android:src="@drawable/ic_email"/>
<LinearLayout <LinearLayout
@ -255,10 +255,10 @@
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/small_margin" android:layout_marginTop="@dimen/small_margin"
android:background="@drawable/button_background" android:background="@drawable/button_background"
android:paddingBottom="@dimen/medium_margin"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingTop="@dimen/medium_margin" android:paddingTop="@dimen/medium_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingBottom="@dimen/medium_margin"
android:src="@drawable/ic_plus"/> android:src="@drawable/ic_plus"/>
<ImageView <ImageView
@ -266,10 +266,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_addresses_holder" android:layout_alignTop="@+id/contact_addresses_holder"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_place"/> android:src="@drawable/ic_place"/>
<LinearLayout <LinearLayout
@ -293,10 +293,10 @@
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/small_margin" android:layout_marginTop="@dimen/small_margin"
android:background="@drawable/button_background" android:background="@drawable/button_background"
android:paddingBottom="@dimen/medium_margin"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingTop="@dimen/medium_margin" android:paddingTop="@dimen/medium_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingBottom="@dimen/medium_margin"
android:src="@drawable/ic_plus"/> android:src="@drawable/ic_plus"/>
<ImageView <ImageView
@ -304,10 +304,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_ims_holder" android:layout_alignTop="@+id/contact_ims_holder"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_im"/> android:src="@drawable/ic_im"/>
<LinearLayout <LinearLayout
@ -331,10 +331,10 @@
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/small_margin" android:layout_marginTop="@dimen/small_margin"
android:background="@drawable/button_background" android:background="@drawable/button_background"
android:paddingBottom="@dimen/medium_margin"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingTop="@dimen/medium_margin" android:paddingTop="@dimen/medium_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingBottom="@dimen/medium_margin"
android:src="@drawable/ic_plus"/> android:src="@drawable/ic_plus"/>
<ImageView <ImageView
@ -342,10 +342,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_events_holder" android:layout_alignTop="@+id/contact_events_holder"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_cake"/> android:src="@drawable/ic_cake"/>
<LinearLayout <LinearLayout
@ -369,10 +369,10 @@
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/small_margin" android:layout_marginTop="@dimen/small_margin"
android:background="@drawable/button_background" android:background="@drawable/button_background"
android:paddingBottom="@dimen/medium_margin"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingTop="@dimen/medium_margin" android:paddingTop="@dimen/medium_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingBottom="@dimen/medium_margin"
android:src="@drawable/ic_plus"/> android:src="@drawable/ic_plus"/>
<ImageView <ImageView
@ -380,10 +380,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_notes" android:layout_alignTop="@+id/contact_notes"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_label"/> android:src="@drawable/ic_label"/>
<com.simplemobiletools.commons.views.MyEditText <com.simplemobiletools.commons.views.MyEditText
@ -404,10 +404,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_organization_company" android:layout_alignTop="@+id/contact_organization_company"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_business"/> android:src="@drawable/ic_business"/>
<com.simplemobiletools.commons.views.MyEditText <com.simplemobiletools.commons.views.MyEditText
@ -445,10 +445,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_websites_holder" android:layout_alignTop="@+id/contact_websites_holder"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_link"/> android:src="@drawable/ic_link"/>
<LinearLayout <LinearLayout
@ -472,10 +472,10 @@
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/small_margin" android:layout_marginTop="@dimen/small_margin"
android:background="@drawable/button_background" android:background="@drawable/button_background"
android:paddingBottom="@dimen/medium_margin"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingTop="@dimen/medium_margin" android:paddingTop="@dimen/medium_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingBottom="@dimen/medium_margin"
android:src="@drawable/ic_plus"/> android:src="@drawable/ic_plus"/>
<ImageView <ImageView
@ -483,10 +483,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_groups_holder" android:layout_alignTop="@+id/contact_groups_holder"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_group"/> android:src="@drawable/ic_group"/>
<LinearLayout <LinearLayout
@ -510,10 +510,10 @@
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/small_margin" android:layout_marginTop="@dimen/small_margin"
android:background="@drawable/button_background" android:background="@drawable/button_background"
android:paddingBottom="@dimen/medium_margin"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingTop="@dimen/medium_margin" android:paddingTop="@dimen/medium_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingBottom="@dimen/medium_margin"
android:src="@drawable/ic_plus"/> android:src="@drawable/ic_plus"/>
<ImageView <ImageView
@ -521,10 +521,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_source" android:layout_alignTop="@+id/contact_source"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_account_box"/> android:src="@drawable/ic_account_box"/>
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
@ -538,9 +538,9 @@
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:lines="1" android:lines="1"
android:maxLines="1" android:maxLines="1"
android:paddingBottom="@dimen/normal_margin"
android:paddingLeft="@dimen/small_margin" android:paddingLeft="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin" android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true" android:singleLine="true"
android:textSize="@dimen/bigger_text_size" android:textSize="@dimen/bigger_text_size"
tools:text="hello@simplemobiletools.com"/> tools:text="hello@simplemobiletools.com"/>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout <androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/group_contacts_coordinator" android:id="@+id/group_contacts_coordinator"
@ -26,13 +26,13 @@
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/group_contacts_placeholder_2" android:id="@+id/group_contacts_placeholder_2"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@+id/group_contacts_placeholder" android:layout_below="@+id/group_contacts_placeholder"
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:background="?attr/selectableItemBackground"
android:gravity="center" android:gravity="center"
android:paddingBottom="@dimen/medium_margin" android:padding="@dimen/activity_margin"
android:paddingTop="@dimen/medium_margin"
android:text="@string/add_contacts" android:text="@string/add_contacts"
android:textSize="@dimen/bigger_text_size" android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/> android:visibility="gone"/>
@ -51,8 +51,8 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:paddingLeft="@dimen/normal_margin" android:paddingStart="@dimen/normal_margin"
android:paddingStart="@dimen/normal_margin"> android:paddingLeft="@dimen/normal_margin">
<include layout="@layout/fastscroller_handle_vertical"/> <include layout="@layout/fastscroller_handle_vertical"/>
@ -67,4 +67,4 @@
android:layout_margin="@dimen/activity_margin" android:layout_margin="@dimen/activity_margin"
android:src="@drawable/ic_plus"/> android:src="@drawable/ic_plus"/>
</android.support.design.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -6,7 +6,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<android.support.design.widget.TabLayout <com.google.android.material.tabs.TabLayout
android:id="@+id/main_tabs_holder" android:id="@+id/main_tabs_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" android:layout_height="48dp"
@ -16,7 +16,7 @@
app:tabMinWidth="150dp" app:tabMinWidth="150dp"
app:tabSelectedTextColor="@android:color/white"/> app:tabSelectedTextColor="@android:color/white"/>
<com.booking.rtlviewpager.RtlViewPager <com.simplemobiletools.commons.views.MyViewPager
android:id="@+id/viewpager" android:id="@+id/viewpager"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"

View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/select_contact_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/select_contact_placeholder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/activity_margin"
android:gravity="center"
android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:text="@string/no_contacts_found"
android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/select_contact_placeholder_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/select_contact_placeholder"
android:layout_centerHorizontal="true"
android:background="?attr/selectableItemBackground"
android:gravity="center"
android:padding="@dimen/activity_margin"
android:text="@string/change_filter"
android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/>
<com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/select_contact_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/select_contact_fastscroller"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignTop="@+id/select_contact_list"
android:layout_alignBottom="@+id/select_contact_list"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:paddingStart="@dimen/normal_margin"
android:paddingLeft="@dimen/normal_margin">
<include layout="@layout/fastscroller_handle_vertical"/>
</com.simplemobiletools.commons.views.FastScroller>
</RelativeLayout>

View File

@ -18,18 +18,18 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin" android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin" android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"> android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_purchase_thank_you" android:id="@+id/settings_purchase_thank_you"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/purchase_simple_thank_you"/> android:text="@string/purchase_simple_thank_you"/>
</RelativeLayout> </RelativeLayout>
@ -40,18 +40,18 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin" android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin" android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"> android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_customize_colors" android:id="@+id/settings_customize_colors"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/customize_colors"/> android:text="@string/customize_colors"/>
</RelativeLayout> </RelativeLayout>
@ -62,18 +62,18 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin" android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin" android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"> android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_manage_contact_fields" android:id="@+id/settings_manage_contact_fields"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/manage_shown_contact_fields"/> android:text="@string/manage_shown_contact_fields"/>
</RelativeLayout> </RelativeLayout>
@ -84,18 +84,18 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin" android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin" android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"> android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_manage_tabs" android:id="@+id/settings_manage_tabs"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/manage_shown_tabs"/> android:text="@string/manage_shown_tabs"/>
</RelativeLayout> </RelativeLayout>
@ -106,10 +106,10 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin" android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin" android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"> android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat <com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_use_english" android:id="@+id/settings_use_english"
@ -117,8 +117,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@null" android:background="@null"
android:clickable="false" android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/use_english_language" android:text="@string/use_english_language"
app:switchPadding="@dimen/medium_margin"/> app:switchPadding="@dimen/medium_margin"/>
@ -130,10 +130,10 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin" android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin" android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"> android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat <com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_avoid_whats_new" android:id="@+id/settings_avoid_whats_new"
@ -141,8 +141,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@null" android:background="@null"
android:clickable="false" android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/avoid_whats_new" android:text="@string/avoid_whats_new"
app:switchPadding="@dimen/medium_margin"/> app:switchPadding="@dimen/medium_margin"/>
@ -154,10 +154,10 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin" android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin" android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"> android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat <com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_show_info_bubble" android:id="@+id/settings_show_info_bubble"
@ -165,8 +165,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@null" android:background="@null"
android:clickable="false" android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_info_bubble" android:text="@string/show_info_bubble"
app:switchPadding="@dimen/medium_margin"/> app:switchPadding="@dimen/medium_margin"/>
@ -178,10 +178,10 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin" android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin" android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"> android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat <com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_show_contact_thumbnails" android:id="@+id/settings_show_contact_thumbnails"
@ -189,8 +189,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@null" android:background="@null"
android:clickable="false" android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_contact_thumbnails" android:text="@string/show_contact_thumbnails"
app:switchPadding="@dimen/medium_margin"/> app:switchPadding="@dimen/medium_margin"/>
@ -202,10 +202,10 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin" android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin" android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"> android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat <com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_show_phone_numbers" android:id="@+id/settings_show_phone_numbers"
@ -213,23 +213,47 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@null" android:background="@null"
android:clickable="false" android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_phone_numbers" android:text="@string/show_phone_numbers"
app:switchPadding="@dimen/medium_margin"/> app:switchPadding="@dimen/medium_margin"/>
</RelativeLayout> </RelativeLayout>
<RelativeLayout
android:id="@+id/settings_show_only_contacts_with_numbers_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_show_only_contacts_with_numbers"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_only_contacts_with_numbers"
app:switchPadding="@dimen/medium_margin"/>
</RelativeLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/settings_start_with_surname_holder" android:id="@+id/settings_start_with_surname_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin" android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin" android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"> android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat <com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_start_with_surname" android:id="@+id/settings_start_with_surname"
@ -237,23 +261,47 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@null" android:background="@null"
android:clickable="false" android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/start_name_with_surname" android:text="@string/start_name_with_surname"
app:switchPadding="@dimen/medium_margin"/> app:switchPadding="@dimen/medium_margin"/>
</RelativeLayout> </RelativeLayout>
<RelativeLayout
android:id="@+id/settings_use_24_hour_time_format_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_use_24_hour_time_format"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/use_24_hour_time_format"
app:switchPadding="@dimen/medium_margin"/>
</RelativeLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/settings_filter_duplicates_holder" android:id="@+id/settings_filter_duplicates_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin" android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin" android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"> android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat <com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_filter_duplicates" android:id="@+id/settings_filter_duplicates"
@ -261,8 +309,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@null" android:background="@null"
android:clickable="false" android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/filter_duplicates" android:text="@string/filter_duplicates"
app:switchPadding="@dimen/medium_margin"/> app:switchPadding="@dimen/medium_margin"/>
@ -274,10 +322,10 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin" android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin" android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"> android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat <com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_show_call_confirmation" android:id="@+id/settings_show_call_confirmation"
@ -285,8 +333,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@null" android:background="@null"
android:clickable="false" android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin" android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_call_confirmation_dialog" android:text="@string/show_call_confirmation_dialog"
app:switchPadding="@dimen/medium_margin"/> app:switchPadding="@dimen/medium_margin"/>
@ -298,18 +346,18 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/bigger_margin"
android:paddingLeft="@dimen/normal_margin" android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin"
android:paddingRight="@dimen/normal_margin" android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin"> android:paddingBottom="@dimen/bigger_margin">
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_on_contact_click_label" android:id="@+id/settings_on_contact_click_label"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/settings_on_contact_click"
android:layout_toStartOf="@+id/settings_on_contact_click" android:layout_toStartOf="@+id/settings_on_contact_click"
android:layout_toLeftOf="@+id/settings_on_contact_click"
android:paddingLeft="@dimen/medium_margin" android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin" android:paddingRight="@dimen/medium_margin"
android:text="@string/on_contact_click"/> android:text="@string/on_contact_click"/>

View File

@ -10,10 +10,10 @@
android:id="@+id/contact_holder" android:id="@+id/contact_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingBottom="@dimen/medium_margin"
android:paddingLeft="@dimen/normal_margin" android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin" android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"> android:paddingBottom="@dimen/medium_margin">
<ImageView <ImageView
android:id="@+id/contact_photo" android:id="@+id/contact_photo"
@ -23,14 +23,14 @@
<ImageView <ImageView
android:id="@+id/contact_toggle_favorite" android:id="@+id/contact_toggle_favorite"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="@dimen/contact_actions_size" android:layout_width="@dimen/contact_actions_size"
android:layout_height="@dimen/contact_actions_size" android:layout_height="@dimen/contact_actions_size"
android:layout_alignBottom="@id/contact_photo"
android:layout_alignTop="@+id/contact_photo" android:layout_alignTop="@+id/contact_photo"
android:layout_alignBottom="@id/contact_photo"
android:layout_marginLeft="@dimen/medium_margin" android:layout_marginLeft="@dimen/medium_margin"
android:layout_toRightOf="@+id/contact_photo" android:layout_toRightOf="@+id/contact_photo"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/tiny_margin" android:padding="@dimen/tiny_margin"
android:src="@drawable/ic_star_off_big" android:src="@drawable/ic_star_off_big"
android:visibility="gone"/> android:visibility="gone"/>
@ -39,16 +39,16 @@
android:id="@+id/contact_actions_holder" android:id="@+id/contact_actions_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignBottom="@id/contact_photo"
android:layout_alignTop="@+id/contact_photo" android:layout_alignTop="@+id/contact_photo"
android:layout_alignBottom="@id/contact_photo"
android:gravity="center_vertical|right"> android:gravity="center_vertical|right">
<ImageView <ImageView
android:id="@+id/contact_send_email" android:id="@+id/contact_send_email"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="@dimen/contact_actions_size" android:layout_width="@dimen/contact_actions_size"
android:layout_height="@dimen/contact_actions_size" android:layout_height="@dimen/contact_actions_size"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:background="?attr/selectableItemBackgroundBorderless"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin" android:paddingRight="@dimen/activity_margin"
android:scaleType="center" android:scaleType="center"
@ -56,11 +56,11 @@
<ImageView <ImageView
android:id="@+id/contact_start_call" android:id="@+id/contact_start_call"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="@dimen/contact_actions_size" android:layout_width="@dimen/contact_actions_size"
android:layout_height="@dimen/contact_actions_size" android:layout_height="@dimen/contact_actions_size"
android:layout_marginLeft="@dimen/normal_margin" android:layout_marginLeft="@dimen/normal_margin"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:background="?attr/selectableItemBackgroundBorderless"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin" android:paddingRight="@dimen/activity_margin"
android:scaleType="center" android:scaleType="center"
@ -68,11 +68,11 @@
<ImageView <ImageView
android:id="@+id/contact_send_sms" android:id="@+id/contact_send_sms"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="@dimen/contact_actions_size" android:layout_width="@dimen/contact_actions_size"
android:layout_height="@dimen/contact_actions_size" android:layout_height="@dimen/contact_actions_size"
android:layout_marginLeft="@dimen/normal_margin" android:layout_marginLeft="@dimen/normal_margin"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:background="?attr/selectableItemBackgroundBorderless"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin" android:paddingRight="@dimen/activity_margin"
android:scaleType="center" android:scaleType="center"
@ -85,10 +85,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_below="@+id/contact_photo" android:layout_below="@+id/contact_photo"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_person"/> android:src="@drawable/ic_person"/>
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
@ -100,9 +100,9 @@
android:layout_toRightOf="@+id/contact_name_image" android:layout_toRightOf="@+id/contact_name_image"
android:lines="1" android:lines="1"
android:maxLines="1" android:maxLines="1"
android:paddingBottom="@dimen/normal_margin"
android:paddingLeft="@dimen/small_margin" android:paddingLeft="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin" android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true" android:singleLine="true"
android:textSize="@dimen/bigger_text_size"/> android:textSize="@dimen/bigger_text_size"/>
@ -115,9 +115,9 @@
android:layout_toRightOf="@+id/contact_name_image" android:layout_toRightOf="@+id/contact_name_image"
android:lines="1" android:lines="1"
android:maxLines="1" android:maxLines="1"
android:paddingBottom="@dimen/normal_margin"
android:paddingLeft="@dimen/small_margin" android:paddingLeft="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin" android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true" android:singleLine="true"
android:textSize="@dimen/bigger_text_size"/> android:textSize="@dimen/bigger_text_size"/>
@ -130,9 +130,9 @@
android:layout_toRightOf="@+id/contact_name_image" android:layout_toRightOf="@+id/contact_name_image"
android:lines="1" android:lines="1"
android:maxLines="1" android:maxLines="1"
android:paddingBottom="@dimen/normal_margin"
android:paddingLeft="@dimen/small_margin" android:paddingLeft="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin" android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true" android:singleLine="true"
android:textSize="@dimen/bigger_text_size"/> android:textSize="@dimen/bigger_text_size"/>
@ -145,9 +145,9 @@
android:layout_toRightOf="@+id/contact_name_image" android:layout_toRightOf="@+id/contact_name_image"
android:lines="1" android:lines="1"
android:maxLines="1" android:maxLines="1"
android:paddingBottom="@dimen/normal_margin"
android:paddingLeft="@dimen/small_margin" android:paddingLeft="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin" android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true" android:singleLine="true"
android:textSize="@dimen/bigger_text_size"/> android:textSize="@dimen/bigger_text_size"/>
@ -160,9 +160,9 @@
android:layout_toRightOf="@+id/contact_name_image" android:layout_toRightOf="@+id/contact_name_image"
android:lines="1" android:lines="1"
android:maxLines="1" android:maxLines="1"
android:paddingBottom="@dimen/normal_margin"
android:paddingLeft="@dimen/small_margin" android:paddingLeft="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin" android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true" android:singleLine="true"
android:textSize="@dimen/bigger_text_size"/> android:textSize="@dimen/bigger_text_size"/>
@ -175,9 +175,9 @@
android:layout_toRightOf="@+id/contact_name_image" android:layout_toRightOf="@+id/contact_name_image"
android:lines="1" android:lines="1"
android:maxLines="1" android:maxLines="1"
android:paddingBottom="@dimen/normal_margin"
android:paddingLeft="@dimen/small_margin" android:paddingLeft="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin" android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true" android:singleLine="true"
android:textSize="@dimen/bigger_text_size"/> android:textSize="@dimen/bigger_text_size"/>
@ -186,10 +186,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_numbers_holder" android:layout_alignTop="@+id/contact_numbers_holder"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_phone"/> android:src="@drawable/ic_phone"/>
<LinearLayout <LinearLayout
@ -206,10 +206,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_emails_holder" android:layout_alignTop="@+id/contact_emails_holder"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_email"/> android:src="@drawable/ic_email"/>
<LinearLayout <LinearLayout
@ -226,10 +226,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_addresses_holder" android:layout_alignTop="@+id/contact_addresses_holder"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_place"/> android:src="@drawable/ic_place"/>
<LinearLayout <LinearLayout
@ -246,10 +246,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_ims_holder" android:layout_alignTop="@+id/contact_ims_holder"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_im"/> android:src="@drawable/ic_im"/>
<LinearLayout <LinearLayout
@ -266,10 +266,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_events_holder" android:layout_alignTop="@+id/contact_events_holder"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_cake"/> android:src="@drawable/ic_cake"/>
<LinearLayout <LinearLayout
@ -285,10 +285,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_notes" android:layout_alignTop="@+id/contact_notes"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_label"/> android:src="@drawable/ic_label"/>
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
@ -299,9 +299,9 @@
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_toRightOf="@+id/contact_notes_image" android:layout_toRightOf="@+id/contact_notes_image"
android:lineSpacingExtra="@dimen/medium_margin" android:lineSpacingExtra="@dimen/medium_margin"
android:paddingBottom="@dimen/normal_margin"
android:paddingLeft="@dimen/small_margin" android:paddingLeft="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin" android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:textSize="@dimen/bigger_text_size"/> android:textSize="@dimen/bigger_text_size"/>
<ImageView <ImageView
@ -309,10 +309,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_organization_company" android:layout_alignTop="@+id/contact_organization_company"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_business"/> android:src="@drawable/ic_business"/>
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
@ -323,9 +323,9 @@
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_toRightOf="@+id/contact_organization_image" android:layout_toRightOf="@+id/contact_organization_image"
android:lineSpacingExtra="@dimen/medium_margin" android:lineSpacingExtra="@dimen/medium_margin"
android:paddingBottom="@dimen/normal_margin"
android:paddingLeft="@dimen/small_margin" android:paddingLeft="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin" android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:textSize="@dimen/bigger_text_size"/> android:textSize="@dimen/bigger_text_size"/>
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
@ -336,9 +336,9 @@
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_toRightOf="@+id/contact_organization_image" android:layout_toRightOf="@+id/contact_organization_image"
android:lineSpacingExtra="@dimen/medium_margin" android:lineSpacingExtra="@dimen/medium_margin"
android:paddingBottom="@dimen/normal_margin"
android:paddingLeft="@dimen/small_margin" android:paddingLeft="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin" android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:textSize="@dimen/bigger_text_size"/> android:textSize="@dimen/bigger_text_size"/>
<ImageView <ImageView
@ -346,10 +346,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_websites_holder" android:layout_alignTop="@+id/contact_websites_holder"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_link"/> android:src="@drawable/ic_link"/>
<LinearLayout <LinearLayout
@ -365,10 +365,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_groups_holder" android:layout_alignTop="@+id/contact_groups_holder"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_group"/> android:src="@drawable/ic_group"/>
<LinearLayout <LinearLayout
@ -385,10 +385,10 @@
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_source" android:layout_alignTop="@+id/contact_source"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/medium_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_account_box"/> android:src="@drawable/ic_account_box"/>
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
@ -400,9 +400,9 @@
android:layout_toRightOf="@+id/contact_name_image" android:layout_toRightOf="@+id/contact_name_image"
android:lines="1" android:lines="1"
android:maxLines="1" android:maxLines="1"
android:paddingBottom="@dimen/normal_margin"
android:paddingLeft="@dimen/small_margin" android:paddingLeft="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin" android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true" android:singleLine="true"
android:textSize="@dimen/bigger_text_size" android:textSize="@dimen/bigger_text_size"
tools:text="hello@simplemobiletools.com"/> tools:text="hello@simplemobiletools.com"/>

View File

@ -8,10 +8,10 @@
<ImageView <ImageView
android:id="@+id/call_confirm_phone" android:id="@+id/call_confirm_phone"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerInParent="true" android:layout_centerInParent="true"
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/activity_margin" android:padding="@dimen/activity_margin"
android:src="@drawable/ic_phone_big"/> android:src="@drawable/ic_phone_big"/>

View File

@ -12,8 +12,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin" android:paddingTop="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"> android:paddingRight="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/export_contacts_folder_label" android:id="@+id/export_contacts_folder_label"
@ -26,11 +26,11 @@
android:id="@+id/export_contacts_folder" android:id="@+id/export_contacts_folder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/activity_margin"
android:layout_marginLeft="@dimen/activity_margin" android:layout_marginLeft="@dimen/activity_margin"
android:paddingBottom="@dimen/small_margin" android:layout_marginBottom="@dimen/activity_margin"
android:paddingTop="@dimen/small_margin"
android:paddingRight="@dimen/small_margin" android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/small_margin"/> android:paddingBottom="@dimen/small_margin"/>
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/export_contacts_filename_label" android:id="@+id/export_contacts_filename_label"
@ -43,18 +43,18 @@
android:id="@+id/export_contacts_filename" android:id="@+id/export_contacts_filename"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/activity_margin"
android:layout_marginLeft="@dimen/activity_margin" android:layout_marginLeft="@dimen/activity_margin"
android:paddingRight="@dimen/small_margin" android:layout_marginBottom="@dimen/activity_margin"
android:paddingTop="@dimen/normal_margin" android:paddingTop="@dimen/normal_margin"
android:paddingRight="@dimen/small_margin"
android:textSize="@dimen/normal_text_size"/> android:textSize="@dimen/normal_text_size"/>
<ImageView <ImageView
android:id="@+id/export_contacts_divider" android:id="@+id/export_contacts_divider"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1px" android:layout_height="1px"
android:layout_marginBottom="@dimen/medium_margin"
android:layout_marginTop="@dimen/medium_margin" android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin"
android:background="@color/divider_grey" android:background="@color/divider_grey"
android:importantForAccessibility="no"/> android:importantForAccessibility="no"/>
@ -65,7 +65,7 @@
android:text="@string/include_contact_sources" android:text="@string/include_contact_sources"
android:textSize="@dimen/smaller_text_size"/> android:textSize="@dimen/smaller_text_size"/>
<android.support.v7.widget.RecyclerView <com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/export_contacts_list" android:id="@+id/export_contacts_list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView <com.simplemobiletools.commons.views.MyRecyclerView
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/filter_contact_sources_list" android:id="@+id/filter_contact_sources_list"

View File

@ -17,19 +17,19 @@
android:gravity="center" android:gravity="center"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin" android:paddingRight="@dimen/activity_margin"
android:text="@string/no_items_found" android:text="@string/no_contacts_found"
android:textSize="@dimen/bigger_text_size" android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/> android:visibility="gone"/>
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/fragment_placeholder_2" android:id="@+id/fragment_placeholder_2"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@+id/fragment_placeholder" android:layout_below="@+id/fragment_placeholder"
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:background="?attr/selectableItemBackground"
android:gravity="center" android:gravity="center"
android:paddingBottom="@dimen/medium_margin" android:padding="@dimen/activity_margin"
android:paddingTop="@dimen/medium_margin"
android:text="@string/change_filter" android:text="@string/change_filter"
android:textSize="@dimen/bigger_text_size" android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/> android:visibility="gone"/>
@ -48,8 +48,8 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:paddingLeft="@dimen/normal_margin" android:paddingStart="@dimen/normal_margin"
android:paddingStart="@dimen/normal_margin"> android:paddingLeft="@dimen/normal_margin">
<include layout="@layout/fastscroller_handle_vertical"/> <include layout="@layout/fastscroller_handle_vertical"/>

View File

@ -20,6 +20,7 @@
android:id="@+id/contact_tmb" android:id="@+id/contact_tmb"
android:layout_width="@dimen/normal_icon_size" android:layout_width="@dimen/normal_icon_size"
android:layout_height="@dimen/normal_icon_size" android:layout_height="@dimen/normal_icon_size"
android:layout_marginTop="@dimen/tiny_margin"
android:padding="@dimen/medium_margin" android:padding="@dimen/medium_margin"
android:src="@drawable/ic_person"/> android:src="@drawable/ic_person"/>

View File

@ -11,7 +11,7 @@
android:focusable="true" android:focusable="true"
android:foreground="@drawable/selector"> android:foreground="@drawable/selector">
<android.support.constraint.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/recent_call_holder" android:id="@+id/recent_call_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/contact_item_with_number_height" android:layout_height="@dimen/contact_item_with_number_height"
@ -59,5 +59,5 @@
tools:layout_editor_absoluteY="0dp" tools:layout_editor_absoluteY="0dp"
tools:text="Yesterday, 17:00"/> tools:text="Yesterday, 17:00"/>
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout> </FrameLayout>

View File

@ -5,7 +5,7 @@
android:id="@+id/search" android:id="@+id/search"
android:icon="@drawable/ic_search" android:icon="@drawable/ic_search"
android:title="@string/search" android:title="@string/search"
app:actionViewClass="android.support.v7.widget.SearchView" app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="collapseActionView|ifRoom"/> app:showAsAction="collapseActionView|ifRoom"/>
<item <item
android:id="@+id/sort" android:id="@+id/sort"

View File

@ -18,6 +18,11 @@
<string name="create_new_contact">Create new contact</string> <string name="create_new_contact">Create new contact</string>
<string name="add_to_existing_contact">Add to an existing contact</string> <string name="add_to_existing_contact">Add to an existing contact</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="new_contact">Yeni kontakt</string> <string name="new_contact">Yeni kontakt</string>
<string name="edit_contact">Redaktə et</string> <string name="edit_contact">Redaktə et</string>
<string name="select_contact">Kontakt seç</string> <string name="select_contact">Kontakt seç</string>
@ -57,6 +62,7 @@
<string name="favorites">Sevimlilər</string> <string name="favorites">Sevimlilər</string>
<string name="recent_calls">Hazırki zənglə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_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>
<!-- Emails --> <!-- Emails -->
<string name="email">E-poçt</string> <string name="email">E-poçt</string>

View File

@ -9,14 +9,19 @@
<string name="company">Unternehmen</string> <string name="company">Unternehmen</string>
<string name="job_position">Arbeitsstelle</string> <string name="job_position">Arbeitsstelle</string>
<string name="website">Webseite</string> <string name="website">Webseite</string>
<string name="send_sms_to_contacts">Sende SMS an Kontakte</string> <string name="send_sms_to_contacts">SMS an Kontakte senden</string>
<string name="send_email_to_contacts">Sende E-Mail an Kontakte</string> <string name="send_email_to_contacts">E-Mail an Kontakte senden</string>
<string name="send_sms_to_group">Sende SMS an Gruppe</string> <string name="send_sms_to_group">SMS an Gruppe senden</string>
<string name="send_email_to_group">Sende E-Mail an Gruppe</string> <string name="send_email_to_group">E-Mail an Gruppe senden</string>
<string name="call_person">%s anrufen</string> <string name="call_person">%s anrufen</string>
<string name="request_the_required_permissions">Benötigte Berechtigungen anfordern</string> <string name="request_the_required_permissions">Benötigte Berechtigungen anfordern</string>
<string name="create_new_contact">Create new contact</string> <string name="create_new_contact">Neuen Kontakt erstellen</string>
<string name="add_to_existing_contact">Add to an existing contact</string> <string name="add_to_existing_contact">Zu einem existierenden Kontakt hinzufügen</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="new_contact">Neuer Kontakt</string> <string name="new_contact">Neuer Kontakt</string>
<string name="edit_contact">Kontakt bearbeiten</string> <string name="edit_contact">Kontakt bearbeiten</string>
@ -34,7 +39,7 @@
<string name="no_group_participants">Diese Gruppe ist leer</string> <string name="no_group_participants">Diese Gruppe ist leer</string>
<string name="add_contacts">Kontakte hinzufügen</string> <string name="add_contacts">Kontakte hinzufügen</string>
<string name="no_group_created">Es sind keine Kontaktgruppen auf diesem Gerät vorhanden</string> <string name="no_group_created">Es sind keine Kontaktgruppen auf diesem Gerät vorhanden</string>
<string name="create_group">Erstelle Gruppe</string> <string name="create_group">Gruppe erstellen</string>
<string name="add_to_group">Zu Gruppe hinzufügen</string> <string name="add_to_group">Zu Gruppe hinzufügen</string>
<string name="create_group_under_account">Gruppe in diesem Konto erstellen</string> <string name="create_group_under_account">Gruppe in diesem Konto erstellen</string>
@ -45,18 +50,19 @@
<!-- Settings --> <!-- Settings -->
<string name="start_name_with_surname">Namen mit Nachnamen beginnen</string> <string name="start_name_with_surname">Namen mit Nachnamen beginnen</string>
<string name="show_phone_numbers">Zeige Telefonnummern im Hauptmenü</string> <string name="show_phone_numbers">Telefonnummern im Hauptmenü zeigen</string>
<string name="show_contact_thumbnails">Zeige Vorschaubilder der Kontakte</string> <string name="show_contact_thumbnails">Vorschaubilder der Kontakte zeigen</string>
<string name="on_contact_click">Beim Klicken auf den Kontakt</string> <string name="on_contact_click">Beim Klicken auf den Kontakt</string>
<string name="call_contact">Kontakt anrufen</string> <string name="call_contact">Kontakt anrufen</string>
<string name="view_contact">Kontaktdetails anzeigen</string> <string name="view_contact">Kontaktdetails anzeigen</string>
<string name="manage_shown_contact_fields">Bearbeite sichtbare Kontaktfelder</string> <string name="manage_shown_contact_fields">Sichtbare Kontaktfelder bearbeiten</string>
<string name="filter_duplicates">Versuche Kontaktduplikate herauszufiltern</string> <string name="filter_duplicates">Versucht Kontaktduplikate herauszufiltern</string>
<string name="manage_shown_tabs">Anzuzeigende Tabs festlegen</string> <string name="manage_shown_tabs">Anzuzeigende Tabs festlegen</string>
<string name="contacts">Kontakte</string> <string name="contacts">Kontakte</string>
<string name="favorites">Favoriten</string> <string name="favorites">Favoriten</string>
<string name="recent_calls">Anrufliste</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_call_confirmation_dialog">Bestätigungsdialog zeigen, bevor ein Anruf durchgeführt wird</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails --> <!-- Emails -->
<string name="email">E-Mail</string> <string name="email">E-Mail</string>
@ -78,11 +84,11 @@
<string name="anniversary">Jahrestag</string> <string name="anniversary">Jahrestag</string>
<!-- Favorites --> <!-- Favorites -->
<string name="no_favorites">Sieht so aus, als ob du keine Kontakte zu den Favoriten hinzugefügt hast.</string> <string name="no_favorites">Anscheinend haben Sie bisher keine Kontakte zu den Favoriten hinzugefügt.</string>
<string name="add_favorites">Favoriten hinzufügen</string> <string name="add_favorites">Favoriten hinzufügen</string>
<string name="add_to_favorites">Zu Favoriten hinzufügen</string> <string name="add_to_favorites">Zu Favoriten hinzufügen</string>
<string name="remove_from_favorites">Aus Favoriten entfernen</string> <string name="remove_from_favorites">Aus Favoriten entfernen</string>
<string name="must_be_at_edit">Sie müssen sich im Bearbeitungsmodus befinden, um einen Kontakt zu bearbeiten</string> <string name="must_be_at_edit">Sie müssen sich im Bearbeitungsmodus befinden, um einen Kontakt zu bearbeiten.</string>
<!-- Search --> <!-- Search -->
<string name="search_contacts">Kontakte durchsuchen</string> <string name="search_contacts">Kontakte durchsuchen</string>
@ -98,8 +104,8 @@
<string name="filename_without_vcf">Dateiname (ohne .vcf)</string> <string name="filename_without_vcf">Dateiname (ohne .vcf)</string>
<!-- Dialpad --> <!-- Dialpad -->
<string name="dialpad">Dialpad</string> <string name="dialpad">Wählfeld</string>
<string name="add_number_to_contact">Add number to contact</string> <string name="add_number_to_contact">Nummer zu Kontakt hinzufügen</string>
<!-- Visible fields --> <!-- Visible fields -->
<string name="select_fields_to_show">Sichtbare Felder auswählen</string> <string name="select_fields_to_show">Sichtbare Felder auswählen</string>

View File

@ -15,8 +15,13 @@
<string name="send_email_to_group">Αποστολή email σε ομάδες</string> <string name="send_email_to_group">Αποστολή email σε ομάδες</string>
<string name="call_person">Κλήση %s</string> <string name="call_person">Κλήση %s</string>
<string name="request_the_required_permissions">Ζητούνται τα απαιτούμενα δικαιώματα</string> <string name="request_the_required_permissions">Ζητούνται τα απαιτούμενα δικαιώματα</string>
<string name="create_new_contact">Create new contact</string> <string name="create_new_contact">Δημιουργία νέας Επαφής</string>
<string name="add_to_existing_contact">Add to an existing contact</string> <string name="add_to_existing_contact">Προσθήκη σε μια υπάρχουσα Επαφή</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="new_contact">Νέα επαφή</string> <string name="new_contact">Νέα επαφή</string>
<string name="edit_contact">Επεξεργασία επαφής</string> <string name="edit_contact">Επεξεργασία επαφής</string>
@ -57,6 +62,7 @@
<string name="favorites">Αγαπημένες</string> <string name="favorites">Αγαπημένες</string>
<string name="recent_calls">Πρόσφατες Κλήσεις</string> <string name="recent_calls">Πρόσφατες Κλήσεις</string>
<string name="show_call_confirmation_dialog">Εμφάνιση διαλόγου επιβεβαίωσης πριν από την έναρξη μιας κλήσης</string> <string name="show_call_confirmation_dialog">Εμφάνιση διαλόγου επιβεβαίωσης πριν από την έναρξη μιας κλήσης</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails --> <!-- Emails -->
<string name="email">Email</string> <string name="email">Email</string>
@ -98,8 +104,8 @@
<string name="filename_without_vcf">Όνομα αρχείου (χωρίς .vcf)</string> <string name="filename_without_vcf">Όνομα αρχείου (χωρίς .vcf)</string>
<!-- Dialpad --> <!-- Dialpad -->
<string name="dialpad">Dialpad</string> <string name="dialpad">Πληκτρολόγιο</string>
<string name="add_number_to_contact">Add number to contact</string> <string name="add_number_to_contact">Προσθήκη αριθμού σε επαφή</string>
<!-- Visible fields --> <!-- Visible fields -->
<string name="select_fields_to_show">Επιλογή εμφάνισης πεδίων</string> <string name="select_fields_to_show">Επιλογή εμφάνισης πεδίων</string>
@ -114,7 +120,7 @@
<string name="websites">Ιστοσελίδα</string> <string name="websites">Ιστοσελίδα</string>
<string name="groups">Ομάδες</string> <string name="groups">Ομάδες</string>
<string name="contact_source">Προέλευση επαφής</string> <string name="contact_source">Προέλευση επαφής</string>
<string name="instant_messaging">Instant messaging (IM)</string> <string name="instant_messaging">Αμεσο μήνυμα (IM)</string>
<!-- FAQ --> <!-- FAQ -->
<string name="faq_1_title">Θέλω να αλλάξω τα πεδία που θα είναι ορατά στις επαφές. Μπορώ να το κάνω?</string> <string name="faq_1_title">Θέλω να αλλάξω τα πεδία που θα είναι ορατά στις επαφές. Μπορώ να το κάνω?</string>

View File

@ -15,8 +15,13 @@
<string name="send_email_to_group">Envoyer un e-mail au groupe</string> <string name="send_email_to_group">Envoyer un e-mail au groupe</string>
<string name="call_person">Call %s</string> <string name="call_person">Call %s</string>
<string name="request_the_required_permissions">Demander les autorisations requises</string> <string name="request_the_required_permissions">Demander les autorisations requises</string>
<string name="create_new_contact">Create new contact</string> <string name="create_new_contact">Créer un nouveau contact</string>
<string name="add_to_existing_contact">Add to an existing contact</string> <string name="add_to_existing_contact">Ajouter à un contact existant</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="new_contact">Nouveau contact</string> <string name="new_contact">Nouveau contact</string>
<string name="edit_contact">Modifier contact</string> <string name="edit_contact">Modifier contact</string>
@ -57,6 +62,7 @@
<string name="favorites">Favorites</string> <string name="favorites">Favorites</string>
<string name="recent_calls">Appels récents</string> <string name="recent_calls">Appels récents</string>
<string name="show_call_confirmation_dialog">Afficher une boîte de dialogue de confirmation d\'appel avant de lancer un appel</string> <string name="show_call_confirmation_dialog">Afficher une boîte de dialogue de confirmation d\'appel avant de lancer un appel</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails --> <!-- Emails -->
<string name="email">E-mail</string> <string name="email">E-mail</string>
@ -99,7 +105,7 @@
<!-- Dialpad --> <!-- Dialpad -->
<string name="dialpad">Dialpad</string> <string name="dialpad">Dialpad</string>
<string name="add_number_to_contact">Add number to contact</string> <string name="add_number_to_contact">Ajouter un numéro au contact</string>
<!-- Visible fields --> <!-- Visible fields -->
<string name="select_fields_to_show">Sélectionner les champs à afficher</string> <string name="select_fields_to_show">Sélectionner les champs à afficher</string>
@ -124,12 +130,12 @@
<!-- Short description has to have less than 80 chars --> <!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Une appli de contacts pour gérer vos contacts sans pubs.</string> <string name="app_short_description">Une appli de contacts pour gérer vos contacts sans pubs.</string>
<string name="app_long_description"> <string name="app_long_description">
Une appli 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 Google ou d\'autres comptes. Vous pouvez afficher vos contacts favoris dans une liste séparée. Une appli 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 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 e-mail et événements de vos contacts. Elle permet de trier/filter via de multiples paramètres, et même afficher le surnom en premier. Vous pouvez l\'utiliser pour gérer les e-mail et événements de vos contacts. Elle permet de trier/filter via de multiples paramètres, et même afficher le surnom en premier.
Aucune publicité ni de permission inutile. Elle est entièrement open source et vous permet de personnaliser les couleurs. Aucune publicité ni de permission inutile. Elle est entièrement open source et vous permet de personnaliser les couleurs.
Cette application fait parti d\'un groupe d\'applications. Vous pouvez trouver le reste des applis sur https://www.simplemobiletools.com Cette application fait parti d\'un groupe d\'applications. Vous pouvez trouver le reste des applis sur https://www.simplemobiletools.com
</string> </string>

View File

@ -18,6 +18,11 @@
<string name="create_new_contact">Create new contact</string> <string name="create_new_contact">Create new contact</string>
<string name="add_to_existing_contact">Add to an existing contact</string> <string name="add_to_existing_contact">Add to an existing contact</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="new_contact">Novi kontakt</string> <string name="new_contact">Novi kontakt</string>
<string name="edit_contact">Uredi kontakt</string> <string name="edit_contact">Uredi kontakt</string>
<string name="select_contact">Odaberi kontakt</string> <string name="select_contact">Odaberi kontakt</string>
@ -57,6 +62,7 @@
<string name="favorites">Favoriti</string> <string name="favorites">Favoriti</string>
<string name="recent_calls">Nedavni pozivi</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_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>
<!-- Emails --> <!-- Emails -->
<string name="email">E-pošta</string> <string name="email">E-pošta</string>

View File

@ -0,0 +1,146 @@
<resources>
<string name="app_name">Simple Contacts</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 telfono (non visibile alle altre applicazioni)</string>
<string name="company">Compagnia</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>
<string name="send_email_to_contacts">Invia un\'email ai contatti</string>
<string name="send_sms_to_group">Invia un SMS al gruppo</string>
<string name="send_email_to_group">Invia un\'email al gruppo</string>
<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>
<!-- 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="new_contact">Nuovo contatto</string>
<string name="edit_contact">Modifica contatto</string>
<string name="select_contact">Seleziona contatto</string>
<string name="select_contacts">Seleziona contatti</string>
<string name="first_name">Nome</string>
<string name="middle_name">Secondo nome</string>
<string name="surname">Cognome</string>
<string name="nickname">Soprannome</string>
<!-- Groups -->
<string name="no_groups">Nessun gruppo</string>
<string name="create_new_group">Crea un nuovo gruppo</string>
<string name="remove_from_group">Rimuovi dal gruppo</string>
<string name="no_group_participants">Questo gruppo è vuoto</string>
<string name="add_contacts">Aggiungi contatti</string>
<string name="no_group_created">Non ci sono gruppi con contatti nel dispositivo</string>
<string name="create_group">Crea gruppo</string>
<string name="add_to_group">Aggiungi al gruppo</string>
<string name="create_group_under_account">Crea un gruppo con un account</string>
<!-- Photo -->
<string name="take_photo">Scatta un foto</string>
<string name="choose_photo">Scegli una foto</string>
<string name="remove_photo">Rimuovi 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="on_contact_click">Al click 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 filetrare 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_only_contacts_with_numbers">Mostra solamente i contatti con almeno un numero telefonico</string>
<!-- Emails -->
<string name="email">Email</string>
<string name="home">Casa</string>
<string name="work">Lavoro</string>
<string name="other">Altro</string>
<!-- Phone numbers -->
<string name="number">Numero</string>
<string name="mobile">Cellulare</string>
<string name="main_number">Principale</string>
<string name="work_fax">Fax di lavoro</string>
<string name="home_fax">Fax di casa</string>
<string name="pager">Cercapersone</string>
<string name="no_phone_number_found">Non è stato trovato alcun numero di telefono</string>
<!-- Events -->
<string name="birthday">Compleanno</string>
<string name="anniversary">Anniversario</string>
<!-- Favorites -->
<string name="no_favorites">Sembra che ancora non si ha 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>
<!-- Search -->
<string name="search_contacts">Cerca contatti</string>
<string name="search_favorites">Cerca preferiti</string>
<!-- Export / Import -->
<string name="import_contacts">Importa contatti</string>
<string name="export_contacts">Esporta contatti</string>
<string name="import_contacts_from_vcf">Importa contatti da un file .vcf</string>
<string name="export_contacts_to_vcf">Esporta contatti in un file .vcf</string>
<string name="target_contact_source">Individua la provenienza del contatto</string>
<string name="include_contact_sources">Includi la provenienza del contatto</string>
<string name="filename_without_vcf">Nome del file (senza .vcf)</string>
<!-- Dialpad -->
<string name="dialpad">Tastiera</string>
<string name="add_number_to_contact">Aggiungi numero ai contatti</string>
<!-- Visible fields -->
<string name="select_fields_to_show">Seleziona i campi da mostrare</string>
<string name="prefix">Prefisso</string>
<string name="suffix">Suffisso</string>
<string name="phone_numbers">Numeri di telefono</string>
<string name="emails">Email</string>
<string name="addresses">Indirizzi</string>
<string name="events">Eventi (compleanni, anniversari)</string>
<string name="notes">Note</string>
<string name="organization">Organizazione</string>
<string name="websites">Siti web</string>
<string name="groups">Gruppi</string>
<string name="contact_source">Provenienza del contatto</string>
<string name="instant_messaging">Messaggistica istantanea (IM)</string>
<!-- 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>
<!-- 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.
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
Non contiene pubblicità nè chiede permessi non necessari. È completamente open source ed offre colori personalizzabili.
Quest\'app fa parte di una serie più grande. Puoi trovare le altre su https://www.simplemobiletools.com
</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>

View File

@ -15,8 +15,13 @@
<string name="send_email_to_group">グループにメールを送信</string> <string name="send_email_to_group">グループにメールを送信</string>
<string name="call_person">Call %s</string> <string name="call_person">Call %s</string>
<string name="request_the_required_permissions">Request the required permissions</string> <string name="request_the_required_permissions">Request the required permissions</string>
<string name="create_new_contact">Create new contact</string> <string name="create_new_contact">新しい連絡先を作成</string>
<string name="add_to_existing_contact">Add to an existing contact</string> <string name="add_to_existing_contact">既存の連絡先に追加</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="new_contact">新しい連絡先</string> <string name="new_contact">新しい連絡先</string>
<string name="edit_contact">連絡先を編集</string> <string name="edit_contact">連絡先を編集</string>
@ -57,6 +62,7 @@
<string name="favorites">お気に入り</string> <string name="favorites">お気に入り</string>
<string name="recent_calls">Recent calls</string> <string name="recent_calls">Recent calls</string>
<string name="show_call_confirmation_dialog">発信する前に確認ダイアログを表示する</string> <string name="show_call_confirmation_dialog">発信する前に確認ダイアログを表示する</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails --> <!-- Emails -->
<string name="email">メール</string> <string name="email">メール</string>
@ -99,7 +105,7 @@
<!-- Dialpad --> <!-- Dialpad -->
<string name="dialpad">ダイヤルパッド</string> <string name="dialpad">ダイヤルパッド</string>
<string name="add_number_to_contact">Add number to contact</string> <string name="add_number_to_contact">連絡先に番号を追加</string>
<!-- Visible fields --> <!-- Visible fields -->
<string name="select_fields_to_show">表示する項目を選択</string> <string name="select_fields_to_show">表示する項目を選択</string>

View File

@ -18,6 +18,11 @@
<string name="create_new_contact">Create new contact</string> <string name="create_new_contact">Create new contact</string>
<string name="add_to_existing_contact">Add to an existing contact</string> <string name="add_to_existing_contact">Add to an existing contact</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="new_contact">새로운 연락처</string> <string name="new_contact">새로운 연락처</string>
<string name="edit_contact">연락처 수정</string> <string name="edit_contact">연락처 수정</string>
<string name="select_contact">단건 연락처 선택</string> <string name="select_contact">단건 연락처 선택</string>
@ -57,6 +62,7 @@
<string name="favorites">Favorites</string> <string name="favorites">Favorites</string>
<string name="recent_calls">Recent calls</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_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>
<!-- Emails --> <!-- Emails -->
<string name="email">이메일</string> <string name="email">이메일</string>

View File

@ -18,6 +18,11 @@
<string name="create_new_contact">Create new contact</string> <string name="create_new_contact">Create new contact</string>
<string name="add_to_existing_contact">Add to an existing contact</string> <string name="add_to_existing_contact">Add to an existing contact</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="new_contact">Naujas kontaktas</string> <string name="new_contact">Naujas kontaktas</string>
<string name="edit_contact">Redaguoti kontaktą</string> <string name="edit_contact">Redaguoti kontaktą</string>
<string name="select_contact">Pasirinkti kontaktą</string> <string name="select_contact">Pasirinkti kontaktą</string>
@ -57,6 +62,7 @@
<string name="favorites">Favorites</string> <string name="favorites">Favorites</string>
<string name="recent_calls">Recent calls</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_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>
<!-- Emails --> <!-- Emails -->
<string name="email">Elektroninis paštas</string> <string name="email">Elektroninis paštas</string>

View File

@ -15,8 +15,13 @@
<string name="send_email_to_group">Enviar e-mail para o grupo</string> <string name="send_email_to_group">Enviar e-mail para o grupo</string>
<string name="call_person">Ligar a %s</string> <string name="call_person">Ligar a %s</string>
<string name="request_the_required_permissions">Pedir a permissão necessária</string> <string name="request_the_required_permissions">Pedir a permissão necessária</string>
<string name="create_new_contact">Create new contact</string> <string name="create_new_contact">Criar novo contacto</string>
<string name="add_to_existing_contact">Add to an existing contact</string> <string name="add_to_existing_contact">Adicionar a contacto existente</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="new_contact">Novo contacto</string> <string name="new_contact">Novo contacto</string>
<string name="edit_contact">Editar contacto</string> <string name="edit_contact">Editar contacto</string>
@ -57,6 +62,7 @@
<string name="favorites">Favoritos</string> <string name="favorites">Favoritos</string>
<string name="recent_calls">Chamadas recentes</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_call_confirmation_dialog">Mostrar diálogo para confirmar a chamada</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails --> <!-- Emails -->
<string name="email">E-mail</string> <string name="email">E-mail</string>
@ -98,8 +104,8 @@
<string name="filename_without_vcf">Nome do ficheiro (sem .vcf)</string> <string name="filename_without_vcf">Nome do ficheiro (sem .vcf)</string>
<!-- Dialpad --> <!-- Dialpad -->
<string name="dialpad">Dialpad</string> <string name="dialpad">Teclado</string>
<string name="add_number_to_contact">Add number to contact</string> <string name="add_number_to_contact">Adicionar número a um contacto</string>
<!-- Visible fields --> <!-- Visible fields -->
<string name="select_fields_to_show">Selecione os campos a mostrar</string> <string name="select_fields_to_show">Selecione os campos a mostrar</string>

View File

@ -18,6 +18,11 @@
<string name="create_new_contact">Создать новый контакт</string> <string name="create_new_contact">Создать новый контакт</string>
<string name="add_to_existing_contact">Добавить к существующему контакту</string> <string name="add_to_existing_contact">Добавить к существующему контакту</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="new_contact">Новый контакт</string> <string name="new_contact">Новый контакт</string>
<string name="edit_contact">Редактировать контакт</string> <string name="edit_contact">Редактировать контакт</string>
<string name="select_contact">Выбрать контакт</string> <string name="select_contact">Выбрать контакт</string>
@ -57,6 +62,7 @@
<string name="favorites">Избранное</string> <string name="favorites">Избранное</string>
<string name="recent_calls">Недавние вызовы</string> <string name="recent_calls">Недавние вызовы</string>
<string name="show_call_confirmation_dialog">Показывать диалог подтверждения вызова</string> <string name="show_call_confirmation_dialog">Показывать диалог подтверждения вызова</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails --> <!-- Emails -->
<string name="email">Эл. почта</string> <string name="email">Эл. почта</string>

View File

@ -18,6 +18,11 @@
<string name="create_new_contact">Vytvoriť nový kontakt</string> <string name="create_new_contact">Vytvoriť nový kontakt</string>
<string name="add_to_existing_contact">Pridať k existujúcemu kontaktu</string> <string name="add_to_existing_contact">Pridať k existujúcemu kontaktu</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="new_contact">Nový kontakt</string> <string name="new_contact">Nový kontakt</string>
<string name="edit_contact">Upraviť kontakt</string> <string name="edit_contact">Upraviť kontakt</string>
<string name="select_contact">Zvoľte kontakt</string> <string name="select_contact">Zvoľte kontakt</string>
@ -57,6 +62,7 @@
<string name="favorites">Obľúbené</string> <string name="favorites">Obľúbené</string>
<string name="recent_calls">Predošlé hovory</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_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>
<!-- Emails --> <!-- Emails -->
<string name="email">Email</string> <string name="email">Email</string>

View File

@ -15,8 +15,13 @@
<string name="send_email_to_group">Skicka e-post till grupp</string> <string name="send_email_to_group">Skicka e-post till grupp</string>
<string name="call_person">Ring %s</string> <string name="call_person">Ring %s</string>
<string name="request_the_required_permissions">Begär de behörigheter som krävs</string> <string name="request_the_required_permissions">Begär de behörigheter som krävs</string>
<string name="create_new_contact">Create new contact</string> <string name="create_new_contact">Skapa ny kontakt</string>
<string name="add_to_existing_contact">Add to an existing contact</string> <string name="add_to_existing_contact">Lägg till i en befintlig kontakt</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="new_contact">Ny kontakt</string> <string name="new_contact">Ny kontakt</string>
<string name="edit_contact">Redigera kontakt</string> <string name="edit_contact">Redigera kontakt</string>
@ -57,6 +62,7 @@
<string name="favorites">Favoriter</string> <string name="favorites">Favoriter</string>
<string name="recent_calls">Senaste samtal</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_call_confirmation_dialog">Visa en bekräftelsedialogruta före uppringning</string>
<string name="show_only_contacts_with_numbers">Visa bara kontakter med telefonnummer</string>
<!-- Emails --> <!-- Emails -->
<string name="email">E-post</string> <string name="email">E-post</string>
@ -98,8 +104,8 @@
<string name="filename_without_vcf">Filnamn (utan .vcf)</string> <string name="filename_without_vcf">Filnamn (utan .vcf)</string>
<!-- Dialpad --> <!-- Dialpad -->
<string name="dialpad">Dialpad</string> <string name="dialpad">Knappsats</string>
<string name="add_number_to_contact">Add number to contact</string> <string name="add_number_to_contact">Lägg till nummer i kontakt</string>
<!-- Visible fields --> <!-- Visible fields -->
<string name="select_fields_to_show">Välj vilka fält som ska visas</string> <string name="select_fields_to_show">Välj vilka fält som ska visas</string>
@ -114,7 +120,7 @@
<string name="websites">Webbplatser</string> <string name="websites">Webbplatser</string>
<string name="groups">Grupper</string> <string name="groups">Grupper</string>
<string name="contact_source">Kontaktkälla</string> <string name="contact_source">Kontaktkälla</string>
<string name="instant_messaging">Instant messaging (IM)</string> <string name="instant_messaging">Snabbmeddelanden (IM)</string>
<!-- FAQ --> <!-- FAQ -->
<string name="faq_1_title">I want to change what fields are visible at contacts. Can I do it?</string> <string name="faq_1_title">I want to change what fields are visible at contacts. Can I do it?</string>

View File

@ -18,6 +18,11 @@
<string name="create_new_contact">Create new contact</string> <string name="create_new_contact">Create new contact</string>
<string name="add_to_existing_contact">Add to an existing contact</string> <string name="add_to_existing_contact">Add to an existing contact</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="new_contact">Yeni kişi</string> <string name="new_contact">Yeni kişi</string>
<string name="edit_contact">Kişiyi düzenle</string> <string name="edit_contact">Kişiyi düzenle</string>
<string name="select_contact">Kişi seç</string> <string name="select_contact">Kişi seç</string>
@ -57,6 +62,7 @@
<string name="favorites">Favorites</string> <string name="favorites">Favorites</string>
<string name="recent_calls">Recent calls</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_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>
<!-- Emails --> <!-- Emails -->
<string name="email">E-posta</string> <string name="email">E-posta</string>

View File

@ -1,7 +0,0 @@
<resources>
<style name="DialpadNumberStyle" parent="DialpadNumberStyle.Base">
<item name="android:background">?attr/selectableItemBackgroundBorderless</item>
</style>
</resources>

View File

@ -15,8 +15,13 @@
<string name="send_email_to_group">發送電子郵件給群組</string> <string name="send_email_to_group">發送電子郵件給群組</string>
<string name="call_person">打電話給 %s</string> <string name="call_person">打電話給 %s</string>
<string name="request_the_required_permissions">請求必要的權限</string> <string name="request_the_required_permissions">請求必要的權限</string>
<string name="create_new_contact">Create new contact</string> <string name="create_new_contact">建立新聯絡人</string>
<string name="add_to_existing_contact">Add to an existing contact</string> <string name="add_to_existing_contact">添加至已存在的聯絡人</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="new_contact">新聯絡人</string> <string name="new_contact">新聯絡人</string>
<string name="edit_contact">編輯聯絡人</string> <string name="edit_contact">編輯聯絡人</string>
@ -25,7 +30,7 @@
<string name="first_name">名字</string> <string name="first_name">名字</string>
<string name="middle_name">中間名</string> <string name="middle_name">中間名</string>
<string name="surname">姓氏</string> <string name="surname">姓氏</string>
<string name="nickname">Nickname</string> <string name="nickname">暱稱</string>
<!-- Groups --> <!-- Groups -->
<string name="no_groups">沒有群組</string> <string name="no_groups">沒有群組</string>
@ -57,6 +62,7 @@
<string name="favorites">我的最愛</string> <string name="favorites">我的最愛</string>
<string name="recent_calls">通話紀錄</string> <string name="recent_calls">通話紀錄</string>
<string name="show_call_confirmation_dialog">開始通話前顯示通話確認框</string> <string name="show_call_confirmation_dialog">開始通話前顯示通話確認框</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails --> <!-- Emails -->
<string name="email">電子信箱</string> <string name="email">電子信箱</string>
@ -98,8 +104,8 @@
<string name="filename_without_vcf">檔案名稱 (不含.vcf)</string> <string name="filename_without_vcf">檔案名稱 (不含.vcf)</string>
<!-- Dialpad --> <!-- Dialpad -->
<string name="dialpad">Dialpad</string> <string name="dialpad">撥號畫面</string>
<string name="add_number_to_contact">Add number to contact</string> <string name="add_number_to_contact">添加號碼至通訊錄</string>
<!-- Visible fields --> <!-- Visible fields -->
<string name="select_fields_to_show">選擇要顯示的欄位</string> <string name="select_fields_to_show">選擇要顯示的欄位</string>
@ -114,7 +120,7 @@
<string name="websites">網站</string> <string name="websites">網站</string>
<string name="groups">群組</string> <string name="groups">群組</string>
<string name="contact_source">聯絡人來源</string> <string name="contact_source">聯絡人來源</string>
<string name="instant_messaging">Instant messaging (IM)</string> <string name="instant_messaging">即時通訊 (IM)</string>
<!-- FAQ --> <!-- FAQ -->
<string name="faq_1_title">我想要更改在通訊錄會看到哪些欄位。我能這麼做嗎?</string> <string name="faq_1_title">我想要更改在通訊錄會看到哪些欄位。我能這麼做嗎?</string>

View File

@ -10,8 +10,10 @@
<string name="hangouts">Hangouts</string> <string name="hangouts">Hangouts</string>
<string name="icq">ICQ</string> <string name="icq">ICQ</string>
<string name="jabber">Jabber</string> <string name="jabber">Jabber</string>
<string name="telegram">Telegram</string>
<!-- Release notes --> <!-- Release notes -->
<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_32">Added a simple dialpad, dialer will come soon</string>
<string name="release_31"> <string name="release_31">
Added an optional IM field\n Added an optional IM field\n

View File

@ -18,6 +18,11 @@
<string name="create_new_contact">Create new contact</string> <string name="create_new_contact">Create new contact</string>
<string name="add_to_existing_contact">Add to an existing contact</string> <string name="add_to_existing_contact">Add to an existing contact</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="new_contact">New contact</string> <string name="new_contact">New contact</string>
<string name="edit_contact">Edit contact</string> <string name="edit_contact">Edit contact</string>
<string name="select_contact">Select contact</string> <string name="select_contact">Select contact</string>
@ -57,6 +62,7 @@
<string name="favorites">Favorites</string> <string name="favorites">Favorites</string>
<string name="recent_calls">Recent calls</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_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>
<!-- Emails --> <!-- Emails -->
<string name="email">Email</string> <string name="email">Email</string>

View File

@ -2,15 +2,12 @@
<style name="AppTheme" parent="AppTheme.Base"/> <style name="AppTheme" parent="AppTheme.Base"/>
<style name="DialpadNumberStyle.Base"> <style name="DialpadNumberStyle">
<item name="android:gravity">center</item> <item name="android:gravity">center</item>
<item name="android:paddingBottom">@dimen/medium_margin</item> <item name="android:paddingBottom">@dimen/medium_margin</item>
<item name="android:paddingTop">@dimen/normal_margin</item> <item name="android:paddingTop">@dimen/normal_margin</item>
<item name="android:textSize">@dimen/dialpad_text_size</item> <item name="android:textSize">@dimen/dialpad_text_size</item>
</style> <item name="android:background">?attr/selectableItemBackgroundBorderless</item>
<style name="DialpadNumberStyle" parent="DialpadNumberStyle.Base">
<item name="android:background">?attr/selectableItemBackground</item>
</style> </style>
</resources> </resources>

View File

@ -9,7 +9,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.2.0' classpath 'com.android.tools.build:gradle:3.2.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 461 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 KiB

2
gradle.properties Normal file
View File

@ -0,0 +1,2 @@
android.enableJetifier=true
android.useAndroidX=true