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
.gradle
/local.properties
/gradle.properties
/.idea/
.DS_Store
/build

View File

@ -1,6 +1,24 @@
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)*
----------------------------

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;">
<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_3.png" width="30%">
<img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.png" width="30%">
</div>
License

View File

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

View File

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

View File

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

View File

@ -5,6 +5,7 @@ import android.app.DatePickerDialog
import android.content.ClipData
import android.content.ContentValues
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.drawable.ColorDrawable
import android.net.Uri
import android.os.Bundle
@ -114,7 +115,7 @@ class EditContactActivity : ContactActivity() {
super.onActivityResult(requestCode, resultCode, resultData)
if (resultCode == RESULT_OK) {
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)
}
}
@ -260,15 +261,28 @@ class EditContactActivity : ContactActivity() {
}
}
private fun startCropPhotoIntent(uri: Uri?) {
if (uri == null) {
private fun startCropPhotoIntent(primaryUri: Uri?, backupUri: Uri?) {
if (primaryUri == null) {
toast(R.string.unknown_error_occurred)
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()
Intent("com.android.camera.action.CROP").apply {
setDataAndType(uri, "image/*")
setDataAndType(imageUri, "image/*")
putExtra(MediaStore.EXTRA_OUTPUT, lastPhotoIntentUri)
putExtra("outputX", 720)
putExtra("outputY", 720)
@ -277,7 +291,7 @@ class EditContactActivity : ContactActivity() {
putExtra("crop", "true")
putExtra("scale", "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)
if (resolveActivity(packageManager) != null) {
startActivityForResult(this, INTENT_CROP_PHOTO)

View File

@ -9,11 +9,11 @@ import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Bundle
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.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.extensions.*
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.ImportContactsDialog
import com.simplemobiletools.contacts.extensions.config
import com.simplemobiletools.contacts.extensions.dbHelper
import com.simplemobiletools.contacts.extensions.getTempFile
import com.simplemobiletools.contacts.fragments.MyViewPagerFragment
import com.simplemobiletools.contacts.helpers.*
@ -63,9 +62,6 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
appLaunched(BuildConfig.APPLICATION_ID)
setupTabColors()
// just get a reference to the database to make sure it is created properly
dbHelper
handlePermission(PERMISSION_READ_CALL_LOG) {
if (it) {
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() {
viewpager.offscreenPageLimit = 3
viewpager.offscreenPageLimit = tabsList.size - 1
viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {
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) {
main_tabs_holder.getTabAt(position)?.select()
@ -373,7 +368,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
}, 100L)
}
main_tabs_holder.beVisibleIf(skippedTabs < 3)
main_tabs_holder.beVisibleIf(skippedTabs < tabsList.size - 1)
main_dialpad_button.setOnClickListener {
val intent = Intent(applicationContext, DialpadActivity::class.java)
@ -401,7 +396,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
fun showFilterDialog() {
FilterContactSourcesDialog(this) {
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() {
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(
FAQItem(R.string.faq_1_title, R.string.faq_1_text),
@ -495,9 +490,10 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
}
override fun refreshContacts(refreshTabsMask: Int) {
if (isActivityDestroyed() || isGettingContacts) {
if (isDestroyed || isGettingContacts) {
return
}
isGettingContacts = true
if (viewpager.adapter == null) {
@ -507,7 +503,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
ContactsHelper(this).getContacts {
isGettingContacts = false
if (isActivityDestroyed()) {
if (isDestroyed) {
return@getContacts
}
@ -551,6 +547,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
add(Release(29, R.string.release_29))
add(Release(31, R.string.release_31))
add(Release(32, R.string.release_32))
add(Release(34, R.string.release_34))
checkWhatsNew(this, BuildConfig.VERSION_CODE)
}
}

View File

@ -6,9 +6,7 @@ import android.os.Bundle
import android.provider.ContactsContract
import android.view.Menu
import android.view.MenuItem
import com.simplemobiletools.commons.extensions.baseConfig
import com.simplemobiletools.commons.extensions.isActivityDestroyed
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
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.SMT_PRIVATE
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() {
private var specialMimeType: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.layout_select_contact)
setContentView(R.layout.activity_select_contact)
setupPlaceholders()
handlePermission(PERMISSION_READ_CONTACTS) {
if (it) {
@ -80,7 +79,7 @@ class SelectContactActivity : SimpleActivity() {
private fun initContacts() {
ContactsHelper(this).getContacts {
if (isActivityDestroyed()) {
if (isDestroyed) {
return@getContacts
}
@ -105,8 +104,11 @@ class SelectContactActivity : SimpleActivity() {
contacts.sort()
runOnUiThread {
select_contact_list.adapter = SelectContactsAdapter(this, contacts, ArrayList(), false) {
updatePlaceholderVisibility(contacts)
SelectContactsAdapter(this, contacts, ArrayList(), false, select_contact_list) {
confirmSelection(it)
}.apply {
select_contact_list.adapter = this
}
select_contact_fastscroller.allowBubbleDisplay = baseConfig.showInfoBubble
@ -132,9 +134,29 @@ class SelectContactActivity : SimpleActivity() {
val contactId = ContactsHelper(this).getContactMimeTypeId(contact.id.toString(), specialMimeType!!)
Uri.withAppendedPath(ContactsContract.Data.CONTENT_URI, contactId)
}
else -> {
getContactPublicUri(contact)
else -> 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()
setupShowContactThumbnails()
setupShowPhoneNumbers()
setupShowContactsWithNumbers()
setupStartNameWithSurname()
setupUse24HourTimeFormat()
setupFilterDuplicates()
setupShowCallConfirmation()
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() {
settings_start_with_surname.isChecked = config.startNameWithSurname
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() {
settings_filter_duplicates.isChecked = config.filterDuplicates
settings_filter_duplicates_holder.setOnClickListener {

View File

@ -354,12 +354,16 @@ class ViewContactActivity : ContactActivity() {
private fun setupOrganization() {
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_job_position.text = organization.jobPosition
contact_organization_image.beGoneIf(organization.isEmpty())
contact_organization_company.beGoneIf(organization.company.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 {
contact_organization_image.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.dialogs.ConfirmationDialog
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.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView
@ -33,6 +36,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
private lateinit var contactDrawable: Drawable
private lateinit var businessContactDrawable: Drawable
private var config = activity.config
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) {
if (selectedPositions.isEmpty()) {
if (selectedKeys.isEmpty()) {
return
}
@ -100,6 +98,10 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
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 {
val layout = if (showPhoneNumbers) R.layout.item_contact_with_number else R.layout.item_contact_without_number
return createViewHolder(layout, parent)
@ -108,16 +110,19 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
val contact = contactItems[position]
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)
}
bindViewHolder(holder, position, view)
bindViewHolder(holder)
}
override fun getItemCount() = contactItems.size
private fun getItemWithKey(key: Int): Contact? = contactItems.firstOrNull { it.id == key }
fun initDrawables() {
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 = "") {
@ -134,7 +139,8 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
}
private fun editContact() {
activity.editContact(contactItems[selectedPositions.first()])
val contact = getItemWithKey(selectedKeys.first()) ?: return
activity.editContact(contact)
}
private fun askConfirmDelete() {
@ -144,17 +150,12 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
}
private fun deleteContacts() {
if (selectedPositions.isEmpty()) {
if (selectedKeys.isEmpty()) {
return
}
val contactsToRemove = ArrayList<Contact>()
selectedPositions.sortedDescending().forEach {
val contact = contactItems.getOrNull(it)
if (contact != null) {
contactsToRemove.add(contact)
}
}
val contactsToRemove = getSelectedItems()
val positions = getSelectedItemPositions()
contactItems.removeAll(contactsToRemove)
ContactsHelper(activity).deleteContacts(contactsToRemove)
@ -162,16 +163,15 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
refreshListener?.refreshContacts(ALL_TABS_MASK)
finishActMode()
} else {
removeSelectedItems()
removeSelectedItems(positions)
refreshListener?.refreshContacts(CONTACTS_TAB_MASK or FAVORITES_TAB_MASK)
}
}
// used for removing contacts from groups or favorites, not deleting actual contacts
private fun removeContacts() {
val contactsToRemove = ArrayList<Contact>()
selectedPositions.sortedDescending().forEach {
contactsToRemove.add(contactItems[it])
}
val contactsToRemove = getSelectedItems()
val positions = getSelectedItemPositions()
contactItems.removeAll(contactsToRemove)
if (location == LOCATION_FAVORITES_TAB) {
@ -180,22 +180,22 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
refreshListener?.refreshContacts(FAVORITES_TAB_MASK)
finishActMode()
} else {
removeSelectedItems()
removeSelectedItems(positions)
}
} else if (location == LOCATION_GROUP_CONTACTS) {
removeListener?.removeFromGroup(contactsToRemove)
removeSelectedItems()
removeSelectedItems(positions)
}
}
private fun addToFavorites() {
ContactsHelper(activity).addFavorites(getSelectedContacts())
ContactsHelper(activity).addFavorites(getSelectedItems())
refreshListener?.refreshContacts(FAVORITES_TAB_MASK)
finishActMode()
}
private fun addToGroup() {
val selectedContacts = getSelectedContacts()
val selectedContacts = getSelectedItems()
val NEW_GROUP_ID = -1
val items = ArrayList<RadioItem>()
ContactsHelper(activity).getStoredGroups().forEach {
@ -223,41 +223,30 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
}
private fun shareContacts() {
val contactsIDs = ArrayList<Int>()
selectedPositions.forEach {
contactsIDs.add(contactItems[it].id)
}
val filtered = contactItems.filter { contactsIDs.contains(it.id) } as ArrayList<Contact>
activity.shareContacts(filtered)
activity.shareContacts(getSelectedItems())
}
private fun sendSMSToContacts() {
activity.sendSMSToContacts(getSelectedContacts())
activity.sendSMSToContacts(getSelectedItems())
}
private fun sendEmailToContacts() {
activity.sendEmailToContacts(getSelectedContacts())
activity.sendEmailToContacts(getSelectedItems())
}
private fun getSelectedContacts(): ArrayList<Contact> {
val contacts = ArrayList<Contact>()
selectedPositions.forEach {
contacts.add(contactItems[it])
}
return contacts
}
private fun getSelectedItems() = contactItems.filter { selectedKeys.contains(it.id) } as ArrayList<Contact>
override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder)
if (!activity.isActivityDestroyed()) {
Glide.with(activity).clear(holder.itemView?.contact_tmb!!)
if (!activity.isDestroyed) {
Glide.with(activity).clear(holder.itemView.contact_tmb)
}
}
private fun setupView(view: View, contact: Contact) {
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.setTextColor(textColor)
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)
if (showContactThumbnails) {
val placeholderImage = if (contact.isABusinessContact()) businessContactDrawable else contactDrawable
when {
contact.photoUri.isNotEmpty() -> {
val options = RequestOptions()
.signature(ObjectKey(contact.photoUri))
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.error(contactDrawable)
.error(placeholderImage)
.centerCrop()
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()
.signature(ObjectKey(contact.photo!!))
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.error(contactDrawable)
.error(placeholderImage)
.centerCrop()
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
import android.support.v7.widget.RecyclerView
import android.util.SparseArray
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
import com.simplemobiletools.commons.interfaces.MyAdapterListener
import com.simplemobiletools.contacts.R
import com.simplemobiletools.contacts.activities.SimpleActivity
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>) :
RecyclerView.Adapter<FilterContactSourcesAdapter.ViewHolder>() {
private val itemViews = SparseArray<View>()
private val selectedPositions = HashSet<Int>()
private val selectedKeys = HashSet<Int>()
init {
contactSources.forEachIndexed { index, contactSource ->
if (displayContactSources.contains(contactSource.name)) {
selectedPositions.add(index)
selectedKeys.add(contactSource.hashCode())
}
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)) {
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 (itemViews[pos] != null) {
selectedPositions.add(pos)
}
selectedKeys.add(contactSource.hashCode())
} else {
selectedPositions.remove(pos)
selectedKeys.remove(contactSource.hashCode())
}
itemViews[pos]?.filter_contact_source_checkbox?.isChecked = select
notifyItemChanged(position)
}
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() = selectedPositions
fun getSelectedContactSources() = contactSources.filter { selectedKeys.contains(it.hashCode()) }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
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) {
val contactSource = contactSources[position]
itemViews.put(position, holder.bindView(contactSource.name))
toggleItemSelection(selectedPositions.contains(position), position)
holder.bindView(contactSource)
}
override fun getItemCount() = contactSources.size
class ViewHolder(view: View, private val adapterListener: MyAdapterListener, val activity: SimpleActivity) : RecyclerView.ViewHolder(view) {
fun bindView(contactSource: String): View {
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bindView(contactSource: ContactSource): View {
val isSelected = selectedKeys.contains(contactSource.hashCode())
itemView.apply {
filter_contact_source_checkbox.isChecked = isSelected
filter_contact_source_checkbox.setColors(activity.config.textColor, activity.getAdjustedPrimaryColor(), activity.config.backgroundColor)
filter_contact_source_checkbox.text = contactSource
filter_contact_source_holder.setOnClickListener { viewClicked(!filter_contact_source_checkbox.isChecked) }
filter_contact_source_checkbox.text = contactSource.name
filter_contact_source_holder.setOnClickListener { viewClicked(!isSelected, contactSource) }
}
return itemView
}
private fun viewClicked(select: Boolean) {
adapterListener.toggleItemSelectionAdapter(select, adapterPosition)
private fun viewClicked(select: Boolean, contactSource: ContactSource) {
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) {
if (selectedPositions.isEmpty()) {
if (selectedKeys.isEmpty()) {
return
}
@ -63,18 +57,24 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList<Group>, val
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 onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
val group = groups[position]
val view = holder.bindView(group, true, true) { itemView, layoutPosition ->
holder.bindView(group, true, true) { itemView, layoutPosition ->
setupView(itemView, group)
}
bindViewHolder(holder, position, view)
bindViewHolder(holder)
}
override fun getItemCount() = groups.size
private fun getItemWithKey(key: Int): Group? = groups.firstOrNull { it.id.toInt() == key }
fun updateItems(newItems: ArrayList<Group>) {
groups = newItems
notifyDataSetChanged()
@ -83,7 +83,8 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList<Group>, val
}
private fun renameGroup() {
RenameGroupDialog(activity, groups[selectedPositions.first()]) {
val group = getItemWithKey(selectedKeys.first()) ?: return
RenameGroupDialog(activity, group) {
finishActMode()
refreshListener?.refreshContacts(GROUPS_TAB_MASK)
}
@ -96,18 +97,17 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList<Group>, val
}
private fun deleteGroups() {
if (selectedPositions.isEmpty()) {
if (selectedKeys.isEmpty()) {
return
}
val groupsToRemove = ArrayList<Group>()
selectedPositions.sortedDescending().forEach {
val group = groups[it]
groupsToRemove.add(group)
if (group.isPrivateSecretGroup()) {
activity.dbHelper.deleteGroup(group.id)
val groupsToRemove = groups.filter { selectedKeys.contains(it.id.toInt()) } as ArrayList<Group>
val positions = getSelectedItemPositions()
groupsToRemove.forEach {
if (it.isPrivateSecretGroup()) {
activity.dbHelper.deleteGroup(it.id)
} else {
ContactsHelper(activity).deleteGroup(group.id)
ContactsHelper(activity).deleteGroup(it.id)
}
}
groups.removeAll(groupsToRemove)
@ -116,12 +116,13 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList<Group>, val
refreshListener?.refreshContacts(GROUPS_TAB_MASK)
finishActMode()
} else {
removeSelectedItems()
removeSelectedItems(positions)
}
}
private fun setupView(view: View, group: Group) {
view.apply {
group_frame?.isSelected = selectedKeys.contains(group.id.toInt())
group_name.apply {
setTextColor(textColor)
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 prepareItemSelection(viewHolder: ViewHolder) {}
override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
viewHolder?.itemView?.recent_call_frame?.isSelected = select
}
override fun actionItemPressed(id: Int) {
if (selectedPositions.isEmpty()) {
if (selectedKeys.isEmpty()) {
return
}
@ -51,14 +45,18 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<Re
override fun getIsItemSelectable(position: Int) = true
override fun getItemSelectionKey(position: Int) = recentCalls.getOrNull(position)?.id
override fun getItemKeyPosition(key: Int) = recentCalls.indexOfFirst { it.id == key }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_recent_call, parent)
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
val recentCall = recentCalls[position]
val view = holder.bindView(recentCall, true, true) { itemView, layoutPosition ->
holder.bindView(recentCall, true, true) { itemView, layoutPosition ->
setupView(itemView, recentCall)
}
bindViewHolder(holder, position, view)
bindViewHolder(holder)
}
override fun getItemCount() = recentCalls.size
@ -77,15 +75,12 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<Re
}
private fun deleteRecentCalls() {
if (selectedPositions.isEmpty()) {
if (selectedKeys.isEmpty()) {
return
}
val callsToRemove = ArrayList<RecentCall>()
selectedPositions.sortedDescending().forEach {
val call = recentCalls[it]
callsToRemove.add(call)
}
val callsToRemove = getSelectedItems()
val positions = getSelectedItemPositions()
ContactsHelper(activity).removeRecentCalls(callsToRemove.map { it.id } as ArrayList<Int>)
recentCalls.removeAll(callsToRemove)
@ -93,12 +88,15 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList<Re
refreshListener?.refreshContacts(RECENTS_TAB_MASK)
finishActMode()
} else {
removeSelectedItems()
removeSelectedItems(positions)
}
}
private fun getSelectedItems() = recentCalls.filter { selectedKeys.contains(it.id) } as ArrayList<RecentCall>
private fun setupView(view: View, recentCall: RecentCall) {
view.apply {
recent_call_frame?.isSelected = selectedKeys.contains(recentCall.id)
recent_call_name.apply {
text = recentCall.name ?: recentCall.number
setTextColor(textColor)

View File

@ -1,10 +1,11 @@
package com.simplemobiletools.contacts.adapters
import android.graphics.drawable.Drawable
import android.support.v7.widget.RecyclerView
import android.util.SparseArray
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
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.getAdjustedPrimaryColor
import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor
import com.simplemobiletools.commons.extensions.isActivityDestroyed
import com.simplemobiletools.commons.interfaces.MyAdapterListener
import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.contacts.R
import com.simplemobiletools.contacts.activities.SimpleActivity
import com.simplemobiletools.contacts.extensions.config
@ -24,7 +24,7 @@ import kotlinx.android.synthetic.main.item_add_favorite_with_number.view.*
import java.util.*
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 selectedPositions = HashSet<Int>()
private val config = activity.config
@ -38,10 +38,19 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Con
init {
contacts.forEachIndexed { index, contact ->
if (selectedContacts.map { it.id }.contains(contact.id)) {
if (selectedContacts.asSequence().map { it.id }.contains(contact.id)) {
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) {
@ -56,16 +65,6 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Con
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> {
val selectedItemsSet = HashSet<Contact>(selectedPositions.size)
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 {
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) {
@ -85,16 +84,15 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Con
override fun getItemCount() = contacts.size
class ViewHolder(view: View, private val adapterListener: MyAdapterListener, val activity: SimpleActivity, private val showCheckbox: Boolean,
private val itemClick: ((Contact) -> Unit)?) : RecyclerView.ViewHolder(view) {
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bindView(contact: Contact, contactDrawable: Drawable, config: Config, showContactThumbnails: Boolean,
smallPadding: Int, bigPadding: Int): View {
itemView.apply {
contact_checkbox.beVisibleIf(showCheckbox)
contact_checkbox.beVisibleIf(allowPickMultiple)
contact_checkbox.setColors(config.textColor, context.getAdjustedPrimaryColor(), config.backgroundColor)
val textColor = config.textColor
contact_name.text = contact.getFullName()
contact_name.text = contact.getNameToDisplay()
contact_name.setTextColor(textColor)
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)
.centerCrop()
if (activity.isActivityDestroyed()) {
if (activity.isDestroyed) {
Glide.with(activity).load(contact.photoUri).transition(DrawableTransitionOptions.withCrossFade()).apply(options).into(contact_tmb)
}
} else {
@ -132,14 +130,14 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Con
}
private fun viewClicked(select: Boolean) {
adapterListener.toggleItemSelectionAdapter(select, adapterPosition)
toggleItemSelection(select, adapterPosition)
}
}
override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder)
if (!activity.isActivityDestroyed()) {
Glide.with(activity).clear(holder.itemView?.contact_tmb!!)
if (!activity.isDestroyed) {
Glide.with(activity).clear(holder.itemView.contact_tmb)
}
}
}

View File

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

View File

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

View File

@ -1,6 +1,6 @@
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.extensions.setupDialogStuff
import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME

View File

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

View File

@ -1,6 +1,6 @@
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.extensions.setupDialogStuff
import com.simplemobiletools.commons.extensions.showKeyboard

View File

@ -1,7 +1,7 @@
package com.simplemobiletools.contacts.dialogs
import android.support.v7.app.AlertDialog
import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.contacts.R
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()}")
ContactsHelper(activity).getContactSources {
it.mapTo(contactSources, { it.copy() })
it.mapTo(contactSources) { it.copy() }
activity.runOnUiThread {
export_contacts_list.adapter = FilterContactSourcesAdapter(activity, it, activity.getVisibleContactSources())
}
@ -50,12 +50,12 @@ class ExportContactsDialog(val activity: SimpleActivity, val path: String, priva
return@setOnClickListener
}
val selectedIndexes = (view.export_contacts_list.adapter as FilterContactSourcesAdapter).getSelectedItemsSet()
val selectedContactSources = HashSet<String>()
selectedIndexes.forEach {
selectedContactSources.add(if (contactSources[it].type == SMT_PRIVATE) SMT_PRIVATE else contactSources[it].name)
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, selectedContactSources)
callback(file, selectedContactSourceNames)
dismiss()
}
else -> activity.toast(R.string.invalid_name)

View File

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

View File

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

View File

@ -1,6 +1,6 @@
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.extensions.setupDialogStuff
import com.simplemobiletools.commons.views.MyAppCompatCheckbox

View File

@ -1,6 +1,6 @@
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.extensions.setupDialogStuff
import com.simplemobiletools.commons.views.MyAppCompatCheckbox

View File

@ -1,6 +1,6 @@
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.extensions.*
import com.simplemobiletools.contacts.R

View File

@ -1,6 +1,6 @@
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.setupDialogStuff
import com.simplemobiletools.contacts.R
@ -33,7 +33,7 @@ class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayL
activity.runOnUiThread {
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.setViews(select_contact_list) {
select_contact_fastscroller.updateBubbleText(allContacts[it].getBubbleText())
@ -42,7 +42,7 @@ class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayL
}
AlertDialog.Builder(activity)
.setPositiveButton(R.string.ok, { dialog, which -> dialogConfirmed() })
.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.cancel, null)
.create().apply {
activity.setupDialogStuff(view, this)

View File

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

View File

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

View File

@ -1,19 +1,16 @@
package com.simplemobiletools.contacts.extensions
import android.annotation.TargetApi
import android.content.Context
import android.content.Intent
import android.database.Cursor
import android.net.Uri
import android.os.Build
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.hasPermission
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
import com.simplemobiletools.commons.helpers.isLollipopPlus
import com.simplemobiletools.contacts.BuildConfig
import com.simplemobiletools.contacts.R
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 {
val lookupKey = getLookupKeyFromUri(dataUri)
if (lookupKey != null && isLollipopPlus()) {
if (lookupKey != null) {
val uri = lookupContactUri(lookupKey, this)
if (uri != null) {
return getContactUriRawId(uri)
@ -100,7 +96,6 @@ fun Context.getLookupUriRawId(dataUri: Uri): Int {
return -1
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
fun Context.getContactUriRawId(uri: Uri): Int {
val projection = arrayOf(ContactsContract.Contacts.NAME_RAW_CONTACT_ID)
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.Intent
import android.support.design.widget.CoordinatorLayout
import android.util.AttributeSet
import android.view.ViewGroup
import androidx.coordinatorlayout.widget.CoordinatorLayout
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME
@ -88,7 +88,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fun startNameWithSurnameChanged(startNameWithSurname: Boolean) {
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
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()) {
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 ?: ""
}
@ -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.beVisibleIf(storedGroups.isEmpty())
@ -239,7 +239,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
val shouldNormalize = text.normalizeString() == text
(fragment_list.adapter as? ContactsAdapter)?.apply {
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) ||
it.doesContainPhoneNumber(text) ||
it.emails.any { it.value.contains(text, true) } ||
@ -254,7 +254,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
Contact.sorting = config.sorting
Contact.startWithSurname = config.startNameWithSurname
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) {
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 com.simplemobiletools.commons.extensions.beVisibleIf
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_WRITE_CALL_LOG
import com.simplemobiletools.contacts.activities.EditContactActivity
@ -33,7 +32,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
}
fun updateRecentCalls(recentCalls: ArrayList<RecentCall>) {
if (activity == null || activity!!.isActivityDestroyed()) {
if (activity == null || activity!!.isDestroyed) {
return
}

View File

@ -20,6 +20,10 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getBoolean(SHOW_PHONE_NUMBERS, false)
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
get() = prefs.getBoolean(START_NAME_WITH_SURNAME, false)
set(startNameWithSurname) = prefs.edit().putBoolean(START_NAME_WITH_SURNAME, startNameWithSurname).apply()

View File

@ -5,6 +5,7 @@ import android.provider.ContactsContract.CommonDataKinds
// shared prefs
const val SHOW_CONTACT_THUMBNAILS = "show_contact_thumbnails"
const val SHOW_PHONE_NUMBERS = "show_phone_numbers"
const val SHOW_ONLY_CONTACTS_WITH_NUMBERS = "show_only_contacts_with_numbers"
const val IGNORED_CONTACT_SOURCES = "ignored_contact_sources"
const val START_NAME_WITH_SURNAME = "start_name_with_surname"
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",
"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 showOnlyContactsWithNumbers = activity.config.showOnlyContactsWithNumbers
var tempContacts = 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) {
tempContacts = tempContacts.distinctBy {
it.getHashToCompare()
} 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) {
resultContacts.add(it.first())
} else {
@ -819,6 +830,9 @@ class ContactsHelper(val activity: Activity) {
accounts.forEach {
if (ContentResolver.getIsSyncable(it, ContactsContract.AUTHORITY) == 1) {
val contactSource = ContactSource(it.name, it.type)
if (it.type == TELEGRAM_PACKAGE) {
contactSource.name += " (${activity.getString(R.string.telegram)})"
}
sources.add(contactSource)
}
}
@ -1207,6 +1221,7 @@ class ContactsHelper(val activity: Activity) {
ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).apply {
withValue(ContactsContract.RawContacts.ACCOUNT_NAME, contact.source)
withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, getContactSourceType(contact.source))
withValue(ContactsContract.RawContacts.DIRTY, false)
operations.add(build())
}
@ -1298,7 +1313,7 @@ class ContactsHelper(val activity: Activity) {
}
// organization
if (!contact.organization.isEmpty()) {
if (contact.organization.isNotEmpty()) {
ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply {
withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
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 yesterdayDate = SimpleDateFormat("dd MMM yyyy", Locale.getDefault()).format(Date(System.currentTimeMillis() - DAY_SECONDS * 1000))
val yesterday = activity.getString(R.string.yesterday)
val timeFormat = if (activity.config.use24HourFormat) "HH:mm" else "h:mm a"
var prevNumber = ""
var cursor: Cursor? = null
@ -1548,7 +1564,7 @@ class ContactsHelper(val activity: Activity) {
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)
when {
datePart == todayDate -> formattedDate = formattedDate.substring(12)

View File

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

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()) {
firstString = organization.company.normalizeString()
if (firstString.isEmpty() && firstName.isEmpty() && middleName.isEmpty() && surname.isEmpty()) {
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()) {
secondString = other.organization.company.normalizeString()
if (secondString.isEmpty() && other.firstName.isEmpty() && other.middleName.isEmpty() && other.surname.isEmpty()) {
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) {
@ -56,7 +66,7 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
-1
} else {
if (firstString.toLowerCase() == secondString.toLowerCase()) {
getFullName().compareTo(other.getFullName(), true)
getNameToDisplay().compareTo(other.getNameToDisplay(), true)
} else {
firstString.compareTo(secondString, true)
}
@ -76,7 +86,7 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
else -> surname
}
fun getFullName(): String {
fun getNameToDisplay(): String {
var firstPart = if (startWithSurname) surname else firstName
if (middleName.isNotEmpty()) {
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 fullName = "$prefix $firstPart $lastPart$suffixComma".trim()
return if (fullName.isEmpty()) {
var fullOrganization = if (organization.jobPosition.isEmpty()) "" else "${organization.jobPosition}, "
fullOrganization += organization.company
fullOrganization.trim().trimEnd(',')
if (organization.isNotEmpty()) {
getFullCompany()
} else {
emails.firstOrNull()?.value?.trim() ?: ""
}
} else {
fullName
}
@ -98,7 +110,7 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
val newEmails = ArrayList<Email>()
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,
contactId = 0, thumbnailUri = "", notes = "", groups = ArrayList(), websites = ArrayList(), organization = Organization("", ""),
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 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
fun doesContainPhoneNumber(text: String): Boolean {
if (text.isNotEmpty()) {

View File

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

View File

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

View File

@ -1,5 +1,5 @@
<?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:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/group_contacts_coordinator"
@ -26,13 +26,13 @@
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/group_contacts_placeholder_2"
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/group_contacts_placeholder"
android:layout_centerHorizontal="true"
android:background="?attr/selectableItemBackground"
android:gravity="center"
android:paddingBottom="@dimen/medium_margin"
android:paddingTop="@dimen/medium_margin"
android:padding="@dimen/activity_margin"
android:text="@string/add_contacts"
android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/>
@ -51,8 +51,8 @@
android:layout_height="match_parent"
android:layout_alignParentEnd="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"/>
@ -67,4 +67,4 @@
android:layout_margin="@dimen/activity_margin"
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_height="match_parent">
<android.support.design.widget.TabLayout
<com.google.android.material.tabs.TabLayout
android:id="@+id/main_tabs_holder"
android:layout_width="match_parent"
android:layout_height="48dp"
@ -16,7 +16,7 @@
app:tabMinWidth="150dp"
app:tabSelectedTextColor="@android:color/white"/>
<com.booking.rtlviewpager.RtlViewPager
<com.simplemobiletools.commons.views.MyViewPager
android:id="@+id/viewpager"
android:layout_width="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_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_purchase_thank_you"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/purchase_simple_thank_you"/>
</RelativeLayout>
@ -40,18 +40,18 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_customize_colors"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/customize_colors"/>
</RelativeLayout>
@ -62,18 +62,18 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_manage_contact_fields"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/manage_shown_contact_fields"/>
</RelativeLayout>
@ -84,18 +84,18 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_manage_tabs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/manage_shown_tabs"/>
</RelativeLayout>
@ -106,10 +106,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_use_english"
@ -117,8 +117,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/use_english_language"
app:switchPadding="@dimen/medium_margin"/>
@ -130,10 +130,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_avoid_whats_new"
@ -141,8 +141,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/avoid_whats_new"
app:switchPadding="@dimen/medium_margin"/>
@ -154,10 +154,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_show_info_bubble"
@ -165,8 +165,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_info_bubble"
app:switchPadding="@dimen/medium_margin"/>
@ -178,10 +178,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_show_contact_thumbnails"
@ -189,8 +189,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_contact_thumbnails"
app:switchPadding="@dimen/medium_margin"/>
@ -202,10 +202,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_show_phone_numbers"
@ -213,23 +213,47 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_phone_numbers"
app:switchPadding="@dimen/medium_margin"/>
</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
android:id="@+id/settings_start_with_surname_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_start_with_surname"
@ -237,23 +261,47 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/start_name_with_surname"
app:switchPadding="@dimen/medium_margin"/>
</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
android:id="@+id/settings_filter_duplicates_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_filter_duplicates"
@ -261,8 +309,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/filter_duplicates"
app:switchPadding="@dimen/medium_margin"/>
@ -274,10 +322,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_show_call_confirmation"
@ -285,8 +333,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_call_confirmation_dialog"
app:switchPadding="@dimen/medium_margin"/>
@ -298,18 +346,18 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/bigger_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin">
android:paddingBottom="@dimen/bigger_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_on_contact_click_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+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:paddingRight="@dimen/medium_margin"
android:text="@string/on_contact_click"/>

View File

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

View File

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

View File

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

View File

@ -1,5 +1,5 @@
<?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:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/filter_contact_sources_list"

View File

@ -17,19 +17,19 @@
android:gravity="center"
android:paddingLeft="@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:visibility="gone"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/fragment_placeholder_2"
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/fragment_placeholder"
android:layout_centerHorizontal="true"
android:background="?attr/selectableItemBackground"
android:gravity="center"
android:paddingBottom="@dimen/medium_margin"
android:paddingTop="@dimen/medium_margin"
android:padding="@dimen/activity_margin"
android:text="@string/change_filter"
android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/>
@ -48,8 +48,8 @@
android:layout_height="match_parent"
android:layout_alignParentEnd="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"/>

View File

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

View File

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

View File

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

View File

@ -18,6 +18,11 @@
<string name="create_new_contact">Create new 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="edit_contact">Redaktə et</string>
<string name="select_contact">Kontakt seç</string>
@ -57,6 +62,7 @@
<string name="favorites">Sevimlilər</string>
<string name="recent_calls">Hazırki zənglər</string>
<string name="show_call_confirmation_dialog">Zəngə başlamazdan əvvəl zəng təsdiq pəncərəsi göstər</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails -->
<string name="email">E-poçt</string>

View File

@ -9,14 +9,19 @@
<string name="company">Unternehmen</string>
<string name="job_position">Arbeitsstelle</string>
<string name="website">Webseite</string>
<string name="send_sms_to_contacts">Sende SMS an Kontakte</string>
<string name="send_email_to_contacts">Sende E-Mail an Kontakte</string>
<string name="send_sms_to_group">Sende SMS an Gruppe</string>
<string name="send_email_to_group">Sende E-Mail an Gruppe</string>
<string name="send_sms_to_contacts">SMS an Kontakte senden</string>
<string name="send_email_to_contacts">E-Mail an Kontakte senden</string>
<string name="send_sms_to_group">SMS an Gruppe senden</string>
<string name="send_email_to_group">E-Mail an Gruppe senden</string>
<string name="call_person">%s anrufen</string>
<string name="request_the_required_permissions">Benötigte Berechtigungen anfordern</string>
<string name="create_new_contact">Create new contact</string>
<string name="add_to_existing_contact">Add to an existing contact</string>
<string name="create_new_contact">Neuen Kontakt erstellen</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="edit_contact">Kontakt bearbeiten</string>
@ -34,7 +39,7 @@
<string name="no_group_participants">Diese Gruppe ist leer</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="create_group">Erstelle Gruppe</string>
<string name="create_group">Gruppe erstellen</string>
<string name="add_to_group">Zu Gruppe hinzufügen</string>
<string name="create_group_under_account">Gruppe in diesem Konto erstellen</string>
@ -45,18 +50,19 @@
<!-- Settings -->
<string name="start_name_with_surname">Namen mit Nachnamen beginnen</string>
<string name="show_phone_numbers">Zeige Telefonnummern im Hauptmenü</string>
<string name="show_contact_thumbnails">Zeige Vorschaubilder der Kontakte</string>
<string name="show_phone_numbers">Telefonnummern im Hauptmenü zeigen</string>
<string name="show_contact_thumbnails">Vorschaubilder der Kontakte zeigen</string>
<string name="on_contact_click">Beim Klicken auf den Kontakt</string>
<string name="call_contact">Kontakt anrufen</string>
<string name="view_contact">Kontaktdetails anzeigen</string>
<string name="manage_shown_contact_fields">Bearbeite sichtbare Kontaktfelder</string>
<string name="filter_duplicates">Versuche Kontaktduplikate herauszufiltern</string>
<string name="manage_shown_contact_fields">Sichtbare Kontaktfelder bearbeiten</string>
<string name="filter_duplicates">Versucht Kontaktduplikate herauszufiltern</string>
<string name="manage_shown_tabs">Anzuzeigende Tabs festlegen</string>
<string name="contacts">Kontakte</string>
<string name="favorites">Favoriten</string>
<string name="recent_calls">Anrufliste</string>
<string name="show_call_confirmation_dialog">Bestätigungsdialog zeigen, bevor ein Anruf durchgeführt wird</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails -->
<string name="email">E-Mail</string>
@ -78,11 +84,11 @@
<string name="anniversary">Jahrestag</string>
<!-- 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_to_favorites">Zu Favoriten hinzufügen</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 -->
<string name="search_contacts">Kontakte durchsuchen</string>
@ -98,8 +104,8 @@
<string name="filename_without_vcf">Dateiname (ohne .vcf)</string>
<!-- Dialpad -->
<string name="dialpad">Dialpad</string>
<string name="add_number_to_contact">Add number to contact</string>
<string name="dialpad">Wählfeld</string>
<string name="add_number_to_contact">Nummer zu Kontakt hinzufügen</string>
<!-- Visible fields -->
<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="call_person">Κλήση %s</string>
<string name="request_the_required_permissions">Ζητούνται τα απαιτούμενα δικαιώματα</string>
<string name="create_new_contact">Create new contact</string>
<string name="add_to_existing_contact">Add to an existing contact</string>
<string name="create_new_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="edit_contact">Επεξεργασία επαφής</string>
@ -57,6 +62,7 @@
<string name="favorites">Αγαπημένες</string>
<string name="recent_calls">Πρόσφατες Κλήσεις</string>
<string name="show_call_confirmation_dialog">Εμφάνιση διαλόγου επιβεβαίωσης πριν από την έναρξη μιας κλήσης</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails -->
<string name="email">Email</string>
@ -98,8 +104,8 @@
<string name="filename_without_vcf">Όνομα αρχείου (χωρίς .vcf)</string>
<!-- Dialpad -->
<string name="dialpad">Dialpad</string>
<string name="add_number_to_contact">Add number to contact</string>
<string name="dialpad">Πληκτρολόγιο</string>
<string name="add_number_to_contact">Προσθήκη αριθμού σε επαφή</string>
<!-- Visible fields -->
<string name="select_fields_to_show">Επιλογή εμφάνισης πεδίων</string>
@ -114,7 +120,7 @@
<string name="websites">Ιστοσελίδα</string>
<string name="groups">Ομάδες</string>
<string name="contact_source">Προέλευση επαφής</string>
<string name="instant_messaging">Instant messaging (IM)</string>
<string name="instant_messaging">Αμεσο μήνυμα (IM)</string>
<!-- FAQ -->
<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="call_person">Call %s</string>
<string name="request_the_required_permissions">Demander les autorisations requises</string>
<string name="create_new_contact">Create new contact</string>
<string name="add_to_existing_contact">Add to an existing contact</string>
<string name="create_new_contact">Créer un nouveau 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="edit_contact">Modifier contact</string>
@ -57,6 +62,7 @@
<string name="favorites">Favorites</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_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails -->
<string name="email">E-mail</string>
@ -99,7 +105,7 @@
<!-- Dialpad -->
<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 -->
<string name="select_fields_to_show">Sélectionner les champs à afficher</string>

View File

@ -18,6 +18,11 @@
<string name="create_new_contact">Create new 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="edit_contact">Uredi kontakt</string>
<string name="select_contact">Odaberi kontakt</string>
@ -57,6 +62,7 @@
<string name="favorites">Favoriti</string>
<string name="recent_calls">Nedavni pozivi</string>
<string name="show_call_confirmation_dialog">Pokažite dijaloški okvir za potvrdu poziva prije pokretanja poziva</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails -->
<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="call_person">Call %s</string>
<string name="request_the_required_permissions">Request the required permissions</string>
<string name="create_new_contact">Create new contact</string>
<string name="add_to_existing_contact">Add to an existing contact</string>
<string name="create_new_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="edit_contact">連絡先を編集</string>
@ -57,6 +62,7 @@
<string name="favorites">お気に入り</string>
<string name="recent_calls">Recent calls</string>
<string name="show_call_confirmation_dialog">発信する前に確認ダイアログを表示する</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails -->
<string name="email">メール</string>
@ -99,7 +105,7 @@
<!-- Dialpad -->
<string name="dialpad">ダイヤルパッド</string>
<string name="add_number_to_contact">Add number to contact</string>
<string name="add_number_to_contact">連絡先に番号を追加</string>
<!-- Visible fields -->
<string name="select_fields_to_show">表示する項目を選択</string>

View File

@ -18,6 +18,11 @@
<string name="create_new_contact">Create new 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="edit_contact">연락처 수정</string>
<string name="select_contact">단건 연락처 선택</string>
@ -57,6 +62,7 @@
<string name="favorites">Favorites</string>
<string name="recent_calls">Recent calls</string>
<string name="show_call_confirmation_dialog">Show a call confirmation dialog before initiating a call</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails -->
<string name="email">이메일</string>

View File

@ -18,6 +18,11 @@
<string name="create_new_contact">Create new 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="edit_contact">Redaguoti kontaktą</string>
<string name="select_contact">Pasirinkti kontaktą</string>
@ -57,6 +62,7 @@
<string name="favorites">Favorites</string>
<string name="recent_calls">Recent calls</string>
<string name="show_call_confirmation_dialog">Show a call confirmation dialog before initiating a call</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails -->
<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="call_person">Ligar a %s</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="add_to_existing_contact">Add to an existing contact</string>
<string name="create_new_contact">Criar novo contacto</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="edit_contact">Editar contacto</string>
@ -57,6 +62,7 @@
<string name="favorites">Favoritos</string>
<string name="recent_calls">Chamadas recentes</string>
<string name="show_call_confirmation_dialog">Mostrar diálogo para confirmar a chamada</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails -->
<string name="email">E-mail</string>
@ -98,8 +104,8 @@
<string name="filename_without_vcf">Nome do ficheiro (sem .vcf)</string>
<!-- Dialpad -->
<string name="dialpad">Dialpad</string>
<string name="add_number_to_contact">Add number to contact</string>
<string name="dialpad">Teclado</string>
<string name="add_number_to_contact">Adicionar número a um contacto</string>
<!-- Visible fields -->
<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="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="edit_contact">Редактировать контакт</string>
<string name="select_contact">Выбрать контакт</string>
@ -57,6 +62,7 @@
<string name="favorites">Избранное</string>
<string name="recent_calls">Недавние вызовы</string>
<string name="show_call_confirmation_dialog">Показывать диалог подтверждения вызова</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails -->
<string name="email">Эл. почта</string>

View File

@ -18,6 +18,11 @@
<string name="create_new_contact">Vytvoriť nový kontakt</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="edit_contact">Upraviť kontakt</string>
<string name="select_contact">Zvoľte kontakt</string>
@ -57,6 +62,7 @@
<string name="favorites">Obľúbené</string>
<string name="recent_calls">Predošlé hovory</string>
<string name="show_call_confirmation_dialog">Zobraziť pred spustením hovoru okno na jeho potvrdenie</string>
<string name="show_only_contacts_with_numbers">Zobraziť iba kontakty s telefónnymi číslami</string>
<!-- Emails -->
<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="call_person">Ring %s</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="add_to_existing_contact">Add to an existing contact</string>
<string name="create_new_contact">Skapa ny kontakt</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="edit_contact">Redigera kontakt</string>
@ -57,6 +62,7 @@
<string name="favorites">Favoriter</string>
<string name="recent_calls">Senaste samtal</string>
<string name="show_call_confirmation_dialog">Visa en bekräftelsedialogruta före uppringning</string>
<string name="show_only_contacts_with_numbers">Visa bara kontakter med telefonnummer</string>
<!-- Emails -->
<string name="email">E-post</string>
@ -98,8 +104,8 @@
<string name="filename_without_vcf">Filnamn (utan .vcf)</string>
<!-- Dialpad -->
<string name="dialpad">Dialpad</string>
<string name="add_number_to_contact">Add number to contact</string>
<string name="dialpad">Knappsats</string>
<string name="add_number_to_contact">Lägg till nummer i kontakt</string>
<!-- Visible fields -->
<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="groups">Grupper</string>
<string name="contact_source">Kontaktkälla</string>
<string name="instant_messaging">Instant messaging (IM)</string>
<string name="instant_messaging">Snabbmeddelanden (IM)</string>
<!-- FAQ -->
<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="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="edit_contact">Kişiyi düzenle</string>
<string name="select_contact">Kişi seç</string>
@ -57,6 +62,7 @@
<string name="favorites">Favorites</string>
<string name="recent_calls">Recent calls</string>
<string name="show_call_confirmation_dialog">Show a call confirmation dialog before initiating a call</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails -->
<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="call_person">打電話給 %s</string>
<string name="request_the_required_permissions">請求必要的權限</string>
<string name="create_new_contact">Create new contact</string>
<string name="add_to_existing_contact">Add to an existing contact</string>
<string name="create_new_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="edit_contact">編輯聯絡人</string>
@ -25,7 +30,7 @@
<string name="first_name">名字</string>
<string name="middle_name">中間名</string>
<string name="surname">姓氏</string>
<string name="nickname">Nickname</string>
<string name="nickname">暱稱</string>
<!-- Groups -->
<string name="no_groups">沒有群組</string>
@ -57,6 +62,7 @@
<string name="favorites">我的最愛</string>
<string name="recent_calls">通話紀錄</string>
<string name="show_call_confirmation_dialog">開始通話前顯示通話確認框</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails -->
<string name="email">電子信箱</string>
@ -98,8 +104,8 @@
<string name="filename_without_vcf">檔案名稱 (不含.vcf)</string>
<!-- Dialpad -->
<string name="dialpad">Dialpad</string>
<string name="add_number_to_contact">Add number to contact</string>
<string name="dialpad">撥號畫面</string>
<string name="add_number_to_contact">添加號碼至通訊錄</string>
<!-- Visible fields -->
<string name="select_fields_to_show">選擇要顯示的欄位</string>
@ -114,7 +120,7 @@
<string name="websites">網站</string>
<string name="groups">群組</string>
<string name="contact_source">聯絡人來源</string>
<string name="instant_messaging">Instant messaging (IM)</string>
<string name="instant_messaging">即時通訊 (IM)</string>
<!-- FAQ -->
<string name="faq_1_title">我想要更改在通訊錄會看到哪些欄位。我能這麼做嗎?</string>

View File

@ -10,8 +10,10 @@
<string name="hangouts">Hangouts</string>
<string name="icq">ICQ</string>
<string name="jabber">Jabber</string>
<string name="telegram">Telegram</string>
<!-- 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_31">
Added an optional IM field\n

View File

@ -18,6 +18,11 @@
<string name="create_new_contact">Create new 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="edit_contact">Edit contact</string>
<string name="select_contact">Select contact</string>
@ -57,6 +62,7 @@
<string name="favorites">Favorites</string>
<string name="recent_calls">Recent calls</string>
<string name="show_call_confirmation_dialog">Show a call confirmation dialog before initiating a call</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<!-- Emails -->
<string name="email">Email</string>

View File

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

View File

@ -9,7 +9,7 @@ buildscript {
}
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"
// 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