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
}
dialpad_input.showSoftInputOnFocus = false
}
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())
}
@ -34,34 +34,34 @@ class ExportContactsDialog(val activity: SimpleActivity, val path: String, priva
.setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null)
.create().apply {
activity.setupDialogStuff(view, this, R.string.export_contacts) {
getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
if (view.export_contacts_list.adapter == null) {
return@setOnClickListener
}
val filename = view.export_contacts_filename.value
when {
filename.isEmpty() -> activity.toast(R.string.empty_name)
filename.isAValidFilename() -> {
val file = File(path, "$filename.vcf")
if (file.exists()) {
activity.toast(R.string.name_taken)
activity.setupDialogStuff(view, this, R.string.export_contacts) {
getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
if (view.export_contacts_list.adapter == null) {
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 filename = view.export_contacts_filename.value
when {
filename.isEmpty() -> activity.toast(R.string.empty_name)
filename.isAValidFilename() -> {
val file = File(path, "$filename.vcf")
if (file.exists()) {
activity.toast(R.string.name_taken)
return@setOnClickListener
}
val selectedSources = (view.export_contacts_list.adapter as FilterContactSourcesAdapter).getSelectedContactSources()
val selectedContactSourceNames = HashSet<String>()
selectedSources.forEach {
selectedContactSourceNames.add(if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.name)
}
callback(file, selectedContactSourceNames)
dismiss()
}
else -> activity.toast(R.string.invalid_name)
}
callback(file, selectedContactSources)
dismiss()
}
else -> activity.toast(R.string.invalid_name)
}
}
}
}
}
}

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.contacts.dialogs
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>
@ -124,12 +130,12 @@
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Une appli de contacts pour gérer vos contacts sans pubs.</string>
<string name="app_long_description">
Une appli simple pour créer et gérer vos contacts depuis n\'importe quelle source. Les contacts peuvent être stockés sur votre appareil mais aussi synchronisés via Google ou d\'autres comptes. Vous pouvez afficher vos contacts favoris dans une liste séparée.
Vous pouvez l\'utiliser pour gérer les e-mail et événements de vos contacts. Elle permet de trier/filter via de multiples paramètres, et même afficher le surnom en premier.
Aucune publicité ni de permission inutile. Elle est entièrement open source et vous permet de personnaliser les couleurs.
Une appli simple pour créer et gérer vos contacts depuis n\'importe quelle source. Les contacts peuvent être stockés sur votre appareil mais aussi synchronisés via Google ou d\'autres comptes. Vous pouvez afficher vos contacts favoris dans une liste séparée.
Vous pouvez l\'utiliser pour gérer les e-mail et événements de vos contacts. Elle permet de trier/filter via de multiples paramètres, et même afficher le surnom en premier.
Aucune publicité ni de permission inutile. Elle est entièrement open source et vous permet de personnaliser les couleurs.
Cette application fait parti d\'un groupe d\'applications. Vous pouvez trouver le reste des applis sur https://www.simplemobiletools.com
</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