diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0b682a31..c6c63253 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,86 @@
Changelog
==========
+Version 6.13.1 *(2020-10-27)*
+----------------------------
+
+ * Redesigned the View and Edit screens, use bigger contact image
+ * Added quick action buttons to Viber, WhatsApp, Telegram and Signal contacts
+ * Added some UX and translation improvements
+
+Version 6.13.0 *(2020-09-19)*
+----------------------------
+
+ * Fixed search with non UTF characters
+ * Added many smaller translation and UX improvements
+
+Version 6.12.7 *(2020-08-06)*
+----------------------------
+
+ * Do not require the Telephony hardware feature for installing the app
+ * Some translation and UX improvements
+
+Version 6.12.6 *(2020-07-18)*
+----------------------------
+
+ * Allow adding contact events without specifying a year
+ * Always show the contacts middle name after the first name
+ * Make sure groups are properly sorted by name
+
+Version 6.12.5 *(2020-07-12)*
+----------------------------
+
+ * Adding some improvements related to contacts having multiple phone numbers
+
+Version 6.12.4 *(2020-07-08)*
+----------------------------
+
+ * Adding some smaller translation, stability and UX improvements
+
+Version 6.12.3 *(2020-06-19)*
+----------------------------
+
+ * Adding some private contact handling related improvements
+
+Version 6.12.2 *(2020-06-17)*
+----------------------------
+
+ * Reverting a check at fetching contacts, let's show more contacts rather than less
+
+Version 6.12.1 *(2020-06-16)*
+----------------------------
+
+ * Properly check phone numbers at Search too
+ * Fixed a glitch with wrong contacts being listed
+
+Version 6.12.0 *(2020-06-03)*
+----------------------------
+
+ * Added sorting by full name, which is the way most people expect sorting to work
+ * Improve searching, do not reset it at opening a contact
+ * Some translation and stability improvements
+
+Version 6.11.3 *(2020-05-26)*
+----------------------------
+
+ * Properly handle call initiating
+
+Version 6.11.1 *(2020-05-25)*
+----------------------------
+
+ * Use Call action at clicking the phone icon, not just Dial
+ * Use a nicer app icon on some older Android versions
+
+Version 6.11.0 *(2020-05-23)*
+----------------------------
+
+ * All calling related functions with many improvements have been moved into the new Simple Dialer app, please get it from https://play.google.com/store/apps/details?id=com.simplemobiletools.dialer
+ * Added a toggle for accessing privately stored contacts by Simple Dialer and Simple SMS Messenger apps
+ * Removed many no longer needed permissions
+ * Lowered the minimal required OS version back to 21 (Android 5, Lollipop)
+ * Allow customizing the default tab at startup
+ * Added a couple other UI and translation improvements
+
Version 6.10.2 *(2020-05-06)*
----------------------------
diff --git a/app/build.gradle b/app/build.gradle
index 6eb98b50..d5e6548a 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -15,10 +15,10 @@ android {
defaultConfig {
applicationId "com.simplemobiletools.contacts.pro"
- minSdkVersion 23
+ minSdkVersion 21
targetSdkVersion 29
- versionCode 63
- versionName "6.10.2"
+ versionCode 77
+ versionName "6.13.1"
setProperty("archivesBaseName", "contacts")
}
@@ -57,10 +57,11 @@ android {
}
dependencies {
- implementation 'com.simplemobiletools:commons:5.28.2'
+ implementation 'com.simplemobiletools:commons:5.31.18'
implementation 'joda-time:joda-time:2.10.1'
implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.5'
implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a'
+ implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
kapt "androidx.room:room-compiler:2.2.5"
implementation "androidx.room:room-runtime:2.2.5"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9d3a040a..1cde8a1e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,31 +5,24 @@
package="com.simplemobiletools.contacts.pro"
android:installLocation="auto">
-
-
-
-
-
-
-
-
+
-
-
+
+
-
-
+ android:parentActivityName=".activities.MainActivity"
+ android:theme="@style/TranslucentTheme">
@@ -115,7 +103,8 @@
+ android:parentActivityName=".activities.MainActivity"
+ android:theme="@style/TranslucentTheme">
@@ -225,70 +214,6 @@
android:label="@string/frequently_asked_questions"
android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
- callContact = contact
- callContactAvatar = getCallContactAvatar()
- runOnUiThread {
- setupNotification()
- updateOtherPersonsInfo()
- }
- }
-
- addLockScreenFlags()
- initProximitySensor()
-
- CallManager.registerCallback(callCallback)
- updateCallState(CallManager.getState())
- }
-
- override fun onDestroy() {
- super.onDestroy()
- notificationManager.cancel(CALL_NOTIFICATION_ID)
- CallManager.unregisterCallback(callCallback)
- callTimer.cancel()
- if (proximityWakeLock?.isHeld == true) {
- proximityWakeLock!!.release()
- }
-
- if (CallManager.getState() == Call.STATE_DIALING) {
- endCall()
- }
- }
-
- override fun onBackPressed() {
- if (dialpad_wrapper.isVisible()) {
- dialpad_wrapper.beGone()
- return
- } else {
- super.onBackPressed()
- }
-
- if (CallManager.getState() == Call.STATE_DIALING) {
- endCall()
- }
- }
-
- private fun initButtons() {
- call_decline.setOnClickListener {
- endCall()
- }
-
- call_accept.setOnClickListener {
- acceptCall()
- }
-
- call_toggle_microphone.setOnClickListener {
- toggleMicrophone()
- }
-
- call_toggle_speaker.setOnClickListener {
- toggleSpeaker()
- }
-
- call_dialpad.setOnClickListener {
- toggleDialpadVisibility()
- }
-
- dialpad_close.setOnClickListener {
- dialpad_wrapper.beGone()
- }
-
- call_end.setOnClickListener {
- endCall()
- }
-
- dialpad_0_holder.setOnClickListener { dialpadPressed('0') }
- dialpad_1.setOnClickListener { dialpadPressed('1') }
- dialpad_2.setOnClickListener { dialpadPressed('2') }
- dialpad_3.setOnClickListener { dialpadPressed('3') }
- dialpad_4.setOnClickListener { dialpadPressed('4') }
- dialpad_5.setOnClickListener { dialpadPressed('5') }
- dialpad_6.setOnClickListener { dialpadPressed('6') }
- dialpad_7.setOnClickListener { dialpadPressed('7') }
- dialpad_8.setOnClickListener { dialpadPressed('8') }
- dialpad_9.setOnClickListener { dialpadPressed('9') }
-
- dialpad_0_holder.setOnLongClickListener { dialpadPressed('+'); true }
- dialpad_asterisk.setOnClickListener { dialpadPressed('*') }
- dialpad_hashtag.setOnClickListener { dialpadPressed('#') }
-
- dialpad_wrapper.setBackgroundColor(config.backgroundColor)
- arrayOf(call_toggle_microphone, call_toggle_speaker, call_dialpad, dialpad_close).forEach {
- it.applyColorFilter(config.textColor)
- }
- }
-
- private fun dialpadPressed(char: Char) {
- CallManager.keypad(char)
- dialpad_input.addCharacter(char)
- }
-
- private fun toggleSpeaker() {
- isSpeakerOn = !isSpeakerOn
- val drawable = if (isSpeakerOn) R.drawable.ic_speaker_on_vector else R.drawable.ic_speaker_off_vector
- call_toggle_speaker.setImageDrawable(getDrawable(drawable))
- audioManager.isSpeakerphoneOn = isSpeakerOn
- }
-
- private fun toggleMicrophone() {
- isMicrophoneOn = !isMicrophoneOn
- val drawable = if (isMicrophoneOn) R.drawable.ic_microphone_vector else R.drawable.ic_microphone_off_vector
- call_toggle_microphone.setImageDrawable(getDrawable(drawable))
- audioManager.isMicrophoneMute = !isMicrophoneOn
- }
-
- private fun toggleDialpadVisibility() {
- if (dialpad_wrapper.isVisible()) {
- dialpad_wrapper.beGone()
- } else {
- dialpad_wrapper.beVisible()
- }
- }
-
- private fun updateOtherPersonsInfo() {
- if (callContact == null) {
- return
- }
-
- caller_name_label.text = if (callContact!!.name.isNotEmpty()) callContact!!.name else getString(R.string.unknown_caller)
-
- if (callContactAvatar != null) {
- caller_avatar.setImageBitmap(callContactAvatar)
- }
- }
-
- private fun updateCallState(state: Int) {
- when (state) {
- Call.STATE_RINGING -> callRinging()
- Call.STATE_ACTIVE -> callStarted()
- Call.STATE_DISCONNECTED -> endCall()
- Call.STATE_CONNECTING, Call.STATE_DIALING -> initOutgoingCallUI()
- Call.STATE_SELECT_PHONE_ACCOUNT -> showPhoneAccountPicker()
- }
-
- if (state == Call.STATE_DISCONNECTED || state == Call.STATE_DISCONNECTING) {
- callTimer.cancel()
- }
-
- val statusTextId = when (state) {
- Call.STATE_RINGING -> R.string.is_calling
- Call.STATE_DIALING -> R.string.dialing
- else -> 0
- }
-
- if (statusTextId != 0) {
- call_status_label.text = getString(statusTextId)
- }
-
- setupNotification()
- }
-
- private fun acceptCall() {
- CallManager.accept()
- }
-
- private fun initOutgoingCallUI() {
- incoming_call_holder.beGone()
- ongoing_call_holder.beVisible()
- }
-
- private fun callRinging() {
- incoming_call_holder.beVisible()
- }
-
- private fun callStarted() {
- incoming_call_holder.beGone()
- ongoing_call_holder.beVisible()
- callTimer.scheduleAtFixedRate(getCallTimerUpdateTask(), 1000, 1000)
- }
-
- private fun showPhoneAccountPicker() {
- if (callContact == null || callContact!!.number.isEmpty()) {
- toast(R.string.unknown_error_occurred)
- } else {
- startCallIntent(callContact!!.number)
- }
- }
-
- private fun endCall() {
- CallManager.reject()
- if (proximityWakeLock?.isHeld == true) {
- proximityWakeLock!!.release()
- }
-
- audioManager.mode = AudioManager.MODE_NORMAL
- if (isCallEnded) {
- finish()
- return
- }
-
- isCallEnded = true
- if (callDuration > 0) {
- runOnUiThread {
- call_status_label.text = "${callDuration.getFormattedDuration()} (${getString(R.string.call_ended)})"
- Handler().postDelayed({
- finish()
- }, 3000)
- }
- } else {
- call_status_label.text = getString(R.string.call_ended)
- finish()
- }
- }
-
- private fun getCallTimerUpdateTask() = object : TimerTask() {
- override fun run() {
- callDuration++
- runOnUiThread {
- if (!isCallEnded) {
- call_status_label.text = callDuration.getFormattedDuration()
- }
- }
- }
- }
-
- @SuppressLint("NewApi")
- private val callCallback = object : Call.Callback() {
- override fun onStateChanged(call: Call, state: Int) {
- super.onStateChanged(call, state)
- updateCallState(state)
- }
- }
-
- @SuppressLint("NewApi")
- private fun addLockScreenFlags() {
- if (isOreoMr1Plus()) {
- setShowWhenLocked(true)
- setTurnScreenOn(true)
- } else {
- window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
- }
-
- if (isOreoPlus()) {
- (getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager).requestDismissKeyguard(this, null)
- } else {
- window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD)
- }
- }
-
- private fun initProximitySensor() {
- val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
- proximityWakeLock = powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "com.simplemobiletools.contacts.pro:wake_lock")
- proximityWakeLock!!.acquire(10 * MINUTE_SECONDS * 1000L)
- }
-
- @SuppressLint("NewApi")
- private fun setupNotification() {
- val callState = CallManager.getState()
- val channelId = "simple_contacts_call"
- if (isOreoPlus()) {
- val importance = NotificationManager.IMPORTANCE_DEFAULT
- val name = "call_notification_channel"
-
- NotificationChannel(channelId, name, importance).apply {
- setSound(null, null)
- notificationManager.createNotificationChannel(this)
- }
- }
-
- val openAppIntent = Intent(this, CallActivity::class.java)
- openAppIntent.flags = Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT
- val openAppPendingIntent = PendingIntent.getActivity(this, 0, openAppIntent, 0)
-
- val acceptCallIntent = Intent(this, CallActionReceiver::class.java)
- acceptCallIntent.action = ACCEPT_CALL
- val acceptPendingIntent = PendingIntent.getBroadcast(this, 0, acceptCallIntent, PendingIntent.FLAG_CANCEL_CURRENT)
-
- val declineCallIntent = Intent(this, CallActionReceiver::class.java)
- declineCallIntent.action = DECLINE_CALL
- val declinePendingIntent = PendingIntent.getBroadcast(this, 1, declineCallIntent, PendingIntent.FLAG_CANCEL_CURRENT)
-
- val callerName = if (callContact != null && callContact!!.name.isNotEmpty()) callContact!!.name else getString(R.string.unknown_caller)
- val contentTextId = when (callState) {
- Call.STATE_RINGING -> R.string.is_calling
- Call.STATE_DIALING -> R.string.dialing
- Call.STATE_DISCONNECTED -> R.string.call_ended
- Call.STATE_DISCONNECTING -> R.string.call_ending
- else -> R.string.ongoing_call
- }
-
- val collapsedView = RemoteViews(packageName, R.layout.call_notification).apply {
- setText(R.id.notification_caller_name, callerName)
- setText(R.id.notification_call_status, getString(contentTextId))
- setVisibleIf(R.id.notification_accept_call, callState == Call.STATE_RINGING)
-
- setOnClickPendingIntent(R.id.notification_decline_call, declinePendingIntent)
- setOnClickPendingIntent(R.id.notification_accept_call, acceptPendingIntent)
-
- if (callContactAvatar != null) {
- setImageViewBitmap(R.id.notification_thumbnail, getCircularBitmap(callContactAvatar!!))
- }
- }
-
- val builder = NotificationCompat.Builder(this, channelId)
- .setSmallIcon(R.drawable.ic_phone_vector)
- .setContentIntent(openAppPendingIntent)
- .setPriority(NotificationCompat.PRIORITY_DEFAULT)
- .setCategory(Notification.CATEGORY_CALL)
- .setCustomContentView(collapsedView)
- .setOngoing(true)
- .setSound(null)
- .setUsesChronometer(callState == Call.STATE_ACTIVE)
- .setChannelId(channelId)
- .setStyle(NotificationCompat.DecoratedCustomViewStyle())
-
- val notification = builder.build()
- notificationManager.notify(CALL_NOTIFICATION_ID, notification)
- }
-
- @SuppressLint("NewApi")
- private fun getCallContactAvatar(): Bitmap? {
- var bitmap: Bitmap? = null
- if (callContact?.photoUri?.isNotEmpty() == true) {
- val photoUri = Uri.parse(callContact!!.photoUri)
- bitmap = if (isQPlus()) {
- val tmbSize = resources.getDimension(R.dimen.contact_icons_size).toInt()
- contentResolver.loadThumbnail(photoUri, Size(tmbSize, tmbSize), null)
- } else {
- MediaStore.Images.Media.getBitmap(contentResolver, photoUri)
- }
-
- bitmap = getCircularBitmap(bitmap!!)
- }
-
- return bitmap
- }
-
- private fun getCircularBitmap(bitmap: Bitmap): Bitmap {
- val output = Bitmap.createBitmap(bitmap.width, bitmap.width, Bitmap.Config.ARGB_8888)
- val canvas = Canvas(output)
- val paint = Paint()
- val rect = Rect(0, 0, bitmap.width, bitmap.height)
- val radius = bitmap.width / 2.toFloat()
-
- paint.isAntiAlias = true
- canvas.drawARGB(0, 0, 0, 0)
- canvas.drawCircle(radius, radius, radius, paint)
- paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
- canvas.drawBitmap(bitmap, rect, rect, paint)
- return output
- }
-}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt
index fe03b1cb..681458bd 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt
@@ -1,11 +1,14 @@
package com.simplemobiletools.contacts.pro.activities
import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.graphics.Paint
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.provider.ContactsContract.CommonDataKinds.*
import android.widget.ImageView
+import android.widget.TextView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.DiskCacheStrategy
@@ -16,7 +19,8 @@ import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.Target
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
-import com.simplemobiletools.commons.helpers.SimpleContactsHelper
+import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.letterBackgroundColors
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.extensions.sendEmailIntent
@@ -31,35 +35,41 @@ abstract class ContactActivity : SimpleActivity() {
protected var currentContactPhotoPath = ""
fun showPhotoPlaceholder(photoView: ImageView) {
- val placeholder = BitmapDrawable(resources, SimpleContactsHelper(this).getContactLetterIcon(contact?.getNameToDisplay() ?: "A"))
+ val placeholder = BitmapDrawable(resources, getBigLetterPlaceholder(contact?.getNameToDisplay() ?: "A"))
photoView.setImageDrawable(placeholder)
currentContactPhotoPath = ""
contact?.photo = null
}
- fun updateContactPhoto(path: String, photoView: ImageView, bitmap: Bitmap? = null) {
+ fun updateContactPhoto(path: String, photoView: ImageView, bottomShadow: ImageView, bitmap: Bitmap? = null) {
currentContactPhotoPath = path
- val options = RequestOptions()
- .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
- .centerCrop()
if (isDestroyed || isFinishing) {
return
}
+ val options = RequestOptions()
+ .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
+ .centerCrop()
+
+ val wantedWidth = realScreenSize.x
+ val wantedHeight = resources.getDimension(R.dimen.top_contact_image_height).toInt()
+
Glide.with(this)
.load(bitmap ?: path)
.transition(DrawableTransitionOptions.withCrossFade())
.apply(options)
- .apply(RequestOptions.circleCropTransform())
+ .override(wantedWidth, wantedHeight)
.listener(object : RequestListener {
override fun onResourceReady(resource: Drawable?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
photoView.background = ColorDrawable(0)
+ bottomShadow.beVisible()
return false
}
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean {
showPhotoPlaceholder(photoView)
+ bottomShadow.beGone()
return true
}
}).into(photoView)
@@ -111,23 +121,6 @@ abstract class ContactActivity : SimpleActivity() {
}
}
- fun getPhoneNumberTypeText(type: Int, label: String): String {
- return if (type == BaseTypes.TYPE_CUSTOM) {
- label
- } else {
- getString(when (type) {
- Phone.TYPE_MOBILE -> R.string.mobile
- Phone.TYPE_HOME -> R.string.home
- Phone.TYPE_WORK -> R.string.work
- Phone.TYPE_MAIN -> R.string.main_number
- Phone.TYPE_FAX_WORK -> R.string.work_fax
- Phone.TYPE_FAX_HOME -> R.string.home_fax
- Phone.TYPE_PAGER -> R.string.pager
- else -> R.string.other
- })
- }
- }
-
fun getEmailTypeText(type: Int, label: String): String {
return if (type == BaseTypes.TYPE_CUSTOM) {
label
@@ -175,4 +168,35 @@ abstract class ContactActivity : SimpleActivity() {
Event.TYPE_BIRTHDAY -> R.string.birthday
else -> R.string.other
}
+
+ private fun getBigLetterPlaceholder(name: String): Bitmap {
+ val letter = name.getNameLetter()
+ val height = resources.getDimension(R.dimen.top_contact_image_height).toInt()
+ val bitmap = Bitmap.createBitmap(realScreenSize.x, height, Bitmap.Config.ARGB_8888)
+ val canvas = Canvas(bitmap)
+ val view = TextView(this)
+ view.layout(0, 0, bitmap.width, bitmap.height)
+
+ val circlePaint = Paint().apply {
+ color = letterBackgroundColors[Math.abs(name.hashCode()) % letterBackgroundColors.size].toInt()
+ isAntiAlias = true
+ style = Paint.Style.FILL
+ }
+
+ val wantedTextSize = bitmap.height / 2f
+ val textPaint = Paint().apply {
+ color = circlePaint.color.getContrastColor()
+ isAntiAlias = true
+ textAlign = Paint.Align.CENTER
+ textSize = wantedTextSize
+ }
+
+ canvas.drawPaint(circlePaint)
+
+ val xPos = canvas.width / 2f
+ val yPos = canvas.height / 2 - (textPaint.descent() + textPaint.ascent()) / 2
+ canvas.drawText(letter, xPos, yPos, textPaint)
+ view.draw(canvas)
+ return bitmap
+ }
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt
deleted file mode 100644
index 7d3b1a78..00000000
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.simplemobiletools.contacts.pro.activities
-
-import android.annotation.SuppressLint
-import android.content.Intent
-import android.net.Uri
-import android.os.Bundle
-import android.telecom.TelecomManager
-import android.view.Menu
-import com.simplemobiletools.commons.extensions.isDefaultDialer
-import com.simplemobiletools.commons.extensions.showErrorToast
-import com.simplemobiletools.commons.extensions.telecomManager
-import com.simplemobiletools.commons.extensions.toast
-import com.simplemobiletools.commons.helpers.REQUEST_CODE_SET_DEFAULT_DIALER
-import com.simplemobiletools.contacts.pro.R
-import com.simplemobiletools.contacts.pro.extensions.getHandleToUse
-
-class DialerActivity : SimpleActivity() {
- private var callNumber: Uri? = null
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
-
- if (intent.action == Intent.ACTION_CALL && intent.data != null) {
- callNumber = intent.data
-
- // make sure Simple Contacts is the default Phone app before initiating an outgoing call
- if (!isDefaultDialer()) {
- launchSetDefaultDialerIntent()
- } else {
- initOutgoingCall()
- }
- } else {
- toast(R.string.unknown_error_occurred)
- finish()
- }
- }
-
- override fun onCreateOptionsMenu(menu: Menu): Boolean {
- updateMenuItemColors(menu)
- return super.onCreateOptionsMenu(menu)
- }
-
- @SuppressLint("MissingPermission")
- private fun initOutgoingCall() {
- try {
- getHandleToUse(intent, callNumber.toString()) { handle ->
- Bundle().apply {
- putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, handle)
- putBoolean(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, false)
- putBoolean(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, false)
- telecomManager.placeCall(callNumber, this)
- }
- finish()
- }
- } catch (e: Exception) {
- showErrorToast(e)
- finish()
- }
- }
-
- override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
- super.onActivityResult(requestCode, resultCode, resultData)
- if (requestCode == REQUEST_CODE_SET_DEFAULT_DIALER) {
- if (!isDefaultDialer()) {
- finish()
- } else {
- initOutgoingCall()
- }
- }
- }
-}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialpadActivity.kt
deleted file mode 100644
index 45562442..00000000
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialpadActivity.kt
+++ /dev/null
@@ -1,228 +0,0 @@
-package com.simplemobiletools.contacts.pro.activities
-
-import android.annotation.TargetApi
-import android.content.Intent
-import android.graphics.Color
-import android.net.Uri
-import android.os.Build
-import android.os.Bundle
-import android.provider.Telephony.Sms.Intents.SECRET_CODE_ACTION
-import android.telephony.PhoneNumberUtils
-import android.telephony.TelephonyManager
-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.KEY_PHONE
-import com.simplemobiletools.commons.helpers.REQUEST_CODE_SET_DEFAULT_DIALER
-import com.simplemobiletools.commons.helpers.isOreoPlus
-import com.simplemobiletools.contacts.pro.R
-import com.simplemobiletools.contacts.pro.adapters.ContactsAdapter
-import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog
-import com.simplemobiletools.contacts.pro.extensions.*
-import com.simplemobiletools.contacts.pro.helpers.ContactsHelper
-import com.simplemobiletools.contacts.pro.helpers.LOCATION_DIALPAD
-import com.simplemobiletools.contacts.pro.models.Contact
-import com.simplemobiletools.contacts.pro.models.SpeedDial
-import kotlinx.android.synthetic.main.activity_dialpad.*
-import kotlinx.android.synthetic.main.activity_dialpad.dialpad_holder
-import kotlinx.android.synthetic.main.dialpad.*
-
-class DialpadActivity : SimpleActivity() {
- private var contacts = ArrayList()
- private var speedDialValues = ArrayList()
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_dialpad)
-
- if (checkAppSideloading()) {
- return
- }
-
- speedDialValues = config.getSpeedDialValues()
-
- dialpad_0_holder.setOnClickListener { dialpadPressed('0', it) }
- dialpad_1.setOnClickListener { dialpadPressed('1', it) }
- dialpad_2.setOnClickListener { dialpadPressed('2', it) }
- dialpad_3.setOnClickListener { dialpadPressed('3', it) }
- dialpad_4.setOnClickListener { dialpadPressed('4', it) }
- dialpad_5.setOnClickListener { dialpadPressed('5', it) }
- dialpad_6.setOnClickListener { dialpadPressed('6', it) }
- dialpad_7.setOnClickListener { dialpadPressed('7', it) }
- dialpad_8.setOnClickListener { dialpadPressed('8', it) }
- dialpad_9.setOnClickListener { dialpadPressed('9', it) }
-
- dialpad_1.setOnLongClickListener { speedDial(1); true }
- dialpad_2.setOnLongClickListener { speedDial(2); true }
- dialpad_3.setOnLongClickListener { speedDial(3); true }
- dialpad_4.setOnLongClickListener { speedDial(4); true }
- dialpad_5.setOnLongClickListener { speedDial(5); true }
- dialpad_6.setOnLongClickListener { speedDial(6); true }
- dialpad_7.setOnLongClickListener { speedDial(7); true }
- dialpad_8.setOnLongClickListener { speedDial(8); true }
- dialpad_9.setOnLongClickListener { speedDial(9); true }
-
- dialpad_0_holder.setOnLongClickListener { dialpadPressed('+', null); true }
- dialpad_asterisk.setOnClickListener { dialpadPressed('*', it) }
- dialpad_hashtag.setOnClickListener { dialpadPressed('#', it) }
- dialpad_clear_char.setOnClickListener { clearChar(it) }
- dialpad_clear_char.setOnLongClickListener { clearInput(); true }
- dialpad_call_button.setOnClickListener { initCall() }
- dialpad_input.onTextChangeListener { dialpadValueChanged(it) }
- ContactsHelper(this).getContacts { gotContacts(it) }
- disableKeyboardPopping()
-
- val callIcon = resources.getColoredDrawableWithColor(R.drawable.ic_phone_vector, if (isBlackAndWhiteTheme()) Color.BLACK else config.primaryColor.getContrastColor())
- dialpad_call_button.setImageDrawable(callIcon)
- dialpad_call_button.background.applyColorFilter(getAdjustedPrimaryColor())
-
- val showLetters = config.showDialpadLetters
- arrayOf(dialpad_2_letters, dialpad_3_letters, dialpad_4_letters, dialpad_5_letters, dialpad_6_letters, dialpad_7_letters, dialpad_8_letters, dialpad_9_letters).forEach {
- it.beVisibleIf(showLetters)
- }
- }
-
- override fun onResume() {
- super.onResume()
- updateTextColors(dialpad_holder)
- dialpad_clear_char.applyColorFilter(config.textColor)
- }
-
- override fun onCreateOptionsMenu(menu: Menu): Boolean {
- menuInflater.inflate(R.menu.menu_dialpad, menu)
- updateMenuItemColors(menu)
- return true
- }
-
- override fun onOptionsItemSelected(item: MenuItem): Boolean {
- when (item.itemId) {
- R.id.add_number_to_contact -> addNumberToContact()
- else -> return super.onOptionsItemSelected(item)
- }
- return true
- }
-
- private fun checkDialIntent(): Boolean {
- return if (intent.action == Intent.ACTION_DIAL && intent.data != null && intent.dataString?.contains("tel:") == true) {
- val number = Uri.decode(intent.dataString).substringAfter("tel:")
- dialpad_input.setText(number)
- dialpad_input.setSelection(number.length)
- true
- } else {
- false
- }
- }
-
- private fun addNumberToContact() {
- Intent().apply {
- action = Intent.ACTION_INSERT_OR_EDIT
- type = "vnd.android.cursor.item/contact"
- putExtra(KEY_PHONE, dialpad_input.value)
- if (resolveActivity(packageManager) != null) {
- startActivity(this)
- } else {
- toast(R.string.no_app_found)
- }
- }
- }
-
- private fun dialpadPressed(char: Char, view: View?) {
- dialpad_input.addCharacter(char)
- view?.performHapticFeedback()
- }
-
- private fun clearChar(view: View) {
- dialpad_input.dispatchKeyEvent(dialpad_input.getKeyEvent(KeyEvent.KEYCODE_DEL))
- view.performHapticFeedback()
- }
-
- private fun clearInput() {
- dialpad_input.setText("")
- }
-
- private fun disableKeyboardPopping() {
- dialpad_input.showSoftInputOnFocus = false
- }
-
- private fun gotContacts(newContacts: ArrayList) {
- contacts = newContacts
- if (!checkDialIntent() && dialpad_input.value.isEmpty()) {
- dialpadValueChanged("")
- }
- }
-
- @TargetApi(Build.VERSION_CODES.O)
- private fun dialpadValueChanged(text: String) {
- val len = text.length
- if (len > 8 && text.startsWith("*#*#") && text.endsWith("#*#*")) {
- val secretCode = text.substring(4, text.length - 4)
- if (isOreoPlus()) {
- if (isDefaultDialer()) {
- getSystemService(TelephonyManager::class.java)?.sendDialerSpecialCode(secretCode)
- } else {
- launchSetDefaultDialerIntent()
- }
- } else {
- val intent = Intent(SECRET_CODE_ACTION, Uri.parse("android_secret_code://$secretCode"))
- sendBroadcast(intent)
- }
- return
- }
-
- val showLetters = config.showDialpadLetters
- (dialpad_list.adapter as? ContactsAdapter)?.finishActMode()
- val filtered = contacts.filter {
- val convertedName = PhoneNumberUtils.convertKeypadLettersToDigits(it.getNameToDisplay().normalizeString())
- val company = PhoneNumberUtils.convertKeypadLettersToDigits(it.getFullCompany().normalizeString())
- it.doesContainPhoneNumber(text, showLetters) || (showLetters && (convertedName.contains(text, true) || company.contains(text, true)))
- }.sortedWith(compareBy {
- if (showLetters) {
- !it.doesContainPhoneNumber(text, showLetters)
- } else {
- true
- }
- }).toMutableList() as ArrayList
-
- ContactsAdapter(this, filtered, null, LOCATION_DIALPAD, null, dialpad_list, dialpad_fastscroller, text) {
- callContact(it as Contact)
- }.apply {
- dialpad_list.adapter = this
- }
-
- dialpad_fastscroller.setScrollToY(0)
- dialpad_fastscroller.setViews(dialpad_list) {
- val item = (dialpad_list.adapter as ContactsAdapter).contactItems.getOrNull(it)
- dialpad_fastscroller.updateBubbleText(item?.getBubbleText() ?: "")
- }
- }
-
- override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
- super.onActivityResult(requestCode, resultCode, resultData)
- if (requestCode == REQUEST_CODE_SET_DEFAULT_DIALER && isDefaultDialer()) {
- dialpadValueChanged(dialpad_input.value)
- }
- }
-
- private fun initCall(number: String = dialpad_input.value) {
- if (number.isNotEmpty()) {
- if (config.showCallConfirmation) {
- CallConfirmationDialog(this, number) {
- startCallIntent(number)
- }
- } else {
- startCallIntent(number)
- }
- }
- }
-
- private fun speedDial(id: Int) {
- if (dialpad_input.value.isEmpty()) {
- val speedDial = speedDialValues.firstOrNull { it.id == id }
- if (speedDial?.isValid() == true) {
- initCall(speedDial.number)
- }
- }
- }
-}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt
index e95350fa..60be1956 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt
@@ -1,31 +1,31 @@
package com.simplemobiletools.contacts.pro.activities
import android.app.Activity
-import android.app.DatePickerDialog
import android.content.ClipData
import android.content.ContentValues
import android.content.Intent
import android.graphics.Bitmap
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
import android.net.Uri
import android.os.Bundle
import android.provider.ContactsContract.CommonDataKinds
import android.provider.ContactsContract.CommonDataKinds.*
import android.provider.MediaStore
-import android.view.Menu
-import android.view.MenuItem
+import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.EditText
import android.widget.ImageView
+import android.widget.RelativeLayout
import android.widget.TextView
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
-import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
-import com.simplemobiletools.commons.helpers.ensureBackgroundThread
+import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.dialogs.CustomLabelDialog
+import com.simplemobiletools.contacts.pro.dialogs.MyDatePickerDialog
import com.simplemobiletools.contacts.pro.dialogs.SelectGroupsDialog
import com.simplemobiletools.contacts.pro.extensions.*
import com.simplemobiletools.contacts.pro.helpers.*
@@ -41,8 +41,6 @@ import kotlinx.android.synthetic.main.item_edit_im.view.*
import kotlinx.android.synthetic.main.item_edit_phone_number.view.*
import kotlinx.android.synthetic.main.item_edit_website.view.*
import kotlinx.android.synthetic.main.item_event.view.*
-import org.joda.time.DateTime
-import org.joda.time.format.DateTimeFormat
class EditContactActivity : ContactActivity() {
private val INTENT_TAKE_PHOTO = 1
@@ -64,6 +62,7 @@ class EditContactActivity : ContactActivity() {
private var originalContactSource = ""
override fun onCreate(savedInstanceState: Bundle?) {
+ showTransparentTop = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_edit_contact)
@@ -71,6 +70,9 @@ class EditContactActivity : ContactActivity() {
return
}
+ contact_wrapper.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+ setupMenu()
+
val action = intent.action
isThirdPartyIntent = action == Intent.ACTION_EDIT || action == Intent.ACTION_INSERT || action == ADD_NEW_CONTACT_NUMBER
val isFromSimpleContacts = intent.getBooleanExtra(IS_FROM_SIMPLE_CONTACTS, false)
@@ -95,39 +97,12 @@ class EditContactActivity : ContactActivity() {
}
}
- override fun onCreateOptionsMenu(menu: Menu): Boolean {
- menuInflater.inflate(R.menu.menu_edit_contact, menu)
- if (wasActivityInitialized) {
- menu.findItem(R.id.delete).isVisible = contact?.id != 0
- menu.findItem(R.id.share).isVisible = contact?.id != 0
- menu.findItem(R.id.open_with).isVisible = contact?.id != 0 && contact?.isPrivate() == false
- }
-
- updateMenuItemColors(menu, true)
- return true
- }
-
- override fun onOptionsItemSelected(item: MenuItem): Boolean {
- if (contact == null) {
- return true
- }
-
- when (item.itemId) {
- R.id.save -> saveContact()
- R.id.share -> shareContact(contact!!)
- R.id.open_with -> openWith()
- R.id.delete -> deleteContact()
- else -> return super.onOptionsItemSelected(item)
- }
- return true
- }
-
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
super.onActivityResult(requestCode, resultCode, resultData)
if (resultCode == RESULT_OK) {
when (requestCode) {
INTENT_TAKE_PHOTO, INTENT_CHOOSE_PHOTO -> startCropPhotoIntent(lastPhotoIntentUri, resultData?.data)
- INTENT_CROP_PHOTO -> updateContactPhoto(lastPhotoIntentUri.toString(), contact_photo)
+ INTENT_CROP_PHOTO -> updateContactPhoto(lastPhotoIntentUri.toString(), contact_photo, contact_photo_bottom_shadow)
}
}
}
@@ -209,20 +184,17 @@ class EditContactActivity : ContactActivity() {
}
setupTypePickers()
- contact_send_sms.beVisibleIf(contact!!.phoneNumbers.isNotEmpty())
- contact_start_call.beVisibleIf(contact!!.phoneNumbers.isNotEmpty())
- contact_send_email.beVisibleIf(contact!!.emails.isNotEmpty())
if (contact!!.photoUri.isEmpty() && contact!!.photo == null) {
showPhotoPlaceholder(contact_photo)
+ contact_photo_bottom_shadow.beGone()
} else {
- updateContactPhoto(contact!!.photoUri, contact_photo, contact!!.photo)
+ updateContactPhoto(contact!!.photoUri, contact_photo, contact_photo_bottom_shadow, contact!!.photo)
}
val textColor = config.textColor
- arrayOf(contact_send_sms, contact_start_call, contact_send_email, contact_name_image, contact_numbers_image, contact_emails_image, contact_addresses_image,
- contact_ims_image, contact_events_image, contact_notes_image, contact_organization_image, contact_websites_image, contact_groups_image,
- contact_source_image).forEach {
+ arrayOf(contact_name_image, contact_numbers_image, contact_emails_image, contact_addresses_image, contact_ims_image, contact_events_image,
+ contact_notes_image, contact_organization_image, contact_websites_image, contact_groups_image, contact_source_image).forEach {
it.applyColorFilter(textColor)
}
@@ -239,9 +211,7 @@ class EditContactActivity : ContactActivity() {
contact_toggle_favorite.setOnClickListener { toggleFavorite() }
contact_photo.setOnClickListener { trySetPhoto() }
- contact_send_sms.setOnClickListener { trySendSMS() }
- contact_start_call.setOnClickListener { tryStartCall(contact!!) }
- contact_send_email.setOnClickListener { trySendEmail() }
+ contact_change_photo.setOnClickListener { trySetPhoto() }
contact_numbers_add_new.setOnClickListener { addNewPhoneNumberField() }
contact_emails_add_new.setOnClickListener { addNewEmailField() }
contact_addresses_add_new.setOnClickListener { addNewAddressField() }
@@ -256,14 +226,47 @@ class EditContactActivity : ContactActivity() {
contact_toggle_favorite.apply {
setImageDrawable(getStarDrawable(contact!!.starred == 1))
tag = contact!!.starred
- applyColorFilter(textColor)
}
updateTextColors(contact_scrollview)
numberViewToColor?.setTextColor(adjustedPrimaryColor)
emailViewToColor?.setTextColor(adjustedPrimaryColor)
wasActivityInitialized = true
- invalidateOptionsMenu()
+
+ contact_toolbar.menu.apply {
+ findItem(R.id.delete).isVisible = contact?.id != 0
+ findItem(R.id.share).isVisible = contact?.id != 0
+ findItem(R.id.open_with).isVisible = contact?.id != 0 && contact?.isPrivate() == false
+ }
+ }
+
+ private fun setupMenu() {
+ (contact_appbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
+ contact_toolbar.menu.apply {
+ findItem(R.id.save).setOnMenuItemClickListener {
+ saveContact()
+ true
+ }
+
+ findItem(R.id.share).setOnMenuItemClickListener {
+ shareContact(contact!!)
+ true
+ }
+
+ findItem(R.id.open_with).setOnMenuItemClickListener {
+ openWith()
+ true
+ }
+
+ findItem(R.id.delete).setOnMenuItemClickListener {
+ deleteContact()
+ true
+ }
+ }
+
+ contact_toolbar.setNavigationOnClickListener {
+ finish()
+ }
}
private fun openWith() {
@@ -691,19 +694,13 @@ class EditContactActivity : ContactActivity() {
val eventField = eventHolder.contact_event
eventField.setOnClickListener {
- val setDateListener = DatePickerDialog.OnDateSetListener { view, year, monthOfYear, dayOfMonth ->
- eventHolder.contact_event_remove.beVisible()
- val date = DateTime().withDate(year, monthOfYear + 1, dayOfMonth).withTimeAtStartOfDay()
- val formatted = date.toString(DateTimeFormat.mediumDate())
+ MyDatePickerDialog(this, eventField.tag?.toString() ?: "") { dateTag ->
eventField.apply {
- text = formatted
- tag = date.toString("yyyy-MM-dd")
+ dateTag.getDateTimeFromDateString(this)
+ tag = dateTag
alpha = 1f
}
}
-
- val date = (eventField.tag?.toString() ?: "").getDateTimeFromDateString()
- DatePickerDialog(this, getDialogTheme(), setDateListener, date.year, date.monthOfYear - 1, date.dayOfMonth).show()
}
eventHolder.contact_event_remove.apply {
@@ -1126,7 +1123,10 @@ class EditContactActivity : ContactActivity() {
when (it as Int) {
TAKE_PHOTO -> startTakePhotoIntent()
CHOOSE_PHOTO -> startChoosePhotoIntent()
- else -> showPhotoPlaceholder(contact_photo)
+ else -> {
+ showPhotoPlaceholder(contact_photo)
+ contact_photo_bottom_shadow.beGone()
+ }
}
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt
index 6710812a..4787df2b 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt
@@ -13,10 +13,7 @@ import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat
import androidx.viewpager.widget.ViewPager
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.KEY_PHONE
-import com.simplemobiletools.commons.helpers.PERMISSION_GET_ACCOUNTS
-import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
-import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
+import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.adapters.ViewPagerAdapter
import com.simplemobiletools.contacts.pro.dialogs.ChangeSortingDialog
@@ -39,8 +36,8 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener {
private var searchMenuItem: MenuItem? = null
private val contactsFavoritesList = arrayListOf(
- CONTACTS_TAB_MASK,
- FAVORITES_TAB_MASK
+ TAB_CONTACTS,
+ TAB_FAVORITES
)
override fun onCreate(savedInstanceState: Bundle?) {
@@ -133,7 +130,7 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener {
insert_or_edit_tabs_holder.removeAllTabs()
var skippedTabs = 0
contactsFavoritesList.forEachIndexed { index, value ->
- if (config.showTabs and value == 0 && value == FAVORITES_TAB_MASK) {
+ if (config.showTabs and value == 0 && value == TAB_FAVORITES) {
skippedTabs++
} else {
val tab = insert_or_edit_tabs_holder.newTab().setIcon(getTabIcon(index))
@@ -220,11 +217,11 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener {
return@getContacts
}
- if (refreshTabsMask and CONTACTS_TAB_MASK != 0) {
+ if (refreshTabsMask and TAB_CONTACTS != 0) {
contacts_fragment?.refreshContacts(contacts)
}
- if (refreshTabsMask and FAVORITES_TAB_MASK != 0) {
+ if (refreshTabsMask and TAB_FAVORITES != 0) {
favorites_fragment?.refreshContacts(contacts)
}
}
@@ -298,9 +295,9 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener {
}
fun getTabsMask(): Int {
- var mask = CONTACTS_TAB_MASK
- if (config.showTabs and FAVORITES_TAB_MASK != 0) {
- mask += FAVORITES_TAB_MASK
+ var mask = TAB_CONTACTS
+ if (config.showTabs and TAB_FAVORITES != 0) {
+ mask += TAB_FAVORITES
}
return mask
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt
index b569dce4..62df76f0 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt
@@ -6,7 +6,6 @@ import android.app.SearchManager
import android.content.Context
import android.content.Intent
import android.content.pm.ShortcutInfo
-import android.content.pm.ShortcutManager
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Icon
import android.graphics.drawable.LayerDrawable
@@ -35,8 +34,10 @@ import com.simplemobiletools.contacts.pro.extensions.config
import com.simplemobiletools.contacts.pro.extensions.getTempFile
import com.simplemobiletools.contacts.pro.extensions.handleGenericContactClick
import com.simplemobiletools.contacts.pro.fragments.MyViewPagerFragment
-import com.simplemobiletools.contacts.pro.helpers.*
+import com.simplemobiletools.contacts.pro.helpers.ALL_TABS_MASK
import com.simplemobiletools.contacts.pro.helpers.ContactsHelper
+import com.simplemobiletools.contacts.pro.helpers.VcfExporter
+import com.simplemobiletools.contacts.pro.helpers.tabsList
import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener
import com.simplemobiletools.contacts.pro.models.Contact
import kotlinx.android.synthetic.main.activity_main.*
@@ -57,7 +58,6 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
private var isFirstResume = true
private var isGettingContacts = false
private var ignoredExportContactSources = HashSet()
- private var handledShowTabs = 0
private var storedTextColor = 0
private var storedBackgroundColor = 0
@@ -73,9 +73,9 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
setContentView(R.layout.activity_main)
appLaunched(BuildConfig.APPLICATION_ID)
+ storeStateVariables()
setupTabColors()
checkContactPermissions()
- storeStateVariables()
checkWhatsNewDialog()
}
@@ -172,7 +172,6 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
isFirstResume = false
checkShortcuts()
- invalidateOptionsMenu()
}
override fun onPause() {
@@ -180,11 +179,6 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
storeStateVariables()
}
- override fun onStop() {
- super.onStop()
- searchMenuItem?.collapseActionView()
- }
-
override fun onDestroy() {
super.onDestroy()
config.lastUsedViewPagerPage = viewpager.currentItem
@@ -228,8 +222,12 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
if (requestCode == PICK_IMPORT_SOURCE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) {
tryImportContactsFromFile(resultData.data!!)
} else if (requestCode == PICK_EXPORT_FILE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) {
- val outputStream = contentResolver.openOutputStream(resultData.data!!)
- exportContactsTo(ignoredExportContactSources, outputStream)
+ try {
+ val outputStream = contentResolver.openOutputStream(resultData.data!!)
+ exportContactsTo(ignoredExportContactSources, outputStream)
+ } catch (e: Exception) {
+ showErrorToast(e)
+ }
}
}
@@ -294,35 +292,16 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
private fun checkShortcuts() {
val appIconColor = config.appIconColor
if (isNougatMR1Plus() && config.lastHandledShortcutColor != appIconColor) {
- val launchDialpad = getLaunchDialpadShortcut(appIconColor)
val createNewContact = getCreateNewContactShortcut(appIconColor)
- val manager = getSystemService(ShortcutManager::class.java)
try {
- manager.dynamicShortcuts = Arrays.asList(launchDialpad, createNewContact)
+ shortcutManager.dynamicShortcuts = Arrays.asList(createNewContact)
config.lastHandledShortcutColor = appIconColor
} catch (ignored: Exception) {
}
}
}
- @SuppressLint("NewApi")
- private fun getLaunchDialpadShortcut(appIconColor: Int): ShortcutInfo {
- val newEvent = getString(R.string.dialpad)
- val drawable = resources.getDrawable(R.drawable.shortcut_dialpad)
- (drawable as LayerDrawable).findDrawableByLayerId(R.id.shortcut_dialpad_background).applyColorFilter(appIconColor)
- val bmp = drawable.convertToBitmap()
-
- val intent = Intent(this, DialpadActivity::class.java)
- intent.action = Intent.ACTION_VIEW
- return ShortcutInfo.Builder(this, "launch_dialpad")
- .setShortLabel(newEvent)
- .setLongLabel(newEvent)
- .setIcon(Icon.createWithBitmap(bmp))
- .setIntent(intent)
- .build()
- }
-
@SuppressLint("NewApi")
private fun getCreateNewContactShortcut(appIconColor: Int): ShortcutInfo {
val newEvent = getString(R.string.create_new_contact)
@@ -343,15 +322,15 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
private fun getCurrentFragment(): MyViewPagerFragment? {
val showTabs = config.showTabs
val fragments = arrayListOf()
- if (showTabs and CONTACTS_TAB_MASK != 0) {
+ if (showTabs and TAB_CONTACTS != 0) {
fragments.add(contacts_fragment)
}
- if (showTabs and FAVORITES_TAB_MASK != 0) {
+ if (showTabs and TAB_FAVORITES != 0) {
fragments.add(favorites_fragment)
}
- if (showTabs and GROUPS_TAB_MASK != 0) {
+ if (showTabs and TAB_GROUPS != 0) {
fragments.add(groups_fragment)
}
@@ -359,8 +338,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
}
private fun setupTabColors() {
- handledShowTabs = config.showTabs
- val lastUsedPage = config.lastUsedViewPagerPage
+ val lastUsedPage = getDefaultTab()
main_tabs_holder.apply {
background = ColorDrawable(config.backgroundColor)
setSelectedTabIndicatorColor(getAdjustedPrimaryColor())
@@ -426,14 +404,14 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
skippedTabs++
} else {
val tab = main_tabs_holder.newTab().setIcon(getTabIcon(index))
- main_tabs_holder.addTab(tab, index - skippedTabs, config.lastUsedViewPagerPage == index - skippedTabs)
+ main_tabs_holder.addTab(tab, index - skippedTabs, getDefaultTab() == index - skippedTabs)
}
}
// selecting the proper tab sometimes glitches, add an extra selector to make sure we have it right
main_tabs_holder.onGlobalLayout {
Handler().postDelayed({
- main_tabs_holder.getTabAt(config.lastUsedViewPagerPage)?.select()
+ main_tabs_holder.getTabAt(getDefaultTab())?.select()
invalidateOptionsMenu()
}, 100L)
}
@@ -447,20 +425,25 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
private fun showSortingDialog() {
ChangeSortingDialog(this) {
- refreshContacts(CONTACTS_TAB_MASK or FAVORITES_TAB_MASK)
+ refreshContacts(TAB_CONTACTS or TAB_FAVORITES)
}
}
fun showFilterDialog() {
FilterContactSourcesDialog(this) {
contacts_fragment?.forceListRedraw = true
- refreshContacts(CONTACTS_TAB_MASK or FAVORITES_TAB_MASK)
+ refreshContacts(TAB_CONTACTS or TAB_FAVORITES)
}
}
private fun launchDialpad() {
- val intent = Intent(applicationContext, DialpadActivity::class.java)
- startActivity(intent)
+ Intent(Intent.ACTION_DIAL).apply {
+ if (resolveActivity(packageManager) != null) {
+ startActivity(this)
+ } else {
+ toast(R.string.no_app_found)
+ }
+ }
}
private fun tryImportContacts() {
@@ -567,14 +550,15 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
FAQItem(R.string.faq_1_title, R.string.faq_1_text),
FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons),
FAQItem(R.string.faq_6_title_commons, R.string.faq_6_text_commons),
- FAQItem(R.string.faq_7_title_commons, R.string.faq_7_text_commons)
+ FAQItem(R.string.faq_7_title_commons, R.string.faq_7_text_commons),
+ FAQItem(R.string.faq_9_title_commons, R.string.faq_9_text_commons)
)
startAboutActivity(R.string.app_name, licenses, BuildConfig.VERSION_NAME, faqItems, true)
}
override fun refreshContacts(refreshTabsMask: Int) {
- if (isDestroyed || isFinishing || isGettingContacts) {
+ if (isDestroyed || isFinishing || isGettingContacts || isSearchOpen) {
return
}
@@ -582,7 +566,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
if (viewpager.adapter == null) {
viewpager.adapter = ViewPagerAdapter(this, tabsList, config.showTabs)
- viewpager.currentItem = config.lastUsedViewPagerPage
+ viewpager.currentItem = getDefaultTab()
}
ContactsHelper(this).getContacts { contacts ->
@@ -591,16 +575,16 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
return@getContacts
}
- if (refreshTabsMask and CONTACTS_TAB_MASK != 0) {
+ if (refreshTabsMask and TAB_CONTACTS != 0) {
contacts_fragment?.refreshContacts(contacts)
}
- if (refreshTabsMask and FAVORITES_TAB_MASK != 0) {
+ if (refreshTabsMask and TAB_FAVORITES != 0) {
favorites_fragment?.refreshContacts(contacts)
}
- if (refreshTabsMask and GROUPS_TAB_MASK != 0) {
- if (refreshTabsMask == GROUPS_TAB_MASK) {
+ if (refreshTabsMask and TAB_GROUPS != 0) {
+ if (refreshTabsMask == TAB_GROUPS) {
groups_fragment.skipHashComparing = true
}
groups_fragment?.refreshContacts(contacts)
@@ -614,6 +598,22 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
private fun getAllFragments() = arrayListOf(contacts_fragment, favorites_fragment, groups_fragment)
+ private fun getDefaultTab(): Int {
+ val showTabsMask = config.showTabs
+ return when (config.defaultTab) {
+ TAB_LAST_USED -> config.lastUsedViewPagerPage
+ TAB_CONTACTS -> 0
+ TAB_FAVORITES -> if (showTabsMask and TAB_CONTACTS > 0) 1 else 0
+ else -> {
+ if (showTabsMask and TAB_CONTACTS > 0) {
+ if (showTabsMask and TAB_FAVORITES > 0) 2 else 1
+ } else {
+ 0
+ }
+ }
+ }
+ }
+
private fun checkWhatsNewDialog() {
arrayListOf().apply {
add(Release(10, R.string.release_10))
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageSpeedDialActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageSpeedDialActivity.kt
deleted file mode 100644
index ca1a3a9c..00000000
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageSpeedDialActivity.kt
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.simplemobiletools.contacts.pro.activities
-
-import android.os.Bundle
-import com.google.gson.Gson
-import com.simplemobiletools.commons.extensions.updateTextColors
-import com.simplemobiletools.contacts.pro.R
-import com.simplemobiletools.contacts.pro.adapters.SpeedDialAdapter
-import com.simplemobiletools.contacts.pro.dialogs.SelectContactsDialog
-import com.simplemobiletools.contacts.pro.extensions.config
-import com.simplemobiletools.contacts.pro.helpers.ContactsHelper
-import com.simplemobiletools.contacts.pro.interfaces.RemoveSpeedDialListener
-import com.simplemobiletools.contacts.pro.models.Contact
-import com.simplemobiletools.contacts.pro.models.SpeedDial
-import kotlinx.android.synthetic.main.activity_manage_speed_dial.*
-
-class ManageSpeedDialActivity : SimpleActivity(), RemoveSpeedDialListener {
- private var allContacts = ArrayList()
- private var speedDialValues = ArrayList()
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_manage_speed_dial)
-
- speedDialValues = config.getSpeedDialValues()
- updateAdapter()
- ContactsHelper(this).getContacts { contacts ->
- allContacts = contacts
- }
-
- updateTextColors(manage_speed_dial_scrollview)
- }
-
- override fun onStop() {
- super.onStop()
- config.speedDial = Gson().toJson(speedDialValues)
- }
-
- private fun updateAdapter() {
- SpeedDialAdapter(this, speedDialValues, this, speed_dial_list) {
- val clickedContact = it as SpeedDial
- if (allContacts.isEmpty()) {
- return@SpeedDialAdapter
- }
-
- SelectContactsDialog(this, allContacts, false, true) { addedContacts, removedContacts ->
- val selectedContact = addedContacts.first()
- speedDialValues.first { it.id == clickedContact.id }.apply {
- displayName = selectedContact.getNameToDisplay()
- number = selectedContact.phoneNumbers.first().value
- }
- updateAdapter()
- }
- }.apply {
- speed_dial_list.adapter = this
- }
- }
-
- override fun removeSpeedDial(ids: ArrayList) {
- ids.forEach {
- val dialId = it
- speedDialValues.first { it.id == dialId }.apply {
- displayName = ""
- number = ""
- }
- }
- updateAdapter()
- }
-}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt
index 1b680541..34338104 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt
@@ -201,7 +201,6 @@ class SelectContactActivity : SimpleActivity() {
select_contact_list.adapter = this
}
- select_contact_fastscroller.allowBubbleDisplay = true
select_contact_fastscroller.setViews(select_contact_list) {
select_contact_fastscroller.updateBubbleText(contacts[it].getBubbleText())
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt
index b1764815..24c2c69d 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt
@@ -1,12 +1,9 @@
package com.simplemobiletools.contacts.pro.activities
-import android.annotation.TargetApi
-import android.content.Intent
-import android.os.Build
import android.os.Bundle
import android.view.Menu
-import com.simplemobiletools.commons.activities.ManageBlockedNumbersActivity
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
+import com.simplemobiletools.commons.extensions.baseConfig
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.getFontSizeText
import com.simplemobiletools.commons.extensions.updateTextColors
@@ -34,8 +31,6 @@ class SettingsActivity : SimpleActivity() {
setupCustomizeColors()
setupManageShownContactFields()
setupManageShownTabs()
- setupManageBlockedNumbers()
- setupManageSpeedDial()
setupFontSize()
setupUseEnglish()
setupShowContactThumbnails()
@@ -44,8 +39,9 @@ class SettingsActivity : SimpleActivity() {
setupStartNameWithSurname()
setupShowCallConfirmation()
setupShowDialpadButton()
- setupShowDialpadLetters()
+ setupShowPrivateContacts()
setupOnContactClick()
+ setupDefaultTab()
updateTextColors(settings_holder)
invalidateOptionsMenu()
}
@@ -73,20 +69,28 @@ class SettingsActivity : SimpleActivity() {
}
}
- // support for device-wise blocking came on Android 7, rely only on that
- @TargetApi(Build.VERSION_CODES.N)
- private fun setupManageBlockedNumbers() {
- settings_manage_blocked_numbers_holder.beVisibleIf(isNougatPlus())
- settings_manage_blocked_numbers_holder.setOnClickListener {
- startActivity(Intent(this, ManageBlockedNumbersActivity::class.java))
+ private fun setupDefaultTab() {
+ settings_default_tab.text = getDefaultTabText()
+ settings_default_tab_holder.setOnClickListener {
+ val items = arrayListOf(
+ RadioItem(TAB_CONTACTS, getString(R.string.contacts_tab)),
+ RadioItem(TAB_FAVORITES, getString(R.string.favorites_tab)),
+ RadioItem(TAB_GROUPS, getString(R.string.groups_tab)),
+ RadioItem(TAB_LAST_USED, getString(R.string.last_used_tab)))
+
+ RadioGroupDialog(this@SettingsActivity, items, config.defaultTab) {
+ config.defaultTab = it as Int
+ settings_default_tab.text = getDefaultTabText()
+ }
}
}
- private fun setupManageSpeedDial() {
- settings_manage_speed_dial_holder.setOnClickListener {
- startActivity(Intent(this, ManageSpeedDialActivity::class.java))
- }
- }
+ private fun getDefaultTabText() = getString(when (baseConfig.defaultTab) {
+ TAB_CONTACTS -> R.string.contacts_tab
+ TAB_FAVORITES -> R.string.favorites_tab
+ TAB_GROUPS -> R.string.groups_tab
+ else -> R.string.last_used_tab
+ })
private fun setupFontSize() {
settings_font_size.text = getFontSizeText()
@@ -154,11 +158,11 @@ class SettingsActivity : SimpleActivity() {
}
}
- private fun setupShowDialpadLetters() {
- settings_show_dialpad_letters.isChecked = config.showDialpadLetters
- settings_show_dialpad_letters_holder.setOnClickListener {
- settings_show_dialpad_letters.toggle()
- config.showDialpadLetters = settings_show_dialpad_letters.isChecked
+ private fun setupShowPrivateContacts() {
+ settings_show_private_contacts.isChecked = config.showPrivateContacts
+ settings_show_private_contacts_holder.setOnClickListener {
+ settings_show_private_contacts.toggle()
+ config.showPrivateContacts = settings_show_private_contacts.isChecked
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt
index c17708ec..d3990529 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt
@@ -1,23 +1,23 @@
package com.simplemobiletools.contacts.pro.activities
+import android.content.ContentUris
import android.content.Intent
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.provider.ContactsContract
-import android.view.Menu
-import android.view.MenuItem
import android.view.View
import android.view.WindowManager
import android.widget.RelativeLayout
-import com.bumptech.glide.Glide
-import com.bumptech.glide.load.resource.bitmap.FitCenter
-import com.bumptech.glide.load.resource.bitmap.RoundedCorners
-import com.bumptech.glide.request.RequestOptions
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.CONTACT_ID
+import com.simplemobiletools.commons.helpers.IS_PRIVATE
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog
+import com.simplemobiletools.contacts.pro.dialogs.ChooseSocialDialog
import com.simplemobiletools.contacts.pro.extensions.*
import com.simplemobiletools.contacts.pro.helpers.*
import com.simplemobiletools.contacts.pro.models.*
@@ -42,6 +42,7 @@ class ViewContactActivity : ContactActivity() {
private val COMPARABLE_PHONE_NUMBER_LENGTH = 9
override fun onCreate(savedInstanceState: Bundle?) {
+ showTransparentTop = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_view_contact)
@@ -50,6 +51,8 @@ class ViewContactActivity : ContactActivity() {
}
showFields = config.showContactFields
+ contact_wrapper.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+ setupMenu()
}
override fun onResume() {
@@ -73,36 +76,33 @@ class ViewContactActivity : ContactActivity() {
}
}
- override fun onBackPressed() {
- if (contact_photo_big.alpha == 1f) {
- hideBigContactPhoto()
- } else {
- super.onBackPressed()
- }
- }
+ private fun setupMenu() {
+ (contact_appbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
+ contact_toolbar.menu.apply {
+ findItem(R.id.share).setOnMenuItemClickListener {
+ shareContact(fullContact!!)
+ true
+ }
- override fun onCreateOptionsMenu(menu: Menu): Boolean {
- menuInflater.inflate(R.menu.menu_view_contact, menu)
- menu.apply {
- findItem(R.id.open_with).isVisible = contact?.isPrivate() == false
- updateMenuItemColors(this)
- }
- return true
- }
+ findItem(R.id.edit).setOnMenuItemClickListener {
+ launchEditContact(contact!!)
+ true
+ }
- override fun onOptionsItemSelected(item: MenuItem): Boolean {
- if (contact == null) {
- return true
+ findItem(R.id.open_with).setOnMenuItemClickListener {
+ openWith()
+ true
+ }
+
+ findItem(R.id.delete).setOnMenuItemClickListener {
+ deleteContactFromAllSources()
+ true
+ }
}
- when (item.itemId) {
- R.id.edit -> launchEditContact(contact!!)
- R.id.share -> shareContact(fullContact!!)
- R.id.open_with -> openWith()
- R.id.delete -> deleteContactFromAllSources()
- else -> return super.onOptionsItemSelected(item)
+ contact_toolbar.setNavigationOnClickListener {
+ finish()
}
- return true
}
private fun initContact() {
@@ -168,31 +168,14 @@ class ViewContactActivity : ContactActivity() {
if (contact!!.photoUri.isEmpty() && contact!!.photo == null) {
showPhotoPlaceholder(contact_photo)
+ contact_photo_bottom_shadow.beGone()
} else {
- updateContactPhoto(contact!!.photoUri, contact_photo, contact!!.photo)
- val options = RequestOptions()
- .transform(FitCenter(), RoundedCorners(resources.getDimension(R.dimen.normal_margin).toInt()))
-
- Glide.with(this)
- .load(contact!!.photo ?: currentContactPhotoPath)
- .apply(options)
- .into(contact_photo_big)
-
- contact_photo.setOnClickListener {
- contact_photo_big.alpha = 0f
- contact_photo_big.beVisible()
- contact_photo_big.animate().alpha(1f).start()
- }
-
- contact_photo_big.setOnClickListener {
- hideBigContactPhoto()
- }
+ updateContactPhoto(contact!!.photoUri, contact_photo, contact_photo_bottom_shadow, contact!!.photo)
}
val textColor = config.textColor
- arrayOf(contact_send_sms, contact_start_call, contact_send_email, contact_name_image, contact_numbers_image, contact_emails_image,
- contact_addresses_image, contact_events_image, contact_source_image, contact_notes_image, contact_organization_image,
- contact_websites_image, contact_groups_image).forEach {
+ arrayOf(contact_name_image, contact_numbers_image, contact_emails_image, contact_addresses_image, contact_events_image, contact_source_image,
+ contact_notes_image, contact_organization_image, contact_websites_image, contact_groups_image).forEach {
it.applyColorFilter(textColor)
}
@@ -201,7 +184,7 @@ class ViewContactActivity : ContactActivity() {
contact_send_email.setOnClickListener { trySendEmail() }
updateTextColors(contact_scrollview)
- invalidateOptionsMenu()
+ contact_toolbar.menu.findItem(R.id.open_with).isVisible = contact?.isPrivate() == false
}
private fun setupViewContact() {
@@ -251,11 +234,22 @@ class ViewContactActivity : ContactActivity() {
private fun setupFavorite() {
contact_toggle_favorite.apply {
beVisible()
- setImageDrawable(getStarDrawable(contact!!.starred == 1))
tag = contact!!.starred
- applyColorFilter(config.textColor)
+ setImageDrawable(getStarDrawable(tag == 1))
+
setOnClickListener {
- toast(R.string.must_be_at_edit)
+ val newIsStarred = if (tag == 1) 0 else 1
+ ensureBackgroundThread {
+ val contacts = arrayListOf(contact!!)
+ if (newIsStarred == 1) {
+ ContactsHelper(context).addFavorites(contacts)
+ } else {
+ ContactsHelper(context).removeFavorites(contacts)
+ }
+ }
+ contact!!.starred = newIsStarred
+ tag = contact!!.starred
+ setImageDrawable(getStarDrawable(tag == 1))
}
}
}
@@ -289,7 +283,6 @@ class ViewContactActivity : ContactActivity() {
if (contact_prefix.isGone() && contact_first_name.isGone() && contact_middle_name.isGone() && contact_surname.isGone() && contact_suffix.isGone()
&& contact_nickname.isGone()) {
contact_name_image.beInvisible()
- (contact_photo.layoutParams as RelativeLayout.LayoutParams).bottomMargin = resources.getDimension(R.dimen.medium_margin).toInt()
}
}
}
@@ -539,6 +532,38 @@ class ViewContactActivity : ContactActivity() {
contact_source.setOnClickListener {
launchEditContact(key)
}
+
+ if (value.toLowerCase() == WHATSAPP) {
+ contact_source_image.setImageDrawable(getPackageDrawable(WHATSAPP_PACKAGE))
+ contact_source_image.beVisible()
+ contact_source_image.setOnClickListener {
+ showSocialActions(key.id)
+ }
+ }
+
+ if (value.toLowerCase() == SIGNAL) {
+ contact_source_image.setImageDrawable(getPackageDrawable(SIGNAL_PACKAGE))
+ contact_source_image.beVisible()
+ contact_source_image.setOnClickListener {
+ showSocialActions(key.id)
+ }
+ }
+
+ if (value.toLowerCase() == VIBER) {
+ contact_source_image.setImageDrawable(getPackageDrawable(VIBER_PACKAGE))
+ contact_source_image.beVisible()
+ contact_source_image.setOnClickListener {
+ showSocialActions(key.id)
+ }
+ }
+
+ if (value.toLowerCase() == TELEGRAM) {
+ contact_source_image.setImageDrawable(getPackageDrawable(TELEGRAM_PACKAGE))
+ contact_source_image.beVisible()
+ contact_source_image.setOnClickListener {
+ showSocialActions(key.id)
+ }
+ }
}
}
@@ -584,6 +609,22 @@ class ViewContactActivity : ContactActivity() {
}
}
+ private fun showSocialActions(contactId: Int) {
+ ensureBackgroundThread {
+ val actions = getSocialActions(contactId)
+ runOnUiThread {
+ ChooseSocialDialog(this@ViewContactActivity, actions) { action ->
+ Intent(Intent.ACTION_VIEW).apply {
+ val uri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, action.dataId)
+ setDataAndType(uri, action.mimetype)
+ flags = Intent.FLAG_ACTIVITY_CLEAR_TASK
+ startActivity(this)
+ }
+ }
+ }
+ }
+ }
+
private fun getDuplicateContacts(callback: () -> Unit) {
ContactsHelper(this).getDuplicatesOfContact(contact!!, false) { contacts ->
ensureBackgroundThread {
@@ -622,10 +663,6 @@ class ViewContactActivity : ContactActivity() {
private fun getStarDrawable(on: Boolean) = resources.getDrawable(if (on) R.drawable.ic_star_on_vector else R.drawable.ic_star_off_vector)
- private fun hideBigContactPhoto() {
- contact_photo_big.animate().alpha(0f).withEndAction { contact_photo_big.beGone() }.start()
- }
-
private fun View.copyOnLongClick(value: String) {
setOnLongClickListener {
copyToClipboard(value)
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt
index bb51e5eb..dae16557 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt
@@ -16,8 +16,7 @@ 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.helpers.SimpleContactsHelper
-import com.simplemobiletools.commons.helpers.ensureBackgroundThread
+import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.commons.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView
@@ -40,7 +39,6 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList, val
fastScroller: FastScroller, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
private var textToHighlight = ""
-
- var adjustedPrimaryColor = activity.getAdjustedPrimaryColor()
var showContactThumbnails = activity.config.showContactThumbnails
var fontSize = activity.getTextSize()
@@ -102,7 +99,7 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val
val group = getItemWithKey(selectedKeys.first()) ?: return
RenameGroupDialog(activity, group) {
finishActMode()
- refreshListener?.refreshContacts(GROUPS_TAB_MASK)
+ refreshListener?.refreshContacts(TAB_GROUPS)
}
}
@@ -143,7 +140,7 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val
activity.runOnUiThread {
if (groups.isEmpty()) {
- refreshListener?.refreshContacts(GROUPS_TAB_MASK)
+ refreshListener?.refreshContacts(TAB_GROUPS)
finishActMode()
} else {
removeSelectedItems(positions)
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SpeedDialAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SpeedDialAdapter.kt
deleted file mode 100644
index b2cc64d3..00000000
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SpeedDialAdapter.kt
+++ /dev/null
@@ -1,80 +0,0 @@
-package com.simplemobiletools.contacts.pro.adapters
-
-import android.view.Menu
-import android.view.View
-import android.view.ViewGroup
-import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
-import com.simplemobiletools.commons.views.MyRecyclerView
-import com.simplemobiletools.contacts.pro.R
-import com.simplemobiletools.contacts.pro.activities.SimpleActivity
-import com.simplemobiletools.contacts.pro.interfaces.RemoveSpeedDialListener
-import com.simplemobiletools.contacts.pro.models.SpeedDial
-import kotlinx.android.synthetic.main.item_speed_dial.view.*
-import java.util.*
-
-class SpeedDialAdapter(activity: SimpleActivity, var speedDialValues: ArrayList, private val removeListener: RemoveSpeedDialListener,
- recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
-
- init {
- setupDragListener(true)
- }
-
- override fun getActionMenuId() = R.menu.cab_delete_only
-
- override fun prepareActionMode(menu: Menu) {}
-
- override fun actionItemPressed(id: Int) {
- if (selectedKeys.isEmpty()) {
- return
- }
-
- when (id) {
- R.id.cab_delete -> deleteSpeedDial()
- }
- }
-
- override fun getSelectableItemCount() = speedDialValues.size
-
- override fun getIsItemSelectable(position: Int) = speedDialValues[position].isValid()
-
- override fun getItemSelectionKey(position: Int) = speedDialValues.getOrNull(position)?.hashCode()
-
- override fun getItemKeyPosition(key: Int) = speedDialValues.indexOfFirst { it.hashCode() == key }
-
- override fun onActionModeCreated() {}
-
- override fun onActionModeDestroyed() {}
-
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_speed_dial, parent)
-
- override fun onBindViewHolder(holder: ViewHolder, position: Int) {
- val speedDial = speedDialValues[position]
- holder.bindView(speedDial, true, true) { itemView, layoutPosition ->
- setupView(itemView, speedDial)
- }
- bindViewHolder(holder)
- }
-
- override fun getItemCount() = speedDialValues.size
-
- private fun getSelectedItems() = speedDialValues.filter { selectedKeys.contains(it.hashCode()) } as ArrayList
-
- private fun deleteSpeedDial() {
- val ids = getSelectedItems().map { it.id }.toMutableList() as ArrayList
- removeListener.removeSpeedDial(ids)
- finishActMode()
- }
-
- private fun setupView(view: View, speedDial: SpeedDial) {
- view.apply {
- var displayName = "${speedDial.id}. "
- displayName += if (speedDial.isValid()) speedDial.displayName else ""
-
- speed_dial_label.apply {
- text = displayName
- isSelected = selectedKeys.contains(speedDial.hashCode())
- setTextColor(textColor)
- }
- }
- }
-}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ViewPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ViewPagerAdapter.kt
index ab141e80..e4cb8d3e 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ViewPagerAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ViewPagerAdapter.kt
@@ -3,12 +3,12 @@ package com.simplemobiletools.contacts.pro.adapters
import android.view.View
import android.view.ViewGroup
import androidx.viewpager.widget.PagerAdapter
+import com.simplemobiletools.commons.helpers.TAB_CONTACTS
+import com.simplemobiletools.commons.helpers.TAB_FAVORITES
+import com.simplemobiletools.commons.helpers.TAB_GROUPS
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.SimpleActivity
import com.simplemobiletools.contacts.pro.fragments.MyViewPagerFragment
-import com.simplemobiletools.contacts.pro.helpers.CONTACTS_TAB_MASK
-import com.simplemobiletools.contacts.pro.helpers.FAVORITES_TAB_MASK
-import com.simplemobiletools.contacts.pro.helpers.GROUPS_TAB_MASK
class ViewPagerAdapter(val activity: SimpleActivity, val currTabsList: ArrayList, val showTabs: Int) : PagerAdapter() {
@@ -34,15 +34,15 @@ class ViewPagerAdapter(val activity: SimpleActivity, val currTabsList: ArrayList
private fun getFragment(position: Int): Int {
val fragments = arrayListOf()
- if (showTabs and CONTACTS_TAB_MASK != 0) {
+ if (showTabs and TAB_CONTACTS != 0) {
fragments.add(R.layout.fragment_contacts)
}
- if (showTabs and FAVORITES_TAB_MASK != 0) {
+ if (showTabs and TAB_FAVORITES != 0) {
fragments.add(R.layout.fragment_favorites)
}
- if (showTabs and GROUPS_TAB_MASK != 0) {
+ if (showTabs and TAB_GROUPS != 0) {
fragments.add(R.layout.fragment_groups)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/contentproviders/MyContactsContentProvider.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/contentproviders/MyContactsContentProvider.kt
new file mode 100644
index 00000000..ca2bfd19
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/contentproviders/MyContactsContentProvider.kt
@@ -0,0 +1,56 @@
+package com.simplemobiletools.contacts.pro.contentproviders
+
+import android.content.ContentProvider
+import android.content.ContentValues
+import android.database.Cursor
+import android.database.MatrixCursor
+import android.net.Uri
+import com.google.gson.Gson
+import com.simplemobiletools.commons.helpers.MyContactsContentProvider
+import com.simplemobiletools.contacts.pro.extensions.config
+import com.simplemobiletools.contacts.pro.helpers.LocalContactsHelper
+
+class MyContactsContentProvider : ContentProvider() {
+ override fun insert(uri: Uri, contentValues: ContentValues?) = null
+
+ override fun query(uri: Uri, projection: Array?, selection: String?, selectionArgs: Array?, sortOrder: String?): Cursor? {
+ if (context == null || !context!!.config.showPrivateContacts) {
+ return null
+ } else {
+ val matrixCursor = MatrixCursor(arrayOf(
+ MyContactsContentProvider.COL_RAW_ID,
+ MyContactsContentProvider.COL_CONTACT_ID,
+ MyContactsContentProvider.COL_NAME,
+ MyContactsContentProvider.COL_PHOTO_URI,
+ MyContactsContentProvider.COL_PHONE_NUMBERS,
+ MyContactsContentProvider.COL_BIRTHDAYS,
+ MyContactsContentProvider.COL_ANNIVERSARIES)
+ )
+
+ LocalContactsHelper(context!!).getPrivateSimpleContactsSync(selection == MyContactsContentProvider.FAVORITES_ONLY).forEach {
+ val phoneNumbers = Gson().toJson(it.phoneNumbers)
+ val birthdays = Gson().toJson(it.birthdays)
+ val anniversaries = Gson().toJson(it.anniversaries)
+
+ matrixCursor.newRow()
+ .add(MyContactsContentProvider.COL_RAW_ID, it.rawId)
+ .add(MyContactsContentProvider.COL_CONTACT_ID, it.contactId)
+ .add(MyContactsContentProvider.COL_NAME, it.name)
+ .add(MyContactsContentProvider.COL_PHOTO_URI, it.photoUri)
+ .add(MyContactsContentProvider.COL_PHONE_NUMBERS, phoneNumbers)
+ .add(MyContactsContentProvider.COL_BIRTHDAYS, birthdays)
+ .add(MyContactsContentProvider.COL_ANNIVERSARIES, anniversaries)
+ }
+
+ return matrixCursor
+ }
+ }
+
+ override fun onCreate() = true
+
+ override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array?) = 1
+
+ override fun delete(uri: Uri, selection: String?, selectionArgs: Array?): Int = 0
+
+ override fun getType(uri: Uri) = ""
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChangeSortingDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChangeSortingDialog.kt
index b5ef8f2c..6dd37faf 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChangeSortingDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChangeSortingDialog.kt
@@ -3,10 +3,7 @@ package com.simplemobiletools.contacts.pro.dialogs
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
-import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME
-import com.simplemobiletools.commons.helpers.SORT_BY_SURNAME
-import com.simplemobiletools.commons.helpers.SORT_DESCENDING
+import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.extensions.config
import kotlinx.android.synthetic.main.dialog_change_sorting.view.*
@@ -18,11 +15,11 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, private val callback
init {
AlertDialog.Builder(activity)
- .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
- .setNegativeButton(R.string.cancel, null)
- .create().apply {
- activity.setupDialogStuff(view, this, R.string.sort_by)
- }
+ .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
+ .setNegativeButton(R.string.cancel, null)
+ .create().apply {
+ activity.setupDialogStuff(view, this, R.string.sort_by)
+ }
currSorting = config.sorting
setupSortRadio()
@@ -34,7 +31,8 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, private val callback
val sortBtn = when {
currSorting and SORT_BY_FIRST_NAME != 0 -> sortingRadio.sorting_dialog_radio_first_name
currSorting and SORT_BY_MIDDLE_NAME != 0 -> sortingRadio.sorting_dialog_radio_middle_name
- else -> sortingRadio.sorting_dialog_radio_surname
+ currSorting and SORT_BY_SURNAME != 0 -> sortingRadio.sorting_dialog_radio_surname
+ else -> sortingRadio.sorting_dialog_radio_full_name
}
sortBtn.isChecked = true
}
@@ -54,7 +52,8 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, private val callback
var sorting = when (sortingRadio.checkedRadioButtonId) {
R.id.sorting_dialog_radio_first_name -> SORT_BY_FIRST_NAME
R.id.sorting_dialog_radio_middle_name -> SORT_BY_MIDDLE_NAME
- else -> SORT_BY_SURNAME
+ R.id.sorting_dialog_radio_surname -> SORT_BY_SURNAME
+ else -> SORT_BY_FULL_NAME
}
if (view.sorting_dialog_radio_order.checkedRadioButtonId == R.id.sorting_dialog_radio_descending) {
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChooseSocialDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChooseSocialDialog.kt
new file mode 100644
index 00000000..f211f7dd
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChooseSocialDialog.kt
@@ -0,0 +1,47 @@
+package com.simplemobiletools.contacts.pro.dialogs
+
+import android.app.Activity
+import android.view.ViewGroup
+import android.widget.RadioGroup
+import android.widget.RelativeLayout
+import androidx.appcompat.app.AlertDialog
+import com.simplemobiletools.commons.extensions.beGone
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import com.simplemobiletools.contacts.pro.R
+import com.simplemobiletools.contacts.pro.extensions.getPackageDrawable
+import com.simplemobiletools.contacts.pro.models.SocialAction
+import kotlinx.android.synthetic.main.dialog_choose_social.view.*
+import kotlinx.android.synthetic.main.item_choose_social.view.*
+
+class ChooseSocialDialog(val activity: Activity, actions: ArrayList, val callback: (action: SocialAction) -> Unit) {
+ private lateinit var dialog: AlertDialog
+
+ init {
+ val view = activity.layoutInflater.inflate(R.layout.dialog_choose_social, null)
+ actions.sortBy { it.type }
+ actions.forEach { action ->
+ val item = (activity.layoutInflater.inflate(R.layout.item_choose_social, null) as RelativeLayout).apply {
+ item_social_label.text = action.label
+ setOnClickListener {
+ callback(action)
+ dialog.dismiss()
+ }
+
+ val drawable = activity.getPackageDrawable(action.packageName)
+ if (drawable == null) {
+ item_social_image.beGone()
+ } else {
+ item_social_image.setImageDrawable(drawable)
+ }
+ }
+
+ view.dialog_choose_social.addView(item, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
+ }
+
+ val builder = AlertDialog.Builder(activity)
+
+ dialog = builder.create().apply {
+ activity.setupDialogStuff(view, this)
+ }
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/CreateNewGroupDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/CreateNewGroupDialog.kt
index 06233246..58d54f5c 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/CreateNewGroupDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/CreateNewGroupDialog.kt
@@ -41,7 +41,7 @@ class CreateNewGroupDialog(val activity: BaseSimpleActivity, val callback: (newG
val items = ArrayList()
contactSources.forEachIndexed { index, contactSource ->
- items.add(RadioItem(index, contactSource.name))
+ items.add(RadioItem(index, contactSource.publicName))
}
activity.runOnUiThread {
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ManageVisibleTabsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ManageVisibleTabsDialog.kt
index 0ecc7271..d73a2218 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ManageVisibleTabsDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ManageVisibleTabsDialog.kt
@@ -3,13 +3,13 @@ package com.simplemobiletools.contacts.pro.dialogs
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.setupDialogStuff
+import com.simplemobiletools.commons.helpers.TAB_CONTACTS
+import com.simplemobiletools.commons.helpers.TAB_FAVORITES
+import com.simplemobiletools.commons.helpers.TAB_GROUPS
import com.simplemobiletools.commons.views.MyAppCompatCheckbox
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.extensions.config
import com.simplemobiletools.contacts.pro.helpers.ALL_TABS_MASK
-import com.simplemobiletools.contacts.pro.helpers.CONTACTS_TAB_MASK
-import com.simplemobiletools.contacts.pro.helpers.FAVORITES_TAB_MASK
-import com.simplemobiletools.contacts.pro.helpers.GROUPS_TAB_MASK
class ManageVisibleTabsDialog(val activity: BaseSimpleActivity) {
private var view = activity.layoutInflater.inflate(R.layout.dialog_manage_visible_tabs, null)
@@ -17,9 +17,9 @@ class ManageVisibleTabsDialog(val activity: BaseSimpleActivity) {
init {
tabs.apply {
- put(CONTACTS_TAB_MASK, R.id.manage_visible_tabs_contacts)
- put(FAVORITES_TAB_MASK, R.id.manage_visible_tabs_favorites)
- put(GROUPS_TAB_MASK, R.id.manage_visible_tabs_groups)
+ put(TAB_CONTACTS, R.id.manage_visible_tabs_contacts)
+ put(TAB_FAVORITES, R.id.manage_visible_tabs_favorites)
+ put(TAB_GROUPS, R.id.manage_visible_tabs_groups)
}
val showTabs = activity.config.showTabs
@@ -28,11 +28,11 @@ class ManageVisibleTabsDialog(val activity: BaseSimpleActivity) {
}
AlertDialog.Builder(activity)
- .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
- .setNegativeButton(R.string.cancel, null)
- .create().apply {
- activity.setupDialogStuff(view, this)
- }
+ .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
+ .setNegativeButton(R.string.cancel, null)
+ .create().apply {
+ activity.setupDialogStuff(view, this)
+ }
}
private fun dialogConfirmed() {
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/MyDatePickerDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/MyDatePickerDialog.kt
new file mode 100644
index 00000000..4c87f576
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/MyDatePickerDialog.kt
@@ -0,0 +1,58 @@
+package com.simplemobiletools.contacts.pro.dialogs
+
+import androidx.appcompat.app.AlertDialog
+import com.simplemobiletools.commons.activities.BaseSimpleActivity
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import com.simplemobiletools.contacts.pro.R
+import kotlinx.android.synthetic.main.dialog_date_picker.view.*
+import org.joda.time.DateTime
+import java.util.*
+
+class MyDatePickerDialog(val activity: BaseSimpleActivity, val defaultDate: String, val callback: (dateTag: String) -> Unit) {
+ private var view = activity.layoutInflater.inflate(R.layout.dialog_date_picker, null)
+
+ init {
+ AlertDialog.Builder(activity)
+ .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
+ .setNegativeButton(R.string.cancel, null)
+ .create().apply {
+ activity.setupDialogStuff(view, this) {
+ val today = Calendar.getInstance()
+ var year = today.get(Calendar.YEAR)
+ var month = today.get(Calendar.MONTH)
+ var day = today.get(Calendar.DAY_OF_MONTH)
+
+ if (defaultDate.isNotEmpty()) {
+ val ignoreYear = defaultDate.startsWith("-")
+ view.hide_year.isChecked = ignoreYear
+
+ if (ignoreYear) {
+ month = defaultDate.substring(2, 4).toInt() - 1
+ day = defaultDate.substring(5, 7).toInt()
+ } else {
+ year = defaultDate.substring(0, 4).toInt()
+ month = defaultDate.substring(5, 7).toInt() - 1
+ day = defaultDate.substring(8, 10).toInt()
+ }
+ }
+
+ view.date_picker.updateDate(year, month, day)
+ }
+ }
+ }
+
+ private fun dialogConfirmed() {
+ val year = view.date_picker.year
+ val month = view.date_picker.month + 1
+ val day = view.date_picker.dayOfMonth
+ val date = DateTime().withDate(year, month, day).withTimeAtStartOfDay()
+
+ val tag = if (view.hide_year.isChecked) {
+ date.toString("--MM-dd")
+ } else {
+ date.toString("yyyy-MM-dd")
+ }
+
+ callback(tag)
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt
index a50ced34..e355c2d6 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt
@@ -40,9 +40,8 @@ class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayL
view.apply {
select_contact_list.adapter = SelectContactsAdapter(activity, allContacts, initiallySelectedContacts, allowSelectMultiple,
- select_contact_list, select_contact_fastscroller, contactClickCallback)
+ select_contact_list, select_contact_fastscroller, contactClickCallback)
- select_contact_fastscroller.allowBubbleDisplay = true
select_contact_fastscroller.setViews(select_contact_list) {
select_contact_fastscroller.updateBubbleText(allContacts[it].getBubbleText())
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectSIMDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectSIMDialog.kt
deleted file mode 100644
index c621ceae..00000000
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectSIMDialog.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.simplemobiletools.contacts.pro.dialogs
-
-import android.annotation.SuppressLint
-import android.telecom.PhoneAccountHandle
-import android.view.ViewGroup
-import android.widget.RadioButton
-import android.widget.RadioGroup
-import androidx.appcompat.app.AlertDialog
-import com.simplemobiletools.commons.activities.BaseSimpleActivity
-import com.simplemobiletools.commons.extensions.setupDialogStuff
-import com.simplemobiletools.contacts.pro.R
-import com.simplemobiletools.contacts.pro.extensions.config
-import com.simplemobiletools.contacts.pro.extensions.getAvailableSIMCardLabels
-import kotlinx.android.synthetic.main.dialog_select_sim.view.*
-
-@SuppressLint("MissingPermission")
-class SelectSIMDialog(val activity: BaseSimpleActivity, val phoneNumber: String, val callback: (handle: PhoneAccountHandle) -> Unit) {
- private var dialog: AlertDialog? = null
- private val view = activity.layoutInflater.inflate(R.layout.dialog_select_sim, null)
-
- init {
- val radioGroup = view.select_sim_radio_group
-
- activity.getAvailableSIMCardLabels().forEachIndexed { index, SIMAccount ->
- val radioButton = (activity.layoutInflater.inflate(R.layout.radio_button, null) as RadioButton).apply {
- text = SIMAccount.label
- id = index
- setOnClickListener { selectedSIM(SIMAccount.handle, SIMAccount.label) }
- }
- radioGroup!!.addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
- }
-
- dialog = AlertDialog.Builder(activity)
- .create().apply {
- activity.setupDialogStuff(view, this)
- }
- }
-
- private fun selectedSIM(handle: PhoneAccountHandle, label: String) {
- if (view.select_sim_remember.isChecked) {
- activity.config.saveCustomSIM(phoneNumber, label)
- }
-
- callback(handle)
- dialog?.dismiss()
- }
-}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt
index 6c9943ec..a351456c 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt
@@ -1,31 +1,33 @@
package com.simplemobiletools.contacts.pro.extensions
-import android.annotation.SuppressLint
import android.content.Intent
import android.net.Uri
-import android.telecom.PhoneAccount
-import android.telecom.PhoneAccountHandle
-import android.telecom.TelecomManager
+import android.provider.ContactsContract.CommonDataKinds.BaseTypes
+import android.provider.ContactsContract.CommonDataKinds.Phone
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.PERMISSION_READ_PHONE_STATE
+import com.simplemobiletools.commons.helpers.PERMISSION_CALL_PHONE
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.contacts.pro.BuildConfig
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.SimpleActivity
import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog
-import com.simplemobiletools.contacts.pro.dialogs.SelectSIMDialog
import com.simplemobiletools.contacts.pro.helpers.*
import com.simplemobiletools.contacts.pro.models.Contact
fun SimpleActivity.startCallIntent(recipient: String) {
- if (isDefaultDialer()) {
- getHandleToUse(null, recipient) { handle ->
- launchCallIntent(recipient, handle)
+ handlePermission(PERMISSION_CALL_PHONE) {
+ val action = if (it) Intent.ACTION_CALL else Intent.ACTION_DIAL
+ Intent(action).apply {
+ data = Uri.fromParts("tel", recipient, null)
+
+ if (resolveActivity(packageManager) != null) {
+ startActivity(this)
+ } else {
+ toast(R.string.no_app_found)
+ }
}
- } else {
- launchCallIntent(recipient, null)
}
}
@@ -46,7 +48,7 @@ fun SimpleActivity.startCall(contact: Contact) {
} else if (numbers.size > 1) {
val items = ArrayList()
numbers.forEachIndexed { index, phoneNumber ->
- items.add(RadioItem(index, phoneNumber.value, phoneNumber.value))
+ items.add(RadioItem(index, "${phoneNumber.value} (${getPhoneNumberTypeText(phoneNumber.type, phoneNumber.label)})", phoneNumber.value))
}
RadioGroupDialog(this, items) {
@@ -111,27 +113,19 @@ fun SimpleActivity.callContact(contact: Contact) {
}
}
-// used at devices with multiple SIM cards
-@SuppressLint("MissingPermission")
-fun SimpleActivity.getHandleToUse(intent: Intent?, phoneNumber: String, callback: (PhoneAccountHandle) -> Unit) {
- handlePermission(PERMISSION_READ_PHONE_STATE) {
- if (it) {
- val defaultHandle = telecomManager.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL)
- when {
- intent?.hasExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE) == true -> callback(intent.getParcelableExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE)!!)
- config.getCustomSIM(phoneNumber)?.isNotEmpty() == true -> {
- val storedLabel = Uri.decode(config.getCustomSIM(phoneNumber))
- val availableSIMs = getAvailableSIMCardLabels()
- val firstornull = availableSIMs.firstOrNull { it.label == storedLabel }?.handle ?: availableSIMs.first().handle
- callback(firstornull)
- }
- defaultHandle != null -> callback(defaultHandle)
- else -> {
- SelectSIMDialog(this, phoneNumber) { handle ->
- callback(handle)
- }
- }
- }
- }
+fun SimpleActivity.getPhoneNumberTypeText(type: Int, label: String): String {
+ return if (type == BaseTypes.TYPE_CUSTOM) {
+ label
+ } else {
+ getString(when (type) {
+ Phone.TYPE_MOBILE -> R.string.mobile
+ Phone.TYPE_HOME -> R.string.home
+ Phone.TYPE_WORK -> R.string.work
+ Phone.TYPE_MAIN -> R.string.main_number
+ Phone.TYPE_FAX_WORK -> R.string.work_fax
+ Phone.TYPE_FAX_HOME -> R.string.home_fax
+ Phone.TYPE_PAGER -> R.string.pager
+ else -> R.string.other
+ })
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt
index edefd50a..9ad033d4 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt
@@ -1,23 +1,17 @@
package com.simplemobiletools.contacts.pro.extensions
-import android.annotation.SuppressLint
import android.content.Context
-import android.content.Context.AUDIO_SERVICE
import android.content.Intent
+import android.content.pm.LauncherApps
import android.database.Cursor
-import android.media.AudioManager
+import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Handler
import android.os.Looper
import android.provider.ContactsContract
import androidx.core.content.FileProvider
-import com.simplemobiletools.commons.extensions.getIntValue
-import com.simplemobiletools.commons.extensions.hasPermission
-import com.simplemobiletools.commons.extensions.telecomManager
-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.SimpleContactsHelper
+import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.contacts.pro.BuildConfig
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.EditContactActivity
@@ -29,7 +23,7 @@ import com.simplemobiletools.contacts.pro.interfaces.GroupsDao
import com.simplemobiletools.contacts.pro.models.Contact
import com.simplemobiletools.contacts.pro.models.ContactSource
import com.simplemobiletools.contacts.pro.models.Organization
-import com.simplemobiletools.contacts.pro.models.SIMAccount
+import com.simplemobiletools.contacts.pro.models.SocialAction
import java.io.File
val Context.config: Config get() = Config.newInstance(applicationContext)
@@ -38,8 +32,6 @@ val Context.contactsDB: ContactsDao get() = ContactsDatabase.getInstance(applica
val Context.groupsDB: GroupsDao get() = ContactsDatabase.getInstance(applicationContext).GroupsDao()
-val Context.audioManager: AudioManager get() = getSystemService(AUDIO_SERVICE) as AudioManager
-
fun Context.getEmptyContact(): Contact {
val originalContactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE
val organization = Organization("", "")
@@ -201,7 +193,10 @@ fun Context.getPublicContactSource(source: String, callback: (String) -> Unit) {
var newSource = source
for (contactSource in it) {
if (contactSource.name == source && contactSource.type == TELEGRAM_PACKAGE) {
- newSource += " (${getString(R.string.telegram)})"
+ newSource = getString(R.string.telegram)
+ break
+ } else if (contactSource.name == source && contactSource.type == VIBER_PACKAGE) {
+ newSource = getString(R.string.viber)
break
}
}
@@ -220,7 +215,10 @@ fun Context.getPublicContactSourceSync(source: String, contactSources: ArrayList
var newSource = source
for (contactSource in contactSources) {
if (contactSource.name == source && contactSource.type == TELEGRAM_PACKAGE) {
- newSource += " (${getString(R.string.telegram)})"
+ newSource = getString(R.string.telegram)
+ break
+ } else if (contactSource.name == source && contactSource.type == VIBER_PACKAGE) {
+ newSource = getString(R.string.viber)
break
}
}
@@ -236,16 +234,16 @@ fun Context.sendSMSToContacts(contacts: ArrayList) {
val number = it.phoneNumbers.firstOrNull { it.type == ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE }
?: it.phoneNumbers.firstOrNull()
if (number != null) {
- numbers.append("${number.value};")
+ numbers.append("${Uri.encode(number.value)};")
}
+ }
- val uriString = "smsto:${numbers.toString().trimEnd(';')}"
- Intent(Intent.ACTION_SENDTO, Uri.parse(uriString)).apply {
- if (resolveActivity(packageManager) != null) {
- startActivity(this)
- } else {
- toast(R.string.no_app_found)
- }
+ val uriString = "smsto:${numbers.toString().trimEnd(';')}"
+ Intent(Intent.ACTION_SENDTO, Uri.parse(uriString)).apply {
+ if (resolveActivity(packageManager) != null) {
+ startActivity(this)
+ } else {
+ toast(R.string.no_app_found)
}
}
}
@@ -331,19 +329,69 @@ fun Context.getAllContactSources(): ArrayList {
fun Context.getPrivateContactSource() = ContactSource(SMT_PRIVATE, SMT_PRIVATE, getString(R.string.phone_storage_hidden))
-@SuppressLint("MissingPermission")
-fun Context.getAvailableSIMCardLabels(): ArrayList {
- val SIMAccounts = ArrayList()
- telecomManager.callCapablePhoneAccounts.forEach { account ->
- val phoneAccount = telecomManager.getPhoneAccount(account)
- var label = phoneAccount.label.toString()
- var address = phoneAccount.address.toString()
- if (address.startsWith("tel:") && address.substringAfter("tel:").isNotEmpty()) {
- address = Uri.decode(address.substringAfter("tel:"))
- label += " ($address)"
+fun Context.getSocialActions(id: Int): ArrayList {
+ val uri = ContactsContract.Data.CONTENT_URI
+ val projection = arrayOf(
+ ContactsContract.Data._ID,
+ ContactsContract.Data.DATA3,
+ ContactsContract.Data.MIMETYPE,
+ ContactsContract.Data.ACCOUNT_TYPE_AND_DATA_SET
+ )
+
+ val socialActions = ArrayList()
+ var curActionId = 0
+ val selection = "${ContactsContract.Data.RAW_CONTACT_ID} = ?"
+ val selectionArgs = arrayOf(id.toString())
+ queryCursor(uri, projection, selection, selectionArgs, null, true) { cursor ->
+ val mimetype = cursor.getStringValue(ContactsContract.Data.MIMETYPE)
+ val type = when (mimetype) {
+ // WhatsApp
+ "vnd.android.cursor.item/vnd.com.whatsapp.profile" -> SOCIAL_MESSAGE
+ "vnd.android.cursor.item/vnd.com.whatsapp.voip.call" -> SOCIAL_VOICE_CALL
+ "vnd.android.cursor.item/vnd.com.whatsapp.video.call" -> SOCIAL_VIDEO_CALL
+
+ // Viber
+ "vnd.android.cursor.item/vnd.com.viber.voip.viber_number_call" -> SOCIAL_VOICE_CALL
+ "vnd.android.cursor.item/vnd.com.viber.voip.viber_out_call_viber" -> SOCIAL_VOICE_CALL
+ "vnd.android.cursor.item/vnd.com.viber.voip.viber_out_call_none_viber" -> SOCIAL_VOICE_CALL
+ "vnd.android.cursor.item/vnd.com.viber.voip.viber_number_message" -> SOCIAL_MESSAGE
+
+ // Signal
+ "vnd.android.cursor.item/vnd.org.thoughtcrime.securesms.contact" -> SOCIAL_MESSAGE
+ "vnd.android.cursor.item/vnd.org.thoughtcrime.securesms.call" -> SOCIAL_VOICE_CALL
+
+ // Telegram
+ "vnd.android.cursor.item/vnd.org.telegram.messenger.android.call" -> SOCIAL_VOICE_CALL
+ "vnd.android.cursor.item/vnd.org.telegram.messenger.android.call.video" -> SOCIAL_VIDEO_CALL
+ "vnd.android.cursor.item/vnd.org.telegram.messenger.android.profile" -> SOCIAL_MESSAGE
+ else -> return@queryCursor
}
- val SIM = SIMAccount(phoneAccount.accountHandle, label)
- SIMAccounts.add(SIM)
+
+ val label = cursor.getStringValue(ContactsContract.Data.DATA3)
+ val realID = cursor.getLongValue(ContactsContract.Data._ID)
+ val packageName = cursor.getStringValue(ContactsContract.Data.ACCOUNT_TYPE_AND_DATA_SET)
+ val socialAction = SocialAction(curActionId++, type, label, mimetype, realID, packageName)
+ socialActions.add(socialAction)
}
- return SIMAccounts
+ return socialActions
+}
+
+fun Context.getPackageDrawable(packageName: String): Drawable? {
+ var drawable: Drawable? = null
+ try {
+ // try getting the properly colored launcher icons
+ val launcher = getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
+ val activityList = launcher.getActivityList(packageName, android.os.Process.myUserHandle())[0]
+ drawable = activityList.getBadgedIcon(0)
+ } catch (ignored: Exception) {
+ }
+
+ if (drawable == null) {
+ try {
+ drawable = packageManager.getApplicationIcon(packageName)
+ } catch (ignored: Exception) {
+ }
+ }
+
+ return drawable
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/EditText.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/EditText.kt
deleted file mode 100644
index f4362f14..00000000
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/EditText.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.simplemobiletools.contacts.pro.extensions
-
-import android.view.KeyEvent
-import android.widget.EditText
-
-fun EditText.addCharacter(char: Char) {
- dispatchKeyEvent(getKeyEvent(getCharKeyCode(char)))
-}
-
-fun EditText.getKeyEvent(keyCode: Int) = KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0)
-
-private fun getCharKeyCode(char: Char) = when (char) {
- '0' -> KeyEvent.KEYCODE_0
- '1' -> KeyEvent.KEYCODE_1
- '2' -> KeyEvent.KEYCODE_2
- '3' -> KeyEvent.KEYCODE_3
- '4' -> KeyEvent.KEYCODE_4
- '5' -> KeyEvent.KEYCODE_5
- '6' -> KeyEvent.KEYCODE_6
- '7' -> KeyEvent.KEYCODE_7
- '8' -> KeyEvent.KEYCODE_8
- '9' -> KeyEvent.KEYCODE_9
- '*' -> KeyEvent.KEYCODE_STAR
- '+' -> KeyEvent.KEYCODE_PLUS
- else -> KeyEvent.KEYCODE_POUND
-}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/String.kt
deleted file mode 100644
index 9f775100..00000000
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/String.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.simplemobiletools.contacts.pro.extensions
-
-import android.widget.TextView
-import com.simplemobiletools.commons.helpers.getDateFormats
-import org.joda.time.DateTime
-import org.joda.time.format.DateTimeFormat
-import java.text.DateFormat
-import java.text.SimpleDateFormat
-import java.util.*
-
-fun String.getDateTimeFromDateString(viewToUpdate: TextView? = null): DateTime {
- val dateFormats = getDateFormats()
- var date = DateTime()
- for (format in dateFormats) {
- try {
- date = DateTime.parse(this, DateTimeFormat.forPattern(format))
-
- val formatter = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault())
- var localPattern = (formatter as SimpleDateFormat).toLocalizedPattern()
-
- val hasYear = format.contains("y")
- if (!hasYear) {
- localPattern = localPattern.replace("y", "").trim()
- date = date.withYear(DateTime().year)
- }
-
- val formattedString = date.toString(localPattern)
- viewToUpdate?.text = formattedString
- break
- } catch (ignored: Exception) {
- }
- }
- return date
-}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt
index 2502edd8..f8460f1f 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt
@@ -2,11 +2,11 @@ package com.simplemobiletools.contacts.pro.fragments
import android.content.Context
import android.util.AttributeSet
+import com.simplemobiletools.commons.helpers.TAB_FAVORITES
import com.simplemobiletools.contacts.pro.activities.MainActivity
import com.simplemobiletools.contacts.pro.activities.SimpleActivity
import com.simplemobiletools.contacts.pro.dialogs.SelectContactsDialog
import com.simplemobiletools.contacts.pro.helpers.ContactsHelper
-import com.simplemobiletools.contacts.pro.helpers.FAVORITES_TAB_MASK
class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) {
override fun fabClicked() {
@@ -25,7 +25,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
removeFavorites(removedContacts)
}
- (activity as? MainActivity)?.refreshContacts(FAVORITES_TAB_MASK)
+ (activity as? MainActivity)?.refreshContacts(TAB_FAVORITES)
}
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/GroupsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/GroupsFragment.kt
index 22ba261a..23f1bf37 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/GroupsFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/GroupsFragment.kt
@@ -2,10 +2,10 @@ package com.simplemobiletools.contacts.pro.fragments
import android.content.Context
import android.util.AttributeSet
+import com.simplemobiletools.commons.helpers.TAB_GROUPS
import com.simplemobiletools.contacts.pro.activities.MainActivity
import com.simplemobiletools.contacts.pro.activities.SimpleActivity
import com.simplemobiletools.contacts.pro.dialogs.CreateNewGroupDialog
-import com.simplemobiletools.contacts.pro.helpers.GROUPS_TAB_MASK
class GroupsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) {
override fun fabClicked() {
@@ -19,7 +19,7 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : MyViewPager
private fun showNewGroupsDialog() {
CreateNewGroupDialog(activity as SimpleActivity) {
- (activity as? MainActivity)?.refreshContacts(GROUPS_TAB_MASK)
+ (activity as? MainActivity)?.refreshContacts(TAB_GROUPS)
}
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt
index 2d108fb2..e526708b 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt
@@ -8,9 +8,7 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout
import com.reddit.indicatorfastscroll.FastScrollItemIndicator
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME
-import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME
-import com.simplemobiletools.commons.helpers.SORT_BY_SURNAME
+import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.GroupContactsActivity
import com.simplemobiletools.contacts.pro.activities.InsertOrEditContactActivity
@@ -81,7 +79,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fun textColorChanged(color: Int) {
when {
this is GroupsFragment -> (fragment_list.adapter as GroupsAdapter).updateTextColor(color)
- else -> (fragment_list.adapter as ContactsAdapter).apply {
+ else -> (fragment_list.adapter as? ContactsAdapter)?.apply {
updateTextColor(color)
}
}
@@ -94,29 +92,21 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fragment_fastscroller?.updateBubblePrimaryColor()
letter_fastscroller_thumb?.thumbColor = config.primaryColor.getColorStateList()
letter_fastscroller_thumb?.textColor = config.primaryColor.getContrastColor()
-
- (fragment_list.adapter as? ContactsAdapter)?.apply {
- adjustedPrimaryColor = context.getAdjustedPrimaryColor()
- }
-
- (fragment_list.adapter as? GroupsAdapter)?.apply {
- adjustedPrimaryColor = context.getAdjustedPrimaryColor()
- }
}
fun startNameWithSurnameChanged(startNameWithSurname: Boolean) {
if (this !is GroupsFragment) {
(fragment_list.adapter as? ContactsAdapter)?.apply {
config.sorting = if (startNameWithSurname) SORT_BY_SURNAME else SORT_BY_FIRST_NAME
- (this@MyViewPagerFragment.activity!! as MainActivity).refreshContacts(CONTACTS_TAB_MASK or FAVORITES_TAB_MASK)
+ (this@MyViewPagerFragment.activity!! as MainActivity).refreshContacts(TAB_CONTACTS or TAB_FAVORITES)
}
}
}
fun refreshContacts(contacts: ArrayList) {
- if ((config.showTabs and CONTACTS_TAB_MASK == 0 && this is ContactsFragment && activity !is InsertOrEditContactActivity) ||
- (config.showTabs and FAVORITES_TAB_MASK == 0 && this is FavoritesFragment) ||
- (config.showTabs and GROUPS_TAB_MASK == 0 && this is GroupsFragment)) {
+ if ((config.showTabs and TAB_CONTACTS == 0 && this is ContactsFragment && activity !is InsertOrEditContactActivity) ||
+ (config.showTabs and TAB_FAVORITES == 0 && this is FavoritesFragment) ||
+ (config.showTabs and TAB_GROUPS == 0 && this is GroupsFragment)) {
return
}
@@ -172,7 +162,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
}
}
- storedGroups = storedGroups.asSequence().sortedWith(compareBy { it.title.normalizeString() }).toMutableList() as ArrayList
+ storedGroups = storedGroups.asSequence().sortedWith(compareBy { it.title.toLowerCase().normalizeString() }).toMutableList() as ArrayList
fragment_placeholder_2.beVisibleIf(storedGroups.isEmpty())
fragment_placeholder.beVisibleIf(storedGroups.isEmpty())
@@ -296,11 +286,13 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
val adapter = fragment_list.adapter
if (adapter is ContactsAdapter) {
val shouldNormalize = text.normalizeString() == text
- val convertLetters = config.showDialpadLetters
val filtered = contactsIgnoringSearch.filter {
getProperText(it.getNameToDisplay(), shouldNormalize).contains(text, true) ||
getProperText(it.nickname, shouldNormalize).contains(text, true) ||
- it.doesContainPhoneNumber(text, convertLetters) ||
+ it.phoneNumbers.any {
+ text.normalizePhoneNumber().isNotEmpty() && (it.normalizedNumber
+ ?: it.value).contains(text.normalizePhoneNumber(), true)
+ } ||
it.emails.any { it.value.contains(text, true) } ||
it.addresses.any { getProperText(it.value, shouldNormalize).contains(text, true) } ||
it.IMs.any { it.value.contains(text, true) } ||
@@ -359,7 +351,6 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
private fun updateViewStuff() {
context.updateTextColors(fragment_wrapper.parent as ViewGroup)
fragment_fastscroller?.updateBubbleColors()
- fragment_fastscroller?.allowBubbleDisplay = true
fragment_placeholder_2?.setTextColor(context.getAdjustedPrimaryColor())
letter_fastscroller_thumb?.fontSize = context.getTextSize()
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/CallManager.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/CallManager.kt
deleted file mode 100644
index 5c26710d..00000000
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/CallManager.kt
+++ /dev/null
@@ -1,86 +0,0 @@
-package com.simplemobiletools.contacts.pro.helpers
-
-import android.annotation.SuppressLint
-import android.content.Context
-import android.net.Uri
-import android.telecom.Call
-import android.telecom.VideoProfile
-import com.simplemobiletools.commons.helpers.SimpleContactsHelper
-import com.simplemobiletools.commons.helpers.ensureBackgroundThread
-import com.simplemobiletools.contacts.pro.extensions.contactsDB
-import com.simplemobiletools.contacts.pro.models.CallContact
-
-// inspired by https://github.com/Chooloo/call_manage
-@SuppressLint("NewApi")
-class CallManager {
- companion object {
- var call: Call? = null
-
- fun accept() {
- call?.answer(VideoProfile.STATE_AUDIO_ONLY)
- }
-
- fun reject() {
- if (call != null) {
- if (call!!.state == Call.STATE_RINGING) {
- call!!.reject(false, null)
- } else {
- call!!.disconnect()
- }
- }
- }
-
- fun registerCallback(callback: Call.Callback) {
- if (call != null) {
- call!!.registerCallback(callback)
- }
- }
-
- fun unregisterCallback(callback: Call.Callback) {
- call?.unregisterCallback(callback)
- }
-
- fun getState() = if (call == null) {
- Call.STATE_DISCONNECTED
- } else {
- call!!.state
- }
-
- fun keypad(c: Char) {
- call?.playDtmfTone(c)
- call?.stopDtmfTone()
- }
-
- fun getCallContact(context: Context, callback: (CallContact?) -> Unit) {
- val callContact = CallContact("", "", "")
- if (call == null || call!!.details == null || call!!.details!!.handle == null) {
- callback(callContact)
- return
- }
-
- val uri = Uri.decode(call!!.details.handle.toString())
- if (uri.startsWith("tel:")) {
- val number = uri.substringAfter("tel:")
- callContact.number = number
- callContact.name = SimpleContactsHelper(context).getNameFromPhoneNumber(number)
- callContact.photoUri = SimpleContactsHelper(context).getPhotoUriFromPhoneNumber(number)
-
- if (callContact.name == callContact.number) {
- ensureBackgroundThread {
- val localContact = context.contactsDB.getContactWithNumber("%$number%")
- if (localContact != null) {
- val storedGroups = ContactsHelper(context).getStoredGroupsSync()
- val newContact = LocalContactsHelper(context).convertLocalContactToContact(localContact, storedGroups)
- callContact.name = newContact!!.getNameToDisplay()
- callContact.photoUri = newContact.photoUri
- }
-
- callback(callContact)
- }
- } else {
- callback(callContact)
- }
- }
- }
- }
-}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt
index b931a9ee..4a2e34e3 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt
@@ -1,11 +1,7 @@
package com.simplemobiletools.contacts.pro.helpers
import android.content.Context
-import android.net.Uri
-import com.google.gson.Gson
-import com.google.gson.reflect.TypeToken
import com.simplemobiletools.commons.helpers.BaseConfig
-import com.simplemobiletools.contacts.pro.models.SpeedDial
class Config(context: Context) : BaseConfig(context) {
companion object {
@@ -28,10 +24,6 @@ class Config(context: Context) : BaseConfig(context) {
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()
-
var lastUsedContactSource: String
get() = prefs.getString(LAST_USED_CONTACT_SOURCE, "")!!
set(lastUsedContactSource) = prefs.edit().putString(LAST_USED_CONTACT_SOURCE, lastUsedContactSource).apply()
@@ -57,10 +49,6 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getBoolean(SHOW_DIALPAD_BUTTON, true)
set(showDialpadButton) = prefs.edit().putBoolean(SHOW_DIALPAD_BUTTON, showDialpadButton).apply()
- var showDialpadLetters: Boolean
- get() = prefs.getBoolean(SHOW_DIALPAD_LETTERS, true)
- set(showDialpadLetters) = prefs.edit().putBoolean(SHOW_DIALPAD_LETTERS, showDialpadLetters).apply()
-
var wasLocalAccountInitialized: Boolean
get() = prefs.getBoolean(WAS_LOCAL_ACCOUNT_INITIALIZED, false)
set(wasLocalAccountInitialized) = prefs.edit().putBoolean(WAS_LOCAL_ACCOUNT_INITIALIZED, wasLocalAccountInitialized).apply()
@@ -73,23 +61,7 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getString(SPEED_DIAL, "")!!
set(speedDial) = prefs.edit().putString(SPEED_DIAL, speedDial).apply()
- fun saveCustomSIM(number: String, SIMlabel: String) {
- prefs.edit().putString(REMEMBER_SIM_PREFIX + number, Uri.encode(SIMlabel)).apply()
- }
-
- fun getCustomSIM(number: String) = prefs.getString(REMEMBER_SIM_PREFIX + number, "")
-
- fun getSpeedDialValues(): ArrayList {
- val speedDialType = object : TypeToken>() {}.type
- val speedDialValues = Gson().fromJson>(speedDial, speedDialType) ?: ArrayList(1)
-
- for (i in 1..9) {
- val speedDial = SpeedDial(i, "", "")
- if (speedDialValues.firstOrNull { it.id == i } == null) {
- speedDialValues.add(speedDial)
- }
- }
-
- return speedDialValues
- }
+ var showPrivateContacts: Boolean
+ get() = prefs.getBoolean(SHOW_PRIVATE_CONTACTS, true)
+ set(showPrivateContacts) = prefs.edit().putBoolean(SHOW_PRIVATE_CONTACTS, showPrivateContacts).apply()
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt
index 3fdf1044..ca6720f4 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt
@@ -2,6 +2,9 @@ package com.simplemobiletools.contacts.pro.helpers
import android.provider.ContactsContract.CommonDataKinds
import com.simplemobiletools.commons.extensions.normalizeString
+import com.simplemobiletools.commons.helpers.TAB_CONTACTS
+import com.simplemobiletools.commons.helpers.TAB_FAVORITES
+import com.simplemobiletools.commons.helpers.TAB_GROUPS
import com.simplemobiletools.contacts.pro.models.LocalContact
// shared prefs
@@ -9,32 +12,24 @@ 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_2"
-const val START_NAME_WITH_SURNAME = "start_name_with_surname"
const val LAST_USED_CONTACT_SOURCE = "last_used_contact_source"
const val ON_CONTACT_CLICK = "on_contact_click"
const val SHOW_CONTACT_FIELDS = "show_contact_fields"
const val SHOW_TABS = "show_tabs"
const val SHOW_CALL_CONFIRMATION = "show_call_confirmation"
const val SHOW_DIALPAD_BUTTON = "show_dialpad_button"
-const val SHOW_DIALPAD_LETTERS = "show_dialpad_letters"
const val SPEED_DIAL = "speed_dial"
const val LAST_EXPORT_PATH = "last_export_path"
const val WAS_LOCAL_ACCOUNT_INITIALIZED = "was_local_account_initialized"
-const val REMEMBER_SIM_PREFIX = "remember_sim_"
+const val SHOW_PRIVATE_CONTACTS = "show_private_contacts"
-const val CONTACT_ID = "contact_id"
const val SMT_PRIVATE = "smt_private" // used at the contact source of local contacts hidden from other apps
-const val IS_PRIVATE = "is_private"
const val GROUP = "group"
const val IS_FROM_SIMPLE_CONTACTS = "is_from_simple_contacts"
const val ADD_NEW_CONTACT_NUMBER = "add_new_contact_number"
const val FIRST_CONTACT_ID = 1000000
const val FIRST_GROUP_ID = 10000L
-private const val PATH = "com.simplemobiletools.contacts.action."
-const val ACCEPT_CALL = PATH + "accept_call"
-const val DECLINE_CALL = PATH + "decline_call"
-
// extras used at third party intents
const val KEY_NAME = "name"
const val KEY_EMAIL = "email"
@@ -46,14 +41,11 @@ const val LOCATION_GROUP_CONTACTS = 2
const val LOCATION_DIALPAD = 3
const val LOCATION_INSERT_OR_EDIT = 4
-const val CONTACTS_TAB_MASK = 1
-const val FAVORITES_TAB_MASK = 2
-const val GROUPS_TAB_MASK = 8
-const val ALL_TABS_MASK = CONTACTS_TAB_MASK or FAVORITES_TAB_MASK or GROUPS_TAB_MASK
+const val ALL_TABS_MASK = TAB_CONTACTS or TAB_FAVORITES or TAB_GROUPS
-val tabsList = arrayListOf(CONTACTS_TAB_MASK,
- FAVORITES_TAB_MASK,
- GROUPS_TAB_MASK
+val tabsList = arrayListOf(TAB_CONTACTS,
+ TAB_FAVORITES,
+ TAB_GROUPS
)
// contact photo changes
@@ -114,6 +106,16 @@ const val DEFAULT_IM_TYPE = CommonDataKinds.Im.PROTOCOL_SKYPE
const val TELEGRAM_PACKAGE = "org.telegram.messenger"
const val SIGNAL_PACKAGE = "org.thoughtcrime.securesms"
const val WHATSAPP_PACKAGE = "com.whatsapp"
+const val VIBER_PACKAGE = "com.viber.voip"
+
+const val WHATSAPP = "whatsapp"
+const val SIGNAL = "signal"
+const val VIBER = "viber"
+const val TELEGRAM = "telegram"
+
+const val SOCIAL_VOICE_CALL = 0
+const val SOCIAL_VIDEO_CALL = 1
+const val SOCIAL_MESSAGE = 2
fun getEmptyLocalContact() = LocalContact(0, "", "", "", "", "", "", null, "", ArrayList(), ArrayList(), ArrayList(), 0, ArrayList(), "", ArrayList(), "", "", ArrayList(), ArrayList())
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt
index f0b2ae1a..b771c496 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt
@@ -117,7 +117,7 @@ class ContactsHelper(val context: Context) {
val type = cursor.getStringValue(RawContacts.ACCOUNT_TYPE) ?: ""
var publicName = name
if (type == TELEGRAM_PACKAGE) {
- publicName += " (${context.getString(R.string.telegram)})"
+ publicName = context.getString(R.string.telegram)
}
val source = ContactSource(name, type, publicName)
@@ -770,7 +770,9 @@ class ContactsHelper(val context: Context) {
if (ContentResolver.getIsSyncable(it, AUTHORITY) == 1) {
var publicName = it.name
if (it.type == TELEGRAM_PACKAGE) {
- publicName += " (${context.getString(R.string.telegram)})"
+ publicName = context.getString(R.string.telegram)
+ } else if (it.type == VIBER_PACKAGE) {
+ publicName = context.getString(R.string.viber)
}
val contactSource = ContactSource(it.name, it.type, publicName)
sources.add(contactSource)
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt
index d4bf5d95..cb415e7a 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt
@@ -4,8 +4,10 @@ import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
+import android.provider.ContactsContract.CommonDataKinds.Event
import android.provider.MediaStore
import com.simplemobiletools.commons.extensions.getChoppedList
+import com.simplemobiletools.commons.models.SimpleContact
import com.simplemobiletools.contacts.pro.extensions.contactsDB
import com.simplemobiletools.contacts.pro.extensions.getByteArray
import com.simplemobiletools.contacts.pro.extensions.getEmptyContact
@@ -16,8 +18,8 @@ import com.simplemobiletools.contacts.pro.models.LocalContact
import com.simplemobiletools.contacts.pro.models.Organization
class LocalContactsHelper(val context: Context) {
- fun getAllContacts(): ArrayList {
- val contacts = context.contactsDB.getContacts()
+ fun getAllContacts(favoritesOnly: Boolean = false): ArrayList {
+ val contacts = if (favoritesOnly) context.contactsDB.getFavoriteContacts() else context.contactsDB.getContacts()
val storedGroups = ContactsHelper(context).getStoredGroupsSync()
return contacts.map { convertLocalContactToContact(it, storedGroups) }.toMutableList() as ArrayList
}
@@ -104,7 +106,6 @@ class LocalContactsHelper(val context: Context) {
surname = localContact.surname
suffix = localContact.suffix
nickname = localContact.nickname
- photoUri = ""
phoneNumbers = localContact.phoneNumbers
emails = localContact.emails
addresses = localContact.addresses
@@ -152,4 +153,17 @@ class LocalContactsHelper(val context: Context) {
IMs = contact.IMs
}
}
+
+ private fun convertContactToSimpleContact(contact: Contact?): SimpleContact? {
+ return if (contact == null || contact.phoneNumbers.isEmpty()) {
+ null
+ } else {
+ val phoneNumbers = contact.phoneNumbers.map { it.value }.toMutableList() as ArrayList
+ val birthdays = contact.events.filter { it.type == Event.TYPE_BIRTHDAY }.map { it.value }.toMutableList() as ArrayList
+ val anniversaries = contact.events.filter { it.type == Event.TYPE_ANNIVERSARY }.map { it.value }.toMutableList() as ArrayList
+ SimpleContact(contact.id, contact.id, contact.getNameToDisplay(), contact.photoUri, phoneNumbers, birthdays, anniversaries)
+ }
+ }
+
+ fun getPrivateSimpleContactsSync(favoritesOnly: Boolean) = getAllContacts(favoritesOnly).mapNotNull { convertContactToSimpleContact(it) }
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt
index 972ba02a..d819f3fe 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt
@@ -5,11 +5,11 @@ import android.provider.ContactsContract.CommonDataKinds
import android.provider.ContactsContract.CommonDataKinds.*
import android.provider.MediaStore
import com.simplemobiletools.commons.activities.BaseSimpleActivity
+import com.simplemobiletools.commons.extensions.getDateTimeFromDateString
import com.simplemobiletools.commons.extensions.showErrorToast
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.extensions.getByteArray
-import com.simplemobiletools.contacts.pro.extensions.getDateTimeFromDateString
import com.simplemobiletools.contacts.pro.helpers.VcfExporter.ExportResult.EXPORT_FAIL
import com.simplemobiletools.contacts.pro.models.Contact
import ezvcard.Ezvcard
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt
index 58d219d5..db2ce7a4 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt
@@ -73,7 +73,9 @@ class VcfImporter(val activity: SimpleActivity) {
""
}
- emails.add(Email(email, type, label))
+ if (email.isNotEmpty()) {
+ emails.add(Email(email, type, label))
+ }
}
val addresses = ArrayList()
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt
index 42621e76..e419e78b 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt
@@ -11,6 +11,9 @@ interface ContactsDao {
@Query("SELECT * FROM contacts")
fun getContacts(): List
+ @Query("SELECT * FROM contacts WHERE starred = 1")
+ fun getFavoriteContacts(): List
+
@Query("SELECT * FROM contacts WHERE id = :id")
fun getContactWithId(id: Int): LocalContact?
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/RemoveSpeedDialListener.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/RemoveSpeedDialListener.kt
deleted file mode 100644
index ccb59777..00000000
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/RemoveSpeedDialListener.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.simplemobiletools.contacts.pro.interfaces
-
-interface RemoveSpeedDialListener {
- fun removeSpeedDial(ids: ArrayList)
-}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/CallContact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/CallContact.kt
deleted file mode 100644
index 2390f8b7..00000000
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/CallContact.kt
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.simplemobiletools.contacts.pro.models
-
-// a simpler Contact model containing just info needed at the call screen
-data class CallContact(var name: String, var photoUri: String, var number: String)
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt
index ab8eba32..83e0ff17 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt
@@ -6,6 +6,7 @@ import com.simplemobiletools.commons.extensions.normalizePhoneNumber
import com.simplemobiletools.commons.extensions.normalizeString
import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME
import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME
+import com.simplemobiletools.commons.helpers.SORT_BY_SURNAME
import com.simplemobiletools.commons.helpers.SORT_DESCENDING
import com.simplemobiletools.contacts.pro.helpers.SMT_PRIVATE
@@ -32,10 +33,14 @@ data class Contact(var id: Int, var prefix: String, var firstName: String, var m
firstString = middleName.normalizeString()
secondString = other.middleName.normalizeString()
}
- else -> {
+ sorting and SORT_BY_SURNAME != 0 -> {
firstString = surname.normalizeString()
secondString = other.surname.normalizeString()
}
+ else -> {
+ firstString = getNameToDisplay().normalizeString()
+ secondString = other.getNameToDisplay().normalizeString()
+ }
}
if (firstString.isEmpty() && firstName.isEmpty() && middleName.isEmpty() && surname.isEmpty()) {
@@ -88,12 +93,9 @@ data class Contact(var id: Int, var prefix: String, var firstName: String, var m
}
fun getNameToDisplay(): String {
- var firstPart = if (startWithSurname) surname else firstName
- if (middleName.isNotEmpty()) {
- firstPart += " $middleName"
- }
-
- val lastPart = if (startWithSurname) firstName else surname
+ val firstMiddle = "$firstName $middleName".trim()
+ val firstPart = if (startWithSurname) surname else firstMiddle
+ val lastPart = if (startWithSurname) firstMiddle else surname
val suffixComma = if (suffix.isEmpty()) "" else ", $suffix"
val fullName = "$prefix $firstPart $lastPart$suffixComma".trim()
return if (fullName.isEmpty()) {
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SIMAccount.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SIMAccount.kt
deleted file mode 100644
index aca810f4..00000000
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SIMAccount.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.simplemobiletools.contacts.pro.models
-
-import android.telecom.PhoneAccountHandle
-
-data class SIMAccount(val handle: PhoneAccountHandle, val label: String)
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SocialAction.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SocialAction.kt
new file mode 100644
index 00000000..a0064fa4
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SocialAction.kt
@@ -0,0 +1,3 @@
+package com.simplemobiletools.contacts.pro.models
+
+data class SocialAction(var actionId: Int, var type: Int, var label: String, var mimetype: String, val dataId: Long, val packageName: String)
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SpeedDial.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SpeedDial.kt
deleted file mode 100644
index a54a10f1..00000000
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SpeedDial.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.simplemobiletools.contacts.pro.models
-
-data class SpeedDial(val id: Int, var number: String, var displayName: String) {
- fun isValid() = number.trim().isNotEmpty()
-}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/receivers/CallActionReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/receivers/CallActionReceiver.kt
deleted file mode 100644
index 9ae27eb3..00000000
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/receivers/CallActionReceiver.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.simplemobiletools.contacts.pro.receivers
-
-import android.content.BroadcastReceiver
-import android.content.Context
-import android.content.Intent
-import com.simplemobiletools.contacts.pro.helpers.ACCEPT_CALL
-import com.simplemobiletools.contacts.pro.helpers.CallManager
-import com.simplemobiletools.contacts.pro.helpers.DECLINE_CALL
-
-class CallActionReceiver : BroadcastReceiver() {
- override fun onReceive(context: Context, intent: Intent) {
- when (intent.action) {
- ACCEPT_CALL -> CallManager.accept()
- DECLINE_CALL -> CallManager.reject()
- }
- }
-}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/CallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/CallService.kt
deleted file mode 100644
index 644628ee..00000000
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/CallService.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.simplemobiletools.contacts.pro.services
-
-import android.content.Intent
-import android.telecom.Call
-import android.telecom.InCallService
-import com.simplemobiletools.contacts.pro.activities.CallActivity
-import com.simplemobiletools.contacts.pro.helpers.CallManager
-
-class CallService : InCallService() {
- override fun onCallAdded(call: Call) {
- super.onCallAdded(call)
- val intent = Intent(this, CallActivity::class.java)
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- startActivity(intent)
- CallManager.call = call
- }
-
- override fun onCallRemoved(call: Call) {
- super.onCallRemoved(call)
- CallManager.call = null
- }
-}
diff --git a/app/src/main/res/drawable/ic_backspace_vector.xml b/app/src/main/res/drawable/ic_backspace_vector.xml
deleted file mode 100644
index 06dbed70..00000000
--- a/app/src/main/res/drawable/ic_backspace_vector.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_call_accept.xml b/app/src/main/res/drawable/ic_call_accept.xml
deleted file mode 100644
index 546b3ac0..00000000
--- a/app/src/main/res/drawable/ic_call_accept.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
- -
-
-
-
-
-
-
-
diff --git a/app/src/main/res/drawable/ic_call_decline.xml b/app/src/main/res/drawable/ic_call_decline.xml
deleted file mode 100644
index 5754ba70..00000000
--- a/app/src/main/res/drawable/ic_call_decline.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
- -
-
-
-
-
-
-
-
diff --git a/app/src/main/res/drawable/ic_dialpad_vector.xml b/app/src/main/res/drawable/ic_dialpad_vector.xml
deleted file mode 100644
index e5b16ae3..00000000
--- a/app/src/main/res/drawable/ic_dialpad_vector.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_microphone_off_vector.xml b/app/src/main/res/drawable/ic_microphone_off_vector.xml
deleted file mode 100644
index c05115e4..00000000
--- a/app/src/main/res/drawable/ic_microphone_off_vector.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_phone_down_red_vector.xml b/app/src/main/res/drawable/ic_phone_down_red_vector.xml
deleted file mode 100644
index 763a320e..00000000
--- a/app/src/main/res/drawable/ic_phone_down_red_vector.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_phone_down_vector.xml b/app/src/main/res/drawable/ic_phone_down_vector.xml
deleted file mode 100644
index 6487b6a6..00000000
--- a/app/src/main/res/drawable/ic_phone_down_vector.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_phone_green_vector.xml b/app/src/main/res/drawable/ic_phone_green_vector.xml
deleted file mode 100644
index 312e1562..00000000
--- a/app/src/main/res/drawable/ic_phone_green_vector.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_speaker_off_vector.xml b/app/src/main/res/drawable/ic_speaker_off_vector.xml
deleted file mode 100644
index 17adb3f9..00000000
--- a/app/src/main/res/drawable/ic_speaker_off_vector.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_speaker_on_vector.xml b/app/src/main/res/drawable/ic_speaker_on_vector.xml
deleted file mode 100644
index bc7422fc..00000000
--- a/app/src/main/res/drawable/ic_speaker_on_vector.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ripple_background.xml b/app/src/main/res/drawable/ripple_background.xml
deleted file mode 100644
index 783c769d..00000000
--- a/app/src/main/res/drawable/ripple_background.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/shortcut_dialpad.xml b/app/src/main/res/drawable/shortcut_dialpad.xml
deleted file mode 100644
index e92c7d47..00000000
--- a/app/src/main/res/drawable/shortcut_dialpad.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
- -
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/activity_call.xml b/app/src/main/res/layout/activity_call.xml
deleted file mode 100644
index 644dd093..00000000
--- a/app/src/main/res/layout/activity_call.xml
+++ /dev/null
@@ -1,202 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/activity_dialpad.xml b/app/src/main/res/layout/activity_dialpad.xml
deleted file mode 100644
index 45da045d..00000000
--- a/app/src/main/res/layout/activity_dialpad.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/activity_edit_contact.xml b/app/src/main/res/layout/activity_edit_contact.xml
index 48e1425b..eabe713f 100644
--- a/app/src/main/res/layout/activity_edit_contact.xml
+++ b/app/src/main/res/layout/activity_edit_contact.xml
@@ -1,539 +1,563 @@
-
+ android:layout_height="match_parent">
-
+ android:scrollbars="none"
+ android:visibility="gone">
-
-
-
-
-
+ android:layout_height="wrap_content">
+
+
+
+
+ android:padding="@dimen/tiny_margin"
+ android:src="@drawable/ic_star_off_vector" />
+
+
+ android:paddingTop="@dimen/medium_margin"
+ android:paddingEnd="@dimen/small_margin"
+ android:paddingBottom="@dimen/small_margin"
+ android:src="@drawable/ic_person_vector" />
+
+
+
+
+
+
+
+
+
+
+
+
+ android:paddingTop="@dimen/medium_margin"
+ android:paddingEnd="@dimen/small_margin"
+ android:paddingBottom="@dimen/small_margin"
+ android:src="@drawable/ic_phone_vector" />
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:layout_height="?attr/actionBarSize"
+ app:menu="@menu/menu_edit_contact"
+ app:navigationIcon="@drawable/ic_arrow_left_vector" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/app/src/main/res/layout/activity_manage_speed_dial.xml b/app/src/main/res/layout/activity_manage_speed_dial.xml
deleted file mode 100644
index 8f87e71a..00000000
--- a/app/src/main/res/layout/activity_manage_speed_dial.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
index fbfd5d15..1970f7a2 100644
--- a/app/src/main/res/layout/activity_settings.xml
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -1,6 +1,5 @@
-
+ android:text="@string/customize_colors" />
@@ -52,7 +51,7 @@
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:text="@string/use_english_language"
- app:switchPadding="@dimen/medium_margin"/>
+ app:switchPadding="@dimen/medium_margin" />
@@ -69,11 +68,11 @@
+ android:text="@string/manage_shown_contact_fields" />
@@ -90,53 +89,43 @@
+ android:text="@string/manage_shown_tabs" />
-
-
-
-
+ android:layout_toStartOf="@+id/settings_default_tab"
+ android:paddingLeft="@dimen/medium_margin"
+ android:paddingRight="@dimen/medium_margin"
+ android:text="@string/default_tab_to_open" />
+ android:layout_alignParentEnd="true"
+ android:layout_marginEnd="@dimen/medium_margin"
+ android:background="@null"
+ android:clickable="false" />
@@ -159,7 +148,7 @@
android:layout_toStartOf="@+id/settings_font_size"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
- android:text="@string/font_size"/>
+ android:text="@string/font_size" />
+ android:clickable="false" />
@@ -191,7 +180,7 @@
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:text="@string/show_contact_thumbnails"
- app:switchPadding="@dimen/medium_margin"/>
+ app:switchPadding="@dimen/medium_margin" />
@@ -214,7 +203,7 @@
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:text="@string/show_phone_numbers"
- app:switchPadding="@dimen/medium_margin"/>
+ app:switchPadding="@dimen/medium_margin" />
@@ -237,7 +226,7 @@
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:text="@string/show_only_contacts_with_numbers"
- app:switchPadding="@dimen/medium_margin"/>
+ app:switchPadding="@dimen/medium_margin" />
@@ -260,7 +249,7 @@
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:text="@string/start_name_with_surname"
- app:switchPadding="@dimen/medium_margin"/>
+ app:switchPadding="@dimen/medium_margin" />
@@ -283,7 +272,7 @@
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:text="@string/show_call_confirmation_dialog"
- app:switchPadding="@dimen/medium_margin"/>
+ app:switchPadding="@dimen/medium_margin" />
@@ -306,12 +295,12 @@
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:text="@string/show_dialpad_button"
- app:switchPadding="@dimen/medium_margin"/>
+ app:switchPadding="@dimen/medium_margin" />
+ android:text="@string/show_private_contacts"
+ app:switchPadding="@dimen/medium_margin" />
@@ -352,7 +341,7 @@
android:layout_toStartOf="@+id/settings_on_contact_click"
android:paddingStart="@dimen/medium_margin"
android:paddingEnd="@dimen/medium_margin"
- android:text="@string/on_contact_click"/>
+ android:text="@string/on_contact_click" />
+ android:clickable="false" />
diff --git a/app/src/main/res/layout/activity_view_contact.xml b/app/src/main/res/layout/activity_view_contact.xml
index f1809df4..b7a3e0fd 100644
--- a/app/src/main/res/layout/activity_view_contact.xml
+++ b/app/src/main/res/layout/activity_view_contact.xml
@@ -1,5 +1,7 @@
@@ -8,32 +10,36 @@
android:id="@+id/contact_scrollview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:scrollbars="none"
android:visibility="gone">
+ android:layout_height="wrap_content">
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/top_contact_image_height"
+ android:layout_marginBottom="@dimen/normal_margin"
+ tools:src="@drawable/ic_person_vector" />
+
+
+ android:gravity="bottom|end"
+ android:paddingEnd="@dimen/medium_margin"
+ android:paddingBottom="@dimen/medium_margin">
@@ -65,8 +73,8 @@
android:layout_marginStart="@dimen/normal_margin"
android:adjustViewBounds="true"
android:background="?attr/selectableItemBackgroundBorderless"
- android:paddingLeft="@dimen/small_margin"
- android:paddingRight="@dimen/small_margin"
+ android:paddingStart="@dimen/small_margin"
+ android:paddingEnd="@dimen/small_margin"
android:scaleType="fitCenter"
android:src="@drawable/ic_phone_vector" />
@@ -77,8 +85,8 @@
android:layout_marginStart="@dimen/normal_margin"
android:adjustViewBounds="true"
android:background="?attr/selectableItemBackgroundBorderless"
- android:paddingLeft="@dimen/small_margin"
- android:paddingRight="@dimen/small_margin"
+ android:paddingStart="@dimen/small_margin"
+ android:paddingEnd="@dimen/small_margin"
android:scaleType="fitCenter"
android:src="@drawable/ic_sms_vector" />
@@ -89,6 +97,7 @@
android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size"
android:layout_below="@+id/contact_photo"
+ android:layout_marginStart="@dimen/normal_margin"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
@@ -106,6 +115,7 @@
android:maxLines="1"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
+ android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true"
android:textSize="@dimen/bigger_text_size" />
@@ -122,6 +132,7 @@
android:maxLines="1"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
+ android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true"
android:textSize="@dimen/bigger_text_size" />
@@ -138,6 +149,7 @@
android:maxLines="1"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
+ android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true"
android:textSize="@dimen/bigger_text_size" />
@@ -154,6 +166,7 @@
android:maxLines="1"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
+ android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true"
android:textSize="@dimen/bigger_text_size" />
@@ -170,6 +183,7 @@
android:maxLines="1"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
+ android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true"
android:textSize="@dimen/bigger_text_size" />
@@ -186,6 +200,7 @@
android:maxLines="1"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
+ android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true"
android:textSize="@dimen/bigger_text_size" />
@@ -195,6 +210,7 @@
android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_numbers_holder"
+ android:layout_marginStart="@dimen/normal_margin"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
@@ -206,6 +222,7 @@
android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_emails_holder"
+ android:layout_marginStart="@dimen/normal_margin"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
@@ -217,6 +234,7 @@
android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_addresses_holder"
+ android:layout_marginStart="@dimen/normal_margin"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
@@ -228,6 +246,7 @@
android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_ims_holder"
+ android:layout_marginStart="@dimen/normal_margin"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
@@ -239,6 +258,7 @@
android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_events_holder"
+ android:layout_marginStart="@dimen/normal_margin"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
@@ -250,6 +270,7 @@
android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_notes"
+ android:layout_marginStart="@dimen/normal_margin"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
@@ -261,6 +282,7 @@
android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_organization_company"
+ android:layout_marginStart="@dimen/normal_margin"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
@@ -272,6 +294,7 @@
android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_websites_holder"
+ android:layout_marginStart="@dimen/normal_margin"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
@@ -283,6 +306,7 @@
android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_groups_holder"
+ android:layout_marginStart="@dimen/normal_margin"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
@@ -294,6 +318,7 @@
android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_sources_holder"
+ android:layout_marginStart="@dimen/normal_margin"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
@@ -307,7 +332,6 @@
android:layout_below="@+id/contact_nickname"
android:layout_toEndOf="@+id/contact_numbers_image"
android:orientation="vertical"
- android:paddingStart="@dimen/small_margin"
android:visibility="gone" />
+ android:layout_height="@dimen/top_shadow_height"
+ android:layout_alignParentTop="true"
+ android:background="@drawable/gradient_background_flipped"
+ android:contentDescription="@null" />
+
+
+
+
+
diff --git a/app/src/main/res/layout/call_notification.xml b/app/src/main/res/layout/call_notification.xml
deleted file mode 100644
index 94a5b06b..00000000
--- a/app/src/main/res/layout/call_notification.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/dialog_change_sorting.xml b/app/src/main/res/layout/dialog_change_sorting.xml
index 75257e06..9e188e31 100644
--- a/app/src/main/res/layout/dialog_change_sorting.xml
+++ b/app/src/main/res/layout/dialog_change_sorting.xml
@@ -44,6 +44,14 @@
android:paddingTop="@dimen/medium_margin"
android:text="@string/surname"/>
+
+
+
diff --git a/app/src/main/res/layout/dialog_date_picker.xml b/app/src/main/res/layout/dialog_date_picker.xml
new file mode 100644
index 00000000..2e5c349e
--- /dev/null
+++ b/app/src/main/res/layout/dialog_date_picker.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/dialog_select_sim.xml b/app/src/main/res/layout/dialog_select_sim.xml
deleted file mode 100644
index 6c51bb4b..00000000
--- a/app/src/main/res/layout/dialog_select_sim.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/dialpad.xml b/app/src/main/res/layout/dialpad.xml
deleted file mode 100644
index e6235d65..00000000
--- a/app/src/main/res/layout/dialpad.xml
+++ /dev/null
@@ -1,269 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/item_choose_social.xml b/app/src/main/res/layout/item_choose_social.xml
new file mode 100644
index 00000000..36799a59
--- /dev/null
+++ b/app/src/main/res/layout/item_choose_social.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_edit_address.xml b/app/src/main/res/layout/item_edit_address.xml
index d742a213..a7dc2ad7 100644
--- a/app/src/main/res/layout/item_edit_address.xml
+++ b/app/src/main/res/layout/item_edit_address.xml
@@ -1,9 +1,9 @@
-
+ android:layout_height="wrap_content"
+ android:paddingEnd="@dimen/activity_margin">
+ android:textSize="@dimen/bigger_text_size" />
+ android:textSize="@dimen/bigger_text_size" />
diff --git a/app/src/main/res/layout/item_edit_email.xml b/app/src/main/res/layout/item_edit_email.xml
index 3fb37f47..705e7094 100644
--- a/app/src/main/res/layout/item_edit_email.xml
+++ b/app/src/main/res/layout/item_edit_email.xml
@@ -1,16 +1,15 @@
-
+ android:layout_height="wrap_content"
+ android:paddingEnd="@dimen/activity_margin">
+ android:textSize="@dimen/bigger_text_size" />
+ android:textSize="@dimen/bigger_text_size" />
diff --git a/app/src/main/res/layout/item_edit_group.xml b/app/src/main/res/layout/item_edit_group.xml
index 903951f9..debd0c63 100644
--- a/app/src/main/res/layout/item_edit_group.xml
+++ b/app/src/main/res/layout/item_edit_group.xml
@@ -1,41 +1,40 @@
-
+ android:layout_height="wrap_content"
+ android:paddingEnd="@dimen/activity_margin">
+ android:textSize="@dimen/bigger_text_size" />
+ android:visibility="gone" />
diff --git a/app/src/main/res/layout/item_edit_im.xml b/app/src/main/res/layout/item_edit_im.xml
index 01cd411f..60af427f 100644
--- a/app/src/main/res/layout/item_edit_im.xml
+++ b/app/src/main/res/layout/item_edit_im.xml
@@ -1,38 +1,36 @@
-
+ android:layout_height="wrap_content"
+ android:paddingEnd="@dimen/activity_margin">
+ android:textSize="@dimen/bigger_text_size" />
+ android:textSize="@dimen/bigger_text_size" />
diff --git a/app/src/main/res/layout/item_edit_phone_number.xml b/app/src/main/res/layout/item_edit_phone_number.xml
index 0107e0c3..d48da51c 100644
--- a/app/src/main/res/layout/item_edit_phone_number.xml
+++ b/app/src/main/res/layout/item_edit_phone_number.xml
@@ -1,16 +1,15 @@
-
+ android:layout_height="wrap_content"
+ android:paddingEnd="@dimen/activity_margin">
+ android:textSize="@dimen/bigger_text_size" />
+ android:textSize="@dimen/bigger_text_size" />
diff --git a/app/src/main/res/layout/item_edit_website.xml b/app/src/main/res/layout/item_edit_website.xml
index 8eda6c0c..66a3c10b 100644
--- a/app/src/main/res/layout/item_edit_website.xml
+++ b/app/src/main/res/layout/item_edit_website.xml
@@ -1,9 +1,9 @@
-
+ android:layout_height="wrap_content"
+ android:paddingEnd="@dimen/activity_margin">
+ android:textSize="@dimen/bigger_text_size" />
diff --git a/app/src/main/res/layout/item_event.xml b/app/src/main/res/layout/item_event.xml
index 80407d33..e3d33608 100644
--- a/app/src/main/res/layout/item_event.xml
+++ b/app/src/main/res/layout/item_event.xml
@@ -1,57 +1,55 @@
-
+ android:layout_height="wrap_content"
+ android:paddingEnd="@dimen/activity_margin">
+ android:textSize="@dimen/bigger_text_size" />
+ android:visibility="gone" />
+ android:textSize="@dimen/bigger_text_size" />
diff --git a/app/src/main/res/layout/item_filter_contact_source.xml b/app/src/main/res/layout/item_filter_contact_source.xml
index 8c19bbc4..a7040588 100644
--- a/app/src/main/res/layout/item_filter_contact_source.xml
+++ b/app/src/main/res/layout/item_filter_contact_source.xml
@@ -1,6 +1,5 @@
-
+ android:paddingStart="@dimen/small_margin" />
diff --git a/app/src/main/res/layout/item_speed_dial.xml b/app/src/main/res/layout/item_speed_dial.xml
deleted file mode 100644
index 6cdfb871..00000000
--- a/app/src/main/res/layout/item_speed_dial.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
diff --git a/app/src/main/res/layout/item_view_address.xml b/app/src/main/res/layout/item_view_address.xml
index 73f3dfc9..ec68f527 100644
--- a/app/src/main/res/layout/item_view_address.xml
+++ b/app/src/main/res/layout/item_view_address.xml
@@ -1,35 +1,34 @@
-
+ android:paddingStart="@dimen/small_margin"
+ android:paddingTop="@dimen/normal_margin"
+ android:paddingEnd="@dimen/normal_margin"
+ android:paddingBottom="@dimen/normal_margin">
+ android:textSize="@dimen/bigger_text_size" />
+ android:textSize="@dimen/bigger_text_size" />
diff --git a/app/src/main/res/layout/item_view_contact_source.xml b/app/src/main/res/layout/item_view_contact_source.xml
index cfa4fda6..f32cc87b 100644
--- a/app/src/main/res/layout/item_view_contact_source.xml
+++ b/app/src/main/res/layout/item_view_contact_source.xml
@@ -1,15 +1,37 @@
-
+ android:layout_height="wrap_content">
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_view_email.xml b/app/src/main/res/layout/item_view_email.xml
index 7169d289..470811c8 100644
--- a/app/src/main/res/layout/item_view_email.xml
+++ b/app/src/main/res/layout/item_view_email.xml
@@ -1,38 +1,37 @@
-
+ android:paddingStart="@dimen/small_margin"
+ android:paddingTop="@dimen/normal_margin"
+ android:paddingEnd="@dimen/normal_margin"
+ android:paddingBottom="@dimen/normal_margin">
+ android:textSize="@dimen/bigger_text_size" />
+ android:textSize="@dimen/bigger_text_size" />
diff --git a/app/src/main/res/layout/item_view_event.xml b/app/src/main/res/layout/item_view_event.xml
index 002f5cf4..9563636c 100644
--- a/app/src/main/res/layout/item_view_event.xml
+++ b/app/src/main/res/layout/item_view_event.xml
@@ -4,7 +4,9 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
+ android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/normal_margin"
+ android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin">
diff --git a/app/src/main/res/layout/item_view_group.xml b/app/src/main/res/layout/item_view_group.xml
index 12959127..3d62da8e 100644
--- a/app/src/main/res/layout/item_view_group.xml
+++ b/app/src/main/res/layout/item_view_group.xml
@@ -1,6 +1,5 @@
-
+ android:textSize="@dimen/bigger_text_size" />
diff --git a/app/src/main/res/layout/item_view_im.xml b/app/src/main/res/layout/item_view_im.xml
index 3ee5f615..5e17fdb1 100644
--- a/app/src/main/res/layout/item_view_im.xml
+++ b/app/src/main/res/layout/item_view_im.xml
@@ -1,38 +1,37 @@
-
+ android:paddingStart="@dimen/small_margin"
+ android:paddingTop="@dimen/normal_margin"
+ android:paddingEnd="@dimen/normal_margin"
+ android:paddingBottom="@dimen/normal_margin">
+ android:textSize="@dimen/bigger_text_size" />
+ android:textSize="@dimen/bigger_text_size" />
diff --git a/app/src/main/res/layout/item_view_phone_number.xml b/app/src/main/res/layout/item_view_phone_number.xml
index 12e8bbae..26f267b8 100644
--- a/app/src/main/res/layout/item_view_phone_number.xml
+++ b/app/src/main/res/layout/item_view_phone_number.xml
@@ -1,38 +1,37 @@
-
+ android:paddingStart="@dimen/small_margin"
+ android:paddingTop="@dimen/normal_margin"
+ android:paddingEnd="@dimen/normal_margin"
+ android:paddingBottom="@dimen/normal_margin">
+ android:textSize="@dimen/bigger_text_size" />
+ android:textSize="@dimen/bigger_text_size" />
diff --git a/app/src/main/res/menu/menu_dialpad.xml b/app/src/main/res/menu/menu_dialpad.xml
deleted file mode 100644
index a4a77b30..00000000
--- a/app/src/main/res/menu/menu_dialpad.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
index 1685a7cc..e87988f8 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 5b2f59af..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-mdpi/ic_launcher_amber.png
deleted file mode 100644
index 70922633..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_amber.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_blue.png b/app/src/main/res/mipmap-mdpi/ic_launcher_blue.png
deleted file mode 100644
index f8d0c7ad..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_blue.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.png
deleted file mode 100644
index c27cdb6f..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-mdpi/ic_launcher_brown.png
deleted file mode 100644
index 746851a6..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_brown.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_cyan.png b/app/src/main/res/mipmap-mdpi/ic_launcher_cyan.png
deleted file mode 100644
index 8e715cf1..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_cyan.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.png
deleted file mode 100644
index c7cb450f..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_deep_purple.png b/app/src/main/res/mipmap-mdpi/ic_launcher_deep_purple.png
deleted file mode 100644
index 8a893870..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_deep_purple.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
deleted file mode 100644
index 9a6b62b9..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_green.png b/app/src/main/res/mipmap-mdpi/ic_launcher_green.png
deleted file mode 100644
index c7fff1be..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_green.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.png
deleted file mode 100644
index 890de896..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png
deleted file mode 100644
index f29e7ff2..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png
deleted file mode 100644
index aa16d0c8..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_light_green.png b/app/src/main/res/mipmap-mdpi/ic_launcher_light_green.png
deleted file mode 100644
index 6f4058c0..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_light_green.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-mdpi/ic_launcher_lime.png
deleted file mode 100644
index 58800f71..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_lime.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_pink.png b/app/src/main/res/mipmap-mdpi/ic_launcher_pink.png
deleted file mode 100644
index efa5922c..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_pink.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_purple.png b/app/src/main/res/mipmap-mdpi/ic_launcher_purple.png
deleted file mode 100644
index 9a84445b..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_purple.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_red.png b/app/src/main/res/mipmap-mdpi/ic_launcher_red.png
deleted file mode 100644
index df449b83..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_red.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-mdpi/ic_launcher_teal.png
deleted file mode 100644
index 6114544f..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_teal.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_yellow.png b/app/src/main/res/mipmap-mdpi/ic_launcher_yellow.png
deleted file mode 100644
index 397bb3e0..00000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_yellow.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index c32297f5..d769d163 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 85da53e6..5e8ba6fe 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index 05e7f7b6..2d1e3fa0 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index f586bdab..86048aec 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -4,7 +4,6 @@
العنوان
إضافة…
تحديث…
- ذاكرة الهاتف
ذاكرة الهاتف (غير مرئية من قبل التطبيقات الأخرى)
الشركة
الوظيفة
@@ -16,11 +15,6 @@
Call %s
إنشاء جهة إتصال
إضافة إلى جهة موجودة
-
- this link. Thanks!
- ]]>
-
لا توجد جهات اتصال بهذا البريد الالكتروني
@@ -29,10 +23,6 @@
جهة اتصال جديدة
تعديل جهة اتصالل
اختيار جهة اتصال
- اختيار جهات اتصال
- الاسم
- اسم الأب
- الشهرة
اللقب
@@ -52,7 +42,6 @@
ازالة الصورة
- الاسم يبدأ بالشهرة
عرض أرقام الهاتف على الشاشة الرئيسية
عرض صور مصغرة لجهات الإتصال
عرض زر لوحة الإتصال على الشاشةالرئيسية
@@ -60,13 +49,11 @@
اتصال بجهة
عرض تفاصيل جهة الاتصال
إدارة حقول جهات الاتصال المعروضة
- محاولة تصفية جهات الاتصال المكررة
إدارة التابات المعروضة
جهات الاتصال
إظهار مربع حوار تأكيد الاتصال قبل بدء مكالمة
إظهار جهات الإتصال التي لديها أرقام هواتف فقط
- عرض الحروف على لوحة الاتصال
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
المنزل
@@ -87,7 +74,6 @@
يبدو أنك لم تضف أية جهة اتصال مفضلة حتى الآن.
- يجب أن تكون في شاشة التعديل لتعديل جهة اتصال
بحث في جهات الاتصال
@@ -107,26 +93,7 @@
لوحة الاتصال
إضافة رقم الى جهة اتصال
-
- المتصل
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- حدد الحقول لعرضها
بادئة
لاحقة
ارقام الهاتف
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
index 5cc441e2..329b2c51 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -4,7 +4,6 @@
Ünvan
Daxil edilir…
Yenilənir…
- Telefon yaddaşı
Telefon yaddaşı (digər tətbiqlərə görünmür)
Şirkət
İş vəziyyəti
@@ -16,11 +15,6 @@
%s şəxsinə zng et
Create new contact
Add to an existing contact
-
- this link. Thanks!
- ]]>
-
No contacts with emails have been found
@@ -29,10 +23,6 @@
Yeni kontakt
Redaktə et
Kontakt seç
- Kontaktları seç
- Ad
- Orta Ad
- Soyad
Nickname
@@ -52,7 +42,6 @@
Şəkli sil
- Ada soyaddan başla
Telefon nömrələrini əsas ekranda göstər
Kontakt görüntülərini göstər
Show a dialpad button on the main screen
@@ -60,13 +49,11 @@
Kontakta zəng et
Kontakt detallarına bax
Göstərilən kontakt sahəsini idarə et
- Təkrarlanmış kontaktları filtrləməyə çalış
Göstərilən nişanları idarə et
Kontaktlar
Zəngə başlamazdan əvvəl zəng təsdiq pəncərəsi göstər
Show only contacts with phone numbers
- Show letters on the dialpad
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Ev
@@ -87,7 +74,6 @@
Görünür, hələlik heçbir sevimli kontakt əlavə etməmisiniz.
- Kontaktı dəyişmək üçün İdarə et ekranında olmalısınız
Kontaktları axtar
@@ -107,26 +93,7 @@
Dialpad
Add number to contact
-
- Dialer
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Göstərmək üçün sahəni seç
Ön şəkilçi
Orta şəkilçi
Telefon nömrələri
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index d7563cc9..88c7b64c 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -4,7 +4,6 @@
Adresa
Vytváří se…
Upravuje se…
- Úložiště telefonu
Úložiště telefonu (neviditelné pro ostatní apky)
Firma
Pracovní pozice
@@ -16,11 +15,6 @@
Zavolat %s
Vytvořit nový kontakt
Přidat k existujícímu kontaktu
-
- this link. Thanks!
- ]]>
-
Nenalezeny žádné kontakty s e-maily
@@ -29,10 +23,6 @@
Nový kontakt
Upravit kontakt
Zvolte kontakt
- Zvolte kontakty
- Křestní jméno
- Prostřední jméno
- Příjmení
Přezdívka
@@ -52,7 +42,6 @@
Odstranit fotku
- Nejprve příjmení
Zobrazit telefonní čísla na hlavní obrazovce
Zobrazit obrázky kontaktů
Zobrazit tlačítko číselníku na hlavní obrazovce
@@ -60,13 +49,11 @@
Zavolat kontakt
Zobrazit údaje kontaktu
Spravovat zobrazená pole kontaktů
- Pokusit se vyfiltrovat duplicitní kontakty
Spravovat zobrazené karty
Kontakty
Před zahájením hovoru zobrazit potvrzovací dialog
Zobrazit jen kontakty s telefonními čísly
- Zobrazit na číselníku písmena
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Domov
@@ -87,7 +74,6 @@
Vypadá to, že jste ještě nepřidali žádné oblíbené kontakty.
- Pro úpravu kontaktu musíte být v Editoru kontaktu
Hledat v kontaktech
@@ -107,26 +93,7 @@
Číselník
Přidat číslo kontaktu
-
- Telefon
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Rychlé vytáčení
- Spravovat rychlé vytáčení
- Pro přiřazení kontaktu klepněte na číslo. Následně můžete daný kontakt rychle vytočit dlouhým podržením čísla na číselníku.
-
- Zvolte pole k zobrazení
Titul před jménem
Titul za příjmením
Telefonní čísla
diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml
index 4217b248..7c5cce09 100644
--- a/app/src/main/res/values-cy/strings.xml
+++ b/app/src/main/res/values-cy/strings.xml
@@ -4,7 +4,6 @@
Cyfeiriad
Yn gosod…
Yn diweddaru…
- Storfa ddyfais
Storfa ddyfais (dim i\'w weld gan apiau eraill)
Cwmni
Swydd
@@ -16,11 +15,6 @@
Galw %s
Creu cyswllt newydd
Ychwanegu at gyswllt sy\'n bodoli
-
- this link. Thanks!
- ]]>
-
Ni chanfuwyd unrhyw gysylltiadau gydag ebost
@@ -29,10 +23,6 @@
Cyswllt newydd
Golygu\'r cyswllt
Dewis cyswllt
- Dewis cysylltiadau
- Enw cyntaf
- Enw canol
- Cyfenw
Llys enw
@@ -52,7 +42,6 @@
Cael gwared â\'r llun
- Dangos enw gyda\'r cyfenw gyntaf
Dangos rhifau ffôn ar y brif sgrin
Dangos mân luniau cysylltiadau
Dangos botwm pad deialu ar y brif sgrin
@@ -60,13 +49,11 @@
Galw cyswllt
Gweld manylion cyswllt
Rheoli pa feysydd cyswllt i\'w dangos
- Ceisio canfod a gwaredu cysylltiadau dyblyg
Rheoli pa dabiau sy\'n cael eu dangos
Cysylltiadau
Dangos deialog i gadarnhau cyn gwneud galwad
Dangos dim ond cysylltiadau gyda rhifau ffôn
- Dangos llythrennau ar y pad deialu
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Cartref
@@ -87,7 +74,6 @@
Ymddangosir nad wyt wedi ychwanegu unrhyw ffefrynnau eto.
- Rhaid bod ar y sgrin golygu er mwyn addasu cyswllt
Chwilio\'r cysylltiadau
@@ -107,26 +93,7 @@
Pad deialu
Ychwanegu rhif at gyswllt
-
- Deialydd
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Dewis pa feysydd i\'w dangos
Rhagddodiad
Ôl-ddodiad
Rhifau ffôn
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 6b1f2396..19785552 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -4,7 +4,6 @@
Adresse
Indsætter…
Opdaterer…
- Telefon lager
Telefon lager (ikke synlig for andre apps)
Firma
Stilling
@@ -16,11 +15,6 @@
Ring til %s
Opret ny kontakt
Tilføj til en eksisterende kontakt
-
- this link. Thanks!
- ]]>
-
Ingen kontakter med emails fundet
@@ -29,10 +23,6 @@
Ny kontakt
Redigér kontakt
Vælg kontakt
- Vælg kontakter
- Fornavn
- Mellemnavn
- Efternavn
Kaldenavn
@@ -52,7 +42,6 @@
Fjern foto
- Start navn med efternavn
Vis telefonnumre på hovedskærmen
Vis kontakt miniature-billede
Vis en opkaldstasteknap på hovedskærmen
@@ -60,13 +49,11 @@
Ring til kontakt
Vis kontakt detaljer
Administrer viste kontaktfelter
- Prøv at filtrere dupletter
Administrer viste faner
Kontakter
Vis en opkaldsbekræftelsesdialog før du starter et opkald
Vis kun kontakter med telefonnumre
- Vis bogstaver på tastaturet
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Hjem
@@ -87,7 +74,6 @@
Det ser ud til, at du ikke har tilføjet nogen favoritkontakter endnu.
- Du skal være på skærmen Rediger for at ændre en kontakt
Søg kontakter
@@ -107,26 +93,7 @@
Tastatur
Tilføj nummer til kontakt
-
- Dialer
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Vælg felter der skal vises
Præfiks
Suffiks
Telefonnumre
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index f9781ed0..e7d10151 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -4,7 +4,6 @@
Adresse
Einfügen…
Aktualisiere…
- Gerätespeicher
Gerätespeicher (nicht sichtbar für andere Apps)
Unternehmen
Arbeitsstelle
@@ -16,11 +15,6 @@
%s anrufen
Neuen Kontakt erstellen
Zu einem existierenden Kontakt hinzufügen
-
- this link. Thanks!
- ]]>
-
Keine Kontakte mit E-Mailadressen gefunden
@@ -29,10 +23,6 @@
Neuer Kontakt
Kontakt bearbeiten
Kontakt auswählen
- Kontakte auswählen
- Vorname
- Zweiter Vorname
- Nachname
Spitzname
@@ -52,7 +42,6 @@
Foto entfernen
- Namen mit Nachnamen beginnen
Telefonnummern im Hauptmenü zeigen
Vorschaubilder der Kontakte zeigen
Eine Wahlfeld-Schaltfläche auf dem Hauptbildschirm anzeigen
@@ -60,13 +49,11 @@
Kontakt anrufen
Kontaktdetails anzeigen
Sichtbare Kontaktfelder bearbeiten
- Versucht Kontaktduplikate herauszufiltern
Anzuzeigende Tabs festlegen
Kontakte
Bestätigungsdialog zeigen, bevor ein Anruf durchgeführt wird
Nur Kontakte mit Telefonnummern anzeigen
- Buchstaben im Wahlfeld anzeigen
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Zeige private Kontakte in Schlichtem Telefon, SMS Messenger und Kalender Pro
Privat
@@ -87,7 +74,6 @@
Anscheinend haben Sie bisher keine Kontakte zu den Favoriten hinzugefügt.
- Sie müssen sich im Bearbeitungsmodus befinden, um einen Kontakt zu bearbeiten.
Kontakte durchsuchen
@@ -107,26 +93,7 @@
Wählfeld
Nummer zu Kontakt hinzufügen
-
- Dialer
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Sichtbare Felder auswählen
Titel
Suffix
Telefonnummern
@@ -155,7 +122,7 @@
Schlichte Kontakte Pro - Mühlose Kontaktverwaltung
- Easy and quick contact management with no ads, handles groups and favorites too.
+ Verwalten Sie Ihre Kontakte professionell, schnell und sicher mit dieser App
A lightweight app for managing your contacts loved by millions of people. The contacts can be stored on your device only, but also synchronized via Google, or other accounts.
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index c7fac1a2..5e770876 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -4,7 +4,6 @@
Διεύθυνση
Εισαγωγή…
Ενημέρωση…
- Μνήμη τηλεφώνου
Μνήμη τηλεφώνου (κρυφές από άλλες εφαρμογές)
Εταιρεία
Θέση Εργασίας
@@ -16,11 +15,6 @@
Κλήση %s
Δημιουργία νέας Επαφής
Προσθήκη σε μια υπάρχουσα Επαφή
-
- τον σύνδεσμο. Ευχαριστώ!
- ]]>
-
Δεν βρέθηκαν Επαφές με emails
@@ -29,10 +23,6 @@
Νέα επαφή
Επεξεργασία επαφής
Επιλογή επαφής
- Επιλογή επαφών
- Όνομα
- Μεσαίο όνομα
- Επώνυμο
Ψευδώνυμο
@@ -52,7 +42,6 @@
Αφαίρεση φωτογραφίας
- Εμφάνιση πρώτα το επώνυμο
Εμφάνιση τηλεφωνικών αριθμών στην κύρια οθόνη
Εμφάνιση μικρογραφιών επαφής
Προβολή ενός κουμπίου πληκτρολογίου στην κύρια οθόνη
@@ -60,13 +49,11 @@
Κλήση επαφής
Εμφάνιση λεπτομερειών επαφής
Διαχείριση εμφανιζόμενων πεδίων επαφής
- Δοκιμάστε το φιλτράρισμα διπλότυπων επαφών
Διαχείριση εμφανιζόμενων καρτελών
Επαφές
Εμφάνιση διαλόγου επιβεβαίωσης πριν από την έναρξη μιας κλήσης
Προβολή όλων των Επαφών με αριθμούς τηλεφώνου
- Εμφάνιση γραμμάτων στην πληκτρολόγιο
- Εμφάνιση ιδιωτικών επαφών σε Simple Dialer και Simple SMS Messenger
+ Εμφάνιση ιδιωτικών επαφών σε Απλή Κλήση, Απλός SMS Messenger και Απλό Ημερολόγιο Pro
Οικία
@@ -87,7 +74,6 @@
Φαίνεται ότι δεν έχετε προσθέσει αγαπημένες επαφές ακόμη.
- Πρέπει να είστε στην οθόνη "Επεξεργασία" για να τροποποιήσετε μια επαφή
Αναζήτηση επαφών
@@ -107,26 +93,7 @@
Πληκτρολόγιο
Προσθήκη επαφής σε αριθμό
-
- Πληκτρολόγιο
- Αποδοχή
- Απόρριψη
- Άγνωστος
- Καλεί…
- Πληκτρολόγηση…
- Τέλος Κλήσης
- Τερματισμός Κλήσης
- Τρέχουσα κλήση
- Επιλέξτε SIM για αυτήν την κλήση
- Χρήση πάντα αυτής της SIM για αυτόν τον αριθμό
-
-
- Ταχεία Κλήση
- Διαχείριση Ταχείας Κλήσης
- Κάντε κλικ σε έναν αριθμό για να αντιστοιχίσετε μια επαφή σε αυτόν. Στη συνέχεια, μπορείτε να καλέσετε γρήγορα τη δεδομένη επαφή πατώντας τον αριθμό αυτόν στο πληκτρολόγιο.
-
- Επιλογή εμφάνισης πεδίων
Πρόθεμα
Κατάληξη
Αριθμοί Τηλεφώνων
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 63225a9a..be2e1d2b 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -4,7 +4,6 @@
Dirección
Insertando…
Actualizando…
- Almacenamiento del teléfono
Almacenamiento del teléfono (No visible para otras aplicaciones)
Compañía
Puesto de trabajo
@@ -16,11 +15,6 @@
Llamar a %s
Crear nuevo contacto
Añadir a un contacto existente
-
- this link. Thanks!
- ]]>
-
No se encontraron contactos con correo electrónico
@@ -29,10 +23,6 @@
Nuevo contacto
Editar contacto
Seleccionar contacto
- Seleccionar contactos
- Primer nombre
- Segundo nombre
- Apellido
Alias
@@ -52,7 +42,6 @@
Eliminar foto
- Mostrar nombre por apellido
Mostrar números de teléfono en la pantalla principal
Mostrar minaturas de contactos
Mostrar botón de marcación en la pantalla principal
@@ -60,13 +49,11 @@
Llamar contacto
Ver detalles del contacto
Administrar campos del contacto mostrados
- Intentar foltrar contactos duplicados
Administrar pestañas mostradas
Contactos
Mostrar un cuadro de confirmación antes de iniciar una llamada
Solo mostrar contactos con números telefónicos
- Mostrar letras en el teclado de marcación
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Casa
@@ -87,7 +74,6 @@
Parece que aún no has añadido ningún contacto favorito.
- Debes estar en la Pantalla de Edición para modificar un contacto
Buscar contactos
@@ -107,26 +93,7 @@
Teclado de marcación
Añadir número a contacto
-
- Marcador
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Seleccionar campos a mostrar
Prefijo
Sufijo
Números de teléfono
@@ -155,7 +122,7 @@
Simple Contacts Pro - Administra tus contactos
- Easy and quick contact management with no ads, handles groups and favorites too.
+ La mejor app de gestión de contactos con soporte de la función de grupos
A lightweight app for managing your contacts loved by millions of people. The contacts can be stored on your device only, but also synchronized via Google, or other accounts.
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index 3681c434..35204c41 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -4,7 +4,6 @@
Helbidea
Txertatzen…
Eguneratzen…
- Telefono memoria
Telefono memoria (beste aplikazioentzat ikustezina)
Enpresa
Lanpostua
@@ -16,11 +15,6 @@
%s deitu
Create new contact
Add to an existing contact
-
- this link. Thanks!
- ]]>
-
No contacts with emails have been found
@@ -29,10 +23,6 @@
Kontaktu berria
Editatu taldea
Hautatu kontaktuak
- Hautatu kontaktuak
- Izena
- Erdiko izena
- Abizena
Nickname
@@ -52,7 +42,6 @@
Kendu argazkia
- Abizenaren arabera sailkatu
Erakutsi telefono zenbakiak pantaila nagusian
Show contact thumbnails
Show a dialpad button on the main screen
@@ -60,13 +49,11 @@
Kontaktua deitu
Ikusi kontaktu detaileak
Kudeatu erakutsitako kontaktu eremuak
- Saiatu bikoiztutako kontaktuak iragazten
Kudeatu erakutsitako fitxak
Kontaktuak
Erakutsi egiaztatze mezua dei bat hasi baino lehen
Show only contacts with phone numbers
- Show letters on the dialpad
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Etxea
@@ -87,7 +74,6 @@
Ez duzu oraindik gogokorik gehitu.
- Kontaktu bat aldatzeko edizio pantailan egon behar zara
Bilatu kontaktuak
@@ -107,26 +93,7 @@
Dialpad
Add number to contact
-
- Dialer
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Hautatu erakusteko eremuak
Aurrizkia
Atzizkia
Telefono zenbakiak
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index c36bb398..5ffa76e3 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -1,46 +1,36 @@
Simple Contacts
- Kontaktit
+ Yhteystiedot
Osoite
Sijoitetaan
Päivitetään
- Puhelimen muisti
Puhelimen muisti piilotettu
Yritys
Ammatti
- Internet sivu
- Lähetä tekstiviesti kontakteille
- Lähetä sähköposti kontakteille
+ Internet-sivu
+ Lähetä tekstiviesti yhteystiedoille
+ Lähetä sähköposti yhteystiedoille
Lähetä tekstiviesti ryhmälle
Lähetä sähköposti ryhmälle
Soita
- Luo uusi kontakti
- Lisää olemassa olevaan kontaktiin
-
- this link. Thanks!
- ]]>
-
+ Luo uusi yhteystieto
+ Lisää olemassa olevaan yhteystietoon
- Sähköpostillisia kontakteja ei löytynyt
- Puhelinnumerollisia kontakteja ei löytynyt
+ Sähköpostillisia yhteystietoja ei löytynyt
+ Puhelinnumerollisia yhteystietoja ei löytynyt
- Uusi kontakti
- Muokkaa kontaktia
- Valitse kontakti
- Valitse kontaktit
- Etunimi
- Toinen nimi
- Sukunimi
+ Uusi yhteystieto
+ Muokkaa yhteystietoa
+ Valitse yhteystieto
Kutsumanimi
Ei ryhmiä
Luo uusi ryhmä
Poista ryhmästä
- Ei ryhmään kuuluvia
- Lisää kontakteja
+ Ryhmä on tyhjä
+ Lisää yhteystietoja
Ryhmää ei luotu
Luo ryhmä
Lisää ryhmään
@@ -49,24 +39,21 @@
Ota kuva
Valitse kuva
- Posta kuva
+ Poista kuva
- Aloita sukunimellä
Näytä puhelinnumerot
- Näytä kontaktien kuvakkeet
- Näytä soittimen nappi
- Kontaktia painettaessa
- Soita kontaktiin
- Näytä kontakti
- Muuta näytettyjä kontaktialueita
- Suodata kaksoiskappaleet
- Muuta näytettyjä palkkeja
- Kontaktit
+ Näytä yhteystietojen kuvakkeet
+ Näytä soittimen painike
+ Yhteystietoa painaessa…
+ Soita
+ Näytä yhteystieto
+ Valitse, mitkä yhteystietojen kentät näytetään
+ Valitse sovelluksen välilehdet
+ Yhteystiedot
Näytä puhelun vahvistusruutu
- Näytä ainoastaan numerolliset kontaktit
- Näytä kirjaimet puhelimessa
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Näytä ainoastaan numerolliset yhteystiedot
+ Näytä yksityiset yhteystiedot sovelluksissa Simple Dialer, Simple SMS Messenger ja Simple Calendar Pro
Koti
@@ -74,10 +61,10 @@
Muu
- Mobiili
+ Matkapuhelin
Päänumero
- Työ faxi
- Koti faxi
+ Työfaxi
+ Kotifaxi
Hakulaite
Puhelinnumeroa ei löytynyt
@@ -87,69 +74,49 @@
Ei suosikkeja
- Täytyy olla muokkauksessa
- Etsi kontakteja
+ Etsi yhteystietoja
Etsi suosikkeja
- Search groups
+ Etsi ryhmiä
- Tuo kontakteja
- Vie kontakteja
- Tuo .vcf kontakteja
- Vie .vcf kontakteja
- Kohdenna kontaktin lähde
- Sisällytä kontaktin lähteet
- Tiedostonimi ilman .vcf päätettä
+ Tuo yhteystietoja
+ Vie yhteystietoja
+ Tuo .vcf yhteystietoja
+ Vie .vcf yhteystietoja
+ Kohdenna yhteystiedon lähde
+ Sisällytä yhteystiedon lähteet
+ Tiedostonimi ilman .vcf-päätettä
Näppäimistö
- Lisää numero kontakteihin
-
-
- Vastaaja
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
+ Lisää numero yhteystietoihin
- Valitse näytettävät palkit
Alku
Pääte
Puhelinnumero
Sähköpostit
Osoitteet
Tapahtumat
- Järjestö
+ Organisaatio
Internetsivut
Ryhmät
- Kontaktin lähde
+ Yhteystiedon lähde
Pikaviestin
- The contact will be removed from all contact sources.
+ Yhteystieto poistetaan kaikista lähteistä.
- - %d group
- - %d groups
+ - %d ryhmä
+ - %d ryhmää
- Haluan muuttaa sitä mitkä palkit ovat näkyviä kontakteissa. Onko tämä mahdollista?
- Kyllä, mene asetuksiin -> Muuta näytettyjä kontaktialueita. Siellä voit valita mitkä palkit haluat näkyviin. Jotkin niistä ovat piilossa oletuksena, joten saatat löytää sieltä uusia.
+ Voinko valita, mitkä täytettävät kentät näytetään yhteystiedon ominaisuuksissa?
+ Kyllä. Mene asetuksiin -> Valitse täytettävät kentät. Voit valita, mitkä kentät näytetään. Osa kentistä on oletuksena piilotettuna, , joten saatat löytää joitain uusia.
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 804d67ac..081fe49f 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -1,38 +1,28 @@
- Simple Contacts
- Contacts
- Adresse
- Ajout en cours
- Actualisation en cours
- Stockage du téléphone
- Stockage du téléphone (non visible par d\'autres applications)
- Entreprise
- Poste
- Site Internet
- Envoyer un SMS aux contacts
- Envoyer un courriel aux contacts
- Envoyer un SMS au groupe
- Envoyer un courriel au groupe
- Appeler %s
- Créer un nouveau contact
- Ajouter à un contact existant
-
- this link. Thanks!
- ]]>
-
+ Simple contacts
+ Contacts
+ Adresse
+ Ajout
+ Actualisation…
+ Mémoire du téléphone (invisible pour les autres applis)
+ Entreprise
+ Poste
+ Site Web
+ Envoyer un texto aux contacts
+ Envoyer un courriel aux contacts
+ Envoyer un texto au groupe
+ Envoyer un courriel au groupe
+ Appeler %s
+ Créer un nouveau contact
+ Ajouter à un contact existant
- Aucun contact avec une adresse de courriel n\'a été trouvé
- Aucun contact avec un numéro de téléphone n\'a été trouvé
+ Aucun contact avec des adresses courriel n\’a été trouvé
+ Aucun contact avec des numéros de téléphone n\’a été trouvé
Nouveau contact
- Modifier contact
+ Modifier le contact
Sélectionner un contact
- Sélectionner des contacts
- Prénom
- Deuxième prénom
- Nom
Surnom
@@ -41,32 +31,27 @@
Supprimer du groupe
Ce groupe est vide
Ajouter des contacts
- Aucun groupe de contacts sur l\'appareil
+ Il n\’y a aucun groupe de contacts sur l\’appareil
Créer un groupe
Ajouter à un groupe
Créer un groupe dans le compte
- Prendre une photo
- Choisir une photo
- Supprimer la photo
+ Prendre une photo Choisir une photo Supprimer la photo
- Trier les contacts par nom de famille
- Afficher les numéros de téléphone
+ Afficher les numéros de téléphone sur l\’écran principal
Afficher les vignettes des contacts
- Afficher un bouton \"Clavier téléphonique\" sur l\'écran principal
- Lors d\'un appui sur un contact
+ Afficher un bouton de clavier de téléphone sur l\’écran principal
+ En touchant un contact
Appeler le contact
Afficher les détails du contact
- Configurer l\'affichage des champs des contacts
- Essayez de filtrer les contacts en double
+ Gérér l\’affichage des champs des contacts
Gérer les onglets affichés
Contacts
- Afficher une demande de confirmation avant de démarrer un appel
- Afficher uniquement les contacts avec un numéro de téléphone
- Show letters on the dialpad
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Afficher une confirmation avant de faire un appel
+ N\’afficher que les contacts avec un numéro de téléphone
+ Présenter les contacts privés à Simple composeur, Simple SMS Messenger et Simple Calendar Pro
Maison
@@ -74,127 +59,107 @@
Autre
- Mobile
+ Mobile/Cell
Principal
- Fax travail
- Fax maison
- Bipeur
- Aucun numéro de téléphone n\'a été trouvé
+ Télécopieur travail
+ Télécopieur maison
+ Téléavertisseur
+ Aucun numéro de téléphone n\’a été trouvé
- Naissance
- Anniversaire
+ Date de naissance
+ Autre anniversaire
- Aucun contact favori n\'a été trouvé
- Vous devez être sur l\'écran \"Modifier\" pour modifier un contact
+ Il semble que vous n\’avez pas encore ajouté de contacts favoris
- Rechercher des contacts
- Rechercher des favoris
- Search groups
+ Chercher dans les contacts
+ Chercher dans les favoris
+ Chercher dans les groupes
Importer des contacts
Exporter des contacts
- Importer des contacts depuis un fichier .vcf
- Exporter des contacts vers un fichier .vcf
- Compte pour le du contact destinataire
- Ajouter le compte pour le contact
+ Importer les contacts d\’un fichier .vcf
+ Exporter les contacts vers un fichier .vcf
+ Compte de contacts cible
+ Sources de contacts à inclure
Nom du fichier (sans .vcf)
- Clavier téléphonique
- Ajouter un numéro au contact
-
-
- Numéroteur
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
+ Clavier de téléphone
+ Ajouter le numéro à un contact
- Sélectionner les champs à afficher
Préfixe
Suffixe
Numéros de téléphone
- Adresse de courriels
+ Adresses courriel
Adresses
- Évènements (naissances, anniversaires)
- Organisation
- Sites Internet
+ Événements (différents anniversaires)
+ Organisme
+ Sites Web
Groupe
- Compte pour le contact
+ Source du contact
Messagerie instantanée (MI)
- The contact will be removed from all contact sources.
+ Le contact sera supprimé de toutes les sources de contacts.
- - %d group
- - %d groups
+ - %d groupe
+ - %d groupes
- Je veux modifier les champs affichés sur les fiches de mes contacts. Puis-je le faire ?
- Oui, tout ce que vous avez à faire c\'est d\'aller dans \"Paramètres\" -> \"Configurer l\'affichage des champs de contact\". Sélectionnez les champs à afficher. Certains champs sont désactivés par défaut.
+ Je veux modifier les champs affichés dans mes contacts. Puis-je le faire ?
+ Oui. Accédez à Paramètres -> Gérér l\’affichage des champs des contacts. Vous pourrez y sélectionner les champs à afficher. Certains champs sont désactivés par défaut, vous pourrez donc en trouver des nouveaux.
- Simple Contacts Pro - Manage your contacts easily
+ Simple contacts Pro – Gestion facile des contacts
- Easy and quick contact management with no ads, handles groups and favorites too.
+ Gestion facile et rapide des contacts sans pub. Gère les groupes et les favoris.
- A lightweight app for managing your contacts loved by millions of people. The contacts can be stored on your device only, but also synchronized via Google, or other accounts.
+ Une appli légère pour gérer vos contacts, utilisée par des millions de personnes satisfaites. Les contacts peuvent être enregistrés sur votre appareil, mais aussi synchronisés avec Google et d\’autres comptes.
- You can use it for managing user emails and events too. It has the ability to sort/filter by multiple parameters, optionally display surname as the first name.
+ Vous pouvez aussi l\’utiliser pour gérer les adresses courriel et les événements des utilisateurs. Plusieurs critères de tri et des filtres peuvent être appliqués, et elle peut afficher le surnom à la place du prénom.
- You can display your favorite contacts or groups on a separate list. Groups can be used for sending out batch emails or SMS, to save you some time, you can rename them easily.
+ Vous pouvez afficher vos contacts et vos groupes favoris dans une liste séparée. Les groupes peuvent être utilisés pour envoyer des courriels et des textos à plusieurs personnes afin de gagner du temps. Vous pouvez les renommer facilement.
- It contains handy buttons for calling, or texting your contacts. All visible fields can be customized as you wish, you can easily hide the unused ones. The search function will search the given string at every visible contact field, to make you find your desired contact easily.
+ Elle propose des boutons pratiques pour appeler ou texter vos contacts. Tous les champs visibles peuvent être personnalisés comme vous le souhaitez. Vous pouvez facilement cacher ceux que vous n\’utilisez pas. La fonction de recherche cherchera une chaîne donnée dans tous les champs visibles, afin de vous permettre de trouver facilement le contact désiré.
- There is a lightweight dialpad at your service too, with smart contact suggestions.
+ Un clavier de téléphone léger aux suggestions de contact intelligentes vous est aussi proposé.
- It supports exporting/importing contacts in vCard format to .vcf files, for easy migrations or backing up your data.
+ Afin de migrer et de sauvegarder facilement vos données, l\’appli prend en charge l\’exportation et l\’importation de contacts au format vCard vers et à partir de fichiers .vcf.
- With this modern and stable contacts manager you can protect your contacts by not sharing them with other apps, so you can keep your contacts private.
+ Grâce à ce gestionnaire de contacts moderne et stable, vous pouvez protéger vos contacts en ne les partageant pas avec d\’autres applis, assurant ainsi la confidentialité des renseignements de vos contacts.
- Like the contact source, you can also easily change the contact name, email, phone number, address, organization, groups and many other customizable fields. You can use it for storing contact events too, like birthdays, anniversaries, or any other custom ones.
+ Vous pouvez facilement changer la source du contact, mais aussi son nom, son adresse courriel, son numéro de téléphone, son adresse, son organisme, ces groupes et bien d\’autres champs personnalisables. Vous pouvez aussi utiliser l\’appli pour enregistrer les événements relatifs aux contacts tels que la date de naissance, d\’autres anniversaires, mais aussi d\’autres champs personnalisés.
- This simple contact editor has many handy settings like showing phone numbers on the main screen, toggle contact thumbnail visibility, showing only contacts with phone numbers, showing a call confirmation dialog before initiating a call. It comes with a quick dialer that also makes use of letters.
+ Ce gestionnaire de contacts simple offre des paramètres pratiques tels qu\’afficher les numéros de téléphone sur l\’écran principal, afficher ou non la vignette des contacts et présenter une confirmation d\’appel avant de le lancer.
- To further improve the user experience, you can customize what happens at clicking on a contact. You can either initiate a call, go to the View Details screen, or edit the selected contact.
+ Pour encore améliorer l\’expérience utilisateur, vous pouvez personnaliser ce qui se passe quand vous touchez un contact. Vous pouvez soit lancer un appel, soit accéder à l\’écran Vue détaillée, soit modifier le contact sélectionné.
- You can easily block phone numbers to avoid unwanted incoming calls.
+ Vous pouvez facilement bloquer certains numéros de téléphone afin d\’éviter les appels entrants non sollicités.
- To avoid showing potentially unwanted contacts, it has a powerful built in duplicate contact merger.
+ L\’appli offre une puissante fonction de fusion des doublons afin d\’éviter d\’afficher des contacts non désirés.
- It comes with material design and dark theme by default, provides great user experience for easy usage. The lack of internet access gives you more privacy, security and stability than other apps.
+ Pour une utilisation facile et une expérience utilisateur améliorée, « Material design » et un thème sombre sont appliqués par défaut. Le fait que l\’appli ne se connecte pas à Internet assure une meilleure protection des renseignements personnels, une sécurité accrue et plus de stabilité que les autres applis.
- L\'application ne contient ni publicité, ni autorisation inutile. Elle est totalement opensource et est également fournie avec des couleurs personnalisables.
+ L\’appli ne comprend aucune publicité et ne demande aucune autorisation inutile. Elle est entièrement à code source ouvert. Ses couleurs sont personnalisables.
- Check out the full suite of Simple Tools here:
+ Trouvez ici la gamme entière d\’outils Simple :
https://www.simplemobiletools.com
- Standalone website of Simple Contacts Pro:
+ Site Web de Simple contacts Pro :
https://www.simplemobiletools.com/contacts
- Facebook:
+ Facebook :
https://www.facebook.com/simplemobiletools
- Reddit:
+ Reddit :
https://www.reddit.com/r/SimpleMobileTools
diff --git a/app/src/main/res/values-gl b/app/src/main/res/values-gl
new file mode 100644
index 00000000..5c5b73f7
--- /dev/null
+++ b/app/src/main/res/values-gl
@@ -0,0 +1,173 @@
+
+ Simple Contacts
+ Contactos
+ Endereço
+ A inserir…
+ A atualizar…
+ Armazenamento do telefone (não visível por outras alicações)
+ Organização
+ Cargo
+ Site
+ Enviar SMS aos contactos
+ Enviar e-mail aos contactos
+ Enviar SMS para o grupo
+ Enviar e-mail para o grupo
+ Ligar a %s
+ Criar novo contacto
+ Adicionar a um contacto existente
+
+
+ Não existem contactos com endereço de e-mail
+ Não existem contactos com número de telefone
+
+ Novo contacto
+ Editar contacto
+ Seleccionar contacto
+ Alcume
+
+
+ Non existen grupos
+ Crear un novo grupo
+ Eliminar do grupo
+ Este grupo está vacío
+ Engadir contactos
+ Non existen grupos de contactos neste dispositivo
+ Crear un grupo
+ Engadir ao grupo
+ Crear grupo para a conta
+
+
+ Sacar foto
+ Escoller foto
+ Eliminar foto
+
+
+ Mostrar número de teléfono na pantalla principal
+ Mostrar miniatura do contacto
+ Mostrar botón Marcador na pantalla principal
+ Ao tocar no contacto
+ Chamar
+ Ver detalles
+ Xestionar campos dos contactos amosados
+ Xestionar separadores a exhibir
+ Contactos
+ Mostrar diálogo para confirmar a chamada
+ Mostrar só contactos con número de teléfono
+ Mostrar contactos privados em Simple Dialer e em Simple SMS Messenger
+
+
+ Persoal
+ Profesional
+ Outro
+
+
+ Móbil
+ Principal
+ Fax profesional
+ Fax persoal
+ Busca
+ Número de teléfono non atopado
+
+
+ Data de nacemento
+ Aniversario
+
+
+ Parece que aínda non engadiu contactos aos favoritos
+ Ten que estar na pantalla de edición para cambiar un contacto
+
+
+ Buscar nos contactos
+ Buscar nos favoritos
+ Buscar nos grupos
+
+
+ Importar contactos
+ Exportar contactos
+ Importar contactos dun ficheiro .vcf
+ Exportar contactos para un ficheiro .vcf
+ Destino da orixe do contacto
+ Incluír fonte dos contactos
+ Nome do ficheiro (sem .vcf)
+
+
+ Marcador
+ Engadir número a un contacto existente
+
+
+ Prefixo
+ Sufixo
+ Número de teléfono
+ Correo electrónico
+ Enderezo
+ Eventos (data de nacemento, aniversario)
+ Organización
+ Páxinas
+ Grupos
+ Orixe do contacto
+ Mensaxe instantánea (IM)
+
+
+ O contacto será eliminado de todas as orixes.
+
+
+ - %d grupo
+ - %d grupos
+
+
+
+ Quero alterar os campos mostrados nos contactos. É posible?
+ Si, basta acceder a Definición -> Xestionar campos mostrados. Aquí, pode escoller os campos que serán mostrados. Algúns dos campos xa están agochados e así podes mostrar algúns destes.
+
+
+
+ Simple Contacts Pro - Manage your contacts easily
+
+ A premium app for contact management with no ads, supports groups and favorites
+
+ Un aplicativo lixeiro para xestionar os teus contactos. Os contactos pódense almacenar só no dispositivo pero tamén sincronizarse a través de Google ou doutras contas.
+
+ Tamén podes usalo para xestionar correos electrónicos e eventos dos usuarios. Ten a capacidade de ordenar / filtrar por varios parámetros, amosando opcionalmente o apelido como nome.
+
+ Podes amosar os teus contactos ou grupos favoritos nunha lista separada. Os grupos pódense usar para enviar correos electrónicos por lotes ou SMS. Para aforrar tempo, podes renomealos facilmente.
+
+ Contén botóns para chamar ou enviar mensaxes de texto aos teus contactos. Todos os campos visibles pódense personalizar como queiras e podes ocultar facilmente os que non uses. A función de busca buscará a cadea dada en todos os campos de contacto visibles para que poida atopar facilmente o contacto desexado.
+
+ Tamén hai un teclado de marcación lixeiro ao teu servizo e con suxestións de contactos intelixentes.
+
+ Dá soporte a exportación / importación de contactos en formato vCard a ficheiros .vcf e para migracións sinxelas ou facer copias de seguridade dos teus datos.
+
+ Con este xestor de contactos moderno e estable, podes protexer os teus contactos ao non compartilos con outros aplicativos para que poidas manter os teus contactos privados.
+
+ Do mesmo xeito que a fonte de contacto, tamén podes cambiar facilmente o nome do contacto, o correo electrónico, o número de teléfono, o enderezo, a organización, os grupos e moitos outros campos personalizables. Podes usalo tamén para almacenar eventos de contacto, como aniversarios, aniversarios ou calquera outro personalizado.
+
+ Este sinxelo editor de contactos ten moitas opcións útiles como amosar números de teléfono na pantalla principal, cambiar a visibilidade das miniaturas dos contactos, amosar só os contactos con números de teléfono, amosar un diálogo de confirmación de chamada antes de iniciar unha chamada. Vén cun marcador rápido que tamén fai uso das letras.
+
+ Para mellorar aínda máis a experiencia do usuario, podes personalizar o que acontece ao premer nun contacto. Podes iniciar unha chamada, ir á pantalla de Ver detalles ou editar o contacto seleccionado.
+
+ Podes bloquear facilmente números de teléfono para evitar chamadas entrantes non desexadas.
+
+ Para evitar amosar contactos potencialmente non desexados, ten unha poderosa fusión de contactos duplicada.
+
+ Vén cun deseño material e un tema escuro de xeito predeterminado, fornece unha excelente experiencia de usuario cun uso sinxelo. Como non necesita acceso a Internet, tes máis privacidade, seguridade e estabilidade.
+
+ Non contén anuncios nin permisos innecesarios. Dispón dun tema escuro e é totalmente de código aberto.
+
+ Visita a páxina a través desta ligazón:
+ https://www.simplemobiletools.com
+
+ Páxina do aplicativo Simple Contacts Pro:
+ https://www.simplemobiletools.com/contacts
+
+ Facebook:
+ https://www.facebook.com/simplemobiletools
+
+ Reddit:
+ https://www.reddit.com/r/SimpleMobileTools
+
+
+
+
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index b2ef9df5..472de9c3 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -4,7 +4,6 @@
Adresa
Dodavanje…
Ažuriranje…
- Pohrana na telefonu
Pohrana na telefonu (nije vidljiva drugim aplikacijama))
Tvrtka
Radno mjesto
@@ -16,11 +15,6 @@
Nazovi %s
Stvori novi kontakt
Dodaj postojećem kontaktu
-
- this link. Thanks!
- ]]>
-
Nije pronađen nijedan kontakt s e-poštom
@@ -29,10 +23,6 @@
Novi kontakt
Uredi kontakt
Odaberi kontakt
- Odaberi kontakte
- Ime
- Srednje ime
- Prezime
Nadimak
@@ -52,7 +42,6 @@
Ukloni fotografiju
- Započnite imena s prezimenima
Prikaži telefonske brojeve na glavnom zaslonu
Prikaži sličice kontakata
Show a dialpad button on the main screen
@@ -60,13 +49,11 @@
Nazovi kontakt
Prikaži pojedinosti o kontaktu
Upravljaj prikazanim poljima kontakta
- Pokušaj filtrirati duple kontakte
Upravljaj prikazanim karticama
Kontakti
Pokažite dijaloški okvir za potvrdu poziva prije pokretanja poziva
Prikaži samo kontakte s telefonskim brojevima
- Prikaži slova na telefonskoj tipkovnici
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Kućni
@@ -87,7 +74,6 @@
Čini se da još niste dodali nijedan kontakt u favorite.
- Morate biti na zaslonu Uređivanje da biste izmijenili kontakt
Pretraži kontakte
@@ -107,26 +93,7 @@
Telefonska tipkovnica
Dodaj broj u kontakt
-
- Birač broja
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Odaberi polja za prikaz
Prefiks
Sufiks
Brojevi telefona
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index e30bb0e0..208eb685 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -4,7 +4,6 @@
Cím
Hozzáadás…
Módosítás…
- Telefon tárhely
Telefon tárhely (a többi app számára nem látható)
Cégnév
Munkakör
@@ -16,11 +15,6 @@
%s hívása
Új névjegy hozzáadása
Hozzáadás meglévő névjegyhez
-
- this link. Thanks!
- ]]>
-
Nincs emailt tartalmazó névjegy.
@@ -29,10 +23,6 @@
Új névjegy
Névjegy módosítása
Névjegy kiválasztása
- Névjegyek kiválasztása
- Keresztnév
- Középső név
- Vezetéknév
Becenév
@@ -52,7 +42,6 @@
Fénykép törlése
- Vezetéknév, keresztnév sorrend
Telefonszámok kijelzése a névjegylistán
Névjegy bélyeg kijelzése
Tárcsáző kijelzése a névjegylistán
@@ -60,13 +49,11 @@
Telefonhívás indítása
Részletek megjelenítése
A megjelenő mezők kiválasztása
- Többszörösen felvett névjegyek kiszűrése
A megjelenő fülek kiválasztása
Névjegyek
Jóváhagyás kérése telefonhívás indítása előtt
Csak telefonszámot tartalmazó névjegyek kijelzése
- Betűk kijelzése a tárcsázón
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Otthon
@@ -87,7 +74,6 @@
Úgy tűnik, hogy még nincsenek kedvencek felvéve.
- Névjegyet csak a szerkesztő képernyőn lehet módosítani.
Névjegyek keresése
@@ -107,26 +93,7 @@
Tárcsázó
Telefonszám hozzáadása névjegyhez
-
- Tárcsázó
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- A megjelenített mezők kiválasztása
Megszólítás
Toldalék
Telefonszámok
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index 33beec77..b83035cb 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -4,7 +4,6 @@
Alamat
Menyimpan…
Memperbarui…
- Penyimpanan telepon
Penyimpanan telepon (tidak terlihat oleh aplikasi lain)
Perusahaan
Jabatan
@@ -16,11 +15,6 @@
Panggil %s
Buat kontak baru
Tambah ke kontak yang ada
-
- this link. Thanks!
- ]]>
-
Tidak ada kontak dengan alamat surel yang ditemukan
@@ -29,10 +23,6 @@
Kontak baru
Sunting kontak
Pilih kontak
- Pilih kontak
- Nama depan
- Nama tengah
- Nama belakang
Nama panggilan
@@ -52,7 +42,6 @@
Buang foto
- Nama dimulai dengan nama belakang
Tampilkan nomor telepon pada layar utama
Tampilkan foto kontak
Tampilkan tombol dial pada layar utama
@@ -60,13 +49,11 @@
Panggil kontak
Lihat detail kontak
Kelola ruas kontak yang ditampilkan
- Coba sembunyikan duplikat kontak
Kelola tab yang ditampilkan
Kontak
Tampilkan dialog konfirmasi panggilan sebelum melakukan panggilan
Hanya tampilkan kontak dengan nomor telepon
- Tampilkan huruf pada tombol dial
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Rumah
@@ -87,7 +74,6 @@
Sepertinya anda belum menambahkan kontak favorit.
- Anda harus berada di layar Sunting untuk mengubah kontak
Cari kontak
@@ -107,26 +93,7 @@
Telepon
Tambah nomor ke kontak
-
- Telepon
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Pilih ruas untuk ditampilkan
Awalan
Akhiran
Nomor telepon
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index 33beec77..b83035cb 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -4,7 +4,6 @@
Alamat
Menyimpan…
Memperbarui…
- Penyimpanan telepon
Penyimpanan telepon (tidak terlihat oleh aplikasi lain)
Perusahaan
Jabatan
@@ -16,11 +15,6 @@
Panggil %s
Buat kontak baru
Tambah ke kontak yang ada
-
- this link. Thanks!
- ]]>
-
Tidak ada kontak dengan alamat surel yang ditemukan
@@ -29,10 +23,6 @@
Kontak baru
Sunting kontak
Pilih kontak
- Pilih kontak
- Nama depan
- Nama tengah
- Nama belakang
Nama panggilan
@@ -52,7 +42,6 @@
Buang foto
- Nama dimulai dengan nama belakang
Tampilkan nomor telepon pada layar utama
Tampilkan foto kontak
Tampilkan tombol dial pada layar utama
@@ -60,13 +49,11 @@
Panggil kontak
Lihat detail kontak
Kelola ruas kontak yang ditampilkan
- Coba sembunyikan duplikat kontak
Kelola tab yang ditampilkan
Kontak
Tampilkan dialog konfirmasi panggilan sebelum melakukan panggilan
Hanya tampilkan kontak dengan nomor telepon
- Tampilkan huruf pada tombol dial
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Rumah
@@ -87,7 +74,6 @@
Sepertinya anda belum menambahkan kontak favorit.
- Anda harus berada di layar Sunting untuk mengubah kontak
Cari kontak
@@ -107,26 +93,7 @@
Telepon
Tambah nomor ke kontak
-
- Telepon
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Pilih ruas untuk ditampilkan
Awalan
Akhiran
Nomor telepon
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 9db3a36e..23518958 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -4,7 +4,6 @@
Indirizzo
Inserimento in corso…
Aggiornamento in corso…
- Memoria del telefono
Memoria del telefono (non visibile alle altre applicazioni)
Società
Posizione lavorativa
@@ -16,11 +15,6 @@
Chiama %s
Crea un nuovo contatto
Aggiungi a un contatto esistente
-
- this link. Thanks!
- ]]>
-
Nessun contatto trovato con un\'email
@@ -29,10 +23,6 @@
Nuovo contatto
Modifica contatto
Seleziona contatto
- Seleziona contatti
- Nome
- Secondo nome
- Cognome
Soprannome
@@ -52,7 +42,6 @@
Rimuovi la foto
- Prima il nome poi il cognome
Mostra i numeri di telefono nella schermata principale
Mostra le anteprime dei contatti
Mostra il pulante per il tastierino nello schermo principale
@@ -60,13 +49,11 @@
Chiama contatto
Visualizza i dettagli del contatto
Gestisci i campi mostrati
- Unisci i contatti duplicati
Gestisci le schede mostrate
Contatti
Mostra un messaggio di conferma prima di iniziare una chiamata
Mostra solamente i contatti con almeno un numero telefonico
- Mostra lettere nel compositore
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Casa
@@ -87,7 +74,6 @@
Non si ha ancora nessun contatto preferito.
- Si deve stare nella schermata di modifica per modificare un contatto
Cerca contatti
@@ -107,26 +93,7 @@
Tastiera
Aggiungi numero ai contatti
-
- Compositore
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Seleziona i campi da mostrare
Prefisso
Suffisso
Numeri di telefono
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index e0a7981f..19240a9b 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -4,7 +4,6 @@
住所
挿入中…
更新中…
- 内部ストレージ
内部ストレージ (他のアプリからは表示されません)
会社
役職
@@ -16,11 +15,6 @@
Call %s
新しい連絡先を作成
既存の連絡先に追加
-
- this link. Thanks!
- ]]>
-
メールアドレスが登録された連絡先が見つかりません
@@ -29,10 +23,6 @@
新しい連絡先
連絡先を編集
連絡先を選択
- 連絡先を選択
- 名
- ミドルネーム
- 姓
ニックネーム
@@ -52,7 +42,6 @@
写真を削除
- 姓を先に表示
メイン画面に電話番号を表示
連絡先のサムネイルを表示
メイン画面にダイヤルパッドを表示
@@ -60,13 +49,11 @@
連絡先に発信
連絡先の詳細を表示
連絡先に表示するフィールドを管理
- 重複した連絡先を除外する
表示するタブを管理
連絡先
発信する前に確認ダイアログを表示する
電話番号が登録された連絡先のみ表示する
- Show letters on the dialpad
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
自宅
@@ -87,7 +74,6 @@
お気に入りの連絡先はまだありません
- 連絡先を編集するには編集画面に切り替えてください
連絡先を検索
@@ -107,26 +93,7 @@
ダイヤルパッド
連絡先に番号を追加
-
- 電話
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- 表示する項目を選択
敬称(名前の前)
敬称(名前の後)
電話番号
diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml
index 1311cf74..ddbe3720 100644
--- a/app/src/main/res/values-ko-rKR/strings.xml
+++ b/app/src/main/res/values-ko-rKR/strings.xml
@@ -4,7 +4,6 @@
주소
등록중…
수정중…
- Phone storage
Phone storage (not visible by other apps)
Company
Job position
@@ -16,11 +15,6 @@
Call %s
Create new contact
Add to an existing contact
-
- this link. Thanks!
- ]]>
-
No contacts with emails have been found
@@ -29,10 +23,6 @@
새로운 연락처
연락처 수정
단건 연락처 선택
- 다건 연락처 선택
- 이름
- 중간 이름
- 성
Nickname
@@ -52,7 +42,6 @@
사진 삭제
- 성을 먼저 표시
메인 스크린에 전화번호 표시
Show contact thumbnails
Show a dialpad button on the main screen
@@ -60,13 +49,11 @@
Call contact
View contact details
Manage shown contact fields
- Try filtering out duplicate contacts
Manage shown tabs
Contacts
Show a call confirmation dialog before initiating a call
Show only contacts with phone numbers
- Show letters on the dialpad
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
집
@@ -87,7 +74,6 @@
자주 사용하는 연락처가 아직 등록되지 않았습니다.
- You must be at the Edit screen to modify a contact
연락처 검색
@@ -107,26 +93,7 @@
Dialpad
Add number to contact
-
- Dialer
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Select fields to show
Prefix
Suffix
Phone numbers
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 6e298abd..082f2ee6 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -4,7 +4,6 @@
Adresas
Įterpiama…
Atnaujinama…
- Telefono atmintis
Telefono atmintis (nematoma kitų programėlių)
Company
Job position
@@ -16,11 +15,6 @@
Call %s
Create new contact
Add to an existing contact
-
- this link. Thanks!
- ]]>
-
No contacts with emails have been found
@@ -29,10 +23,6 @@
Naujas kontaktas
Redaguoti kontaktą
Pasirinkti kontaktą
- pasirinkti kontaktus
- Vardas
- Antras vardas
- Pavardė
Nickname
@@ -52,7 +42,6 @@
Pašalinti nuotrauką
- Pavardė rodoma pirma
Rodyti telefono numerius pagrindiniame programos ekrane
Rodyti kontaktų miniatiūras
Show a dialpad button on the main screen
@@ -60,13 +49,11 @@
Skambinti kontaktui
Žiūrėti kontakto detales
Manage shown contact fields
- Try filtering out duplicate contacts
Manage shown tabs
Contacts
Show a call confirmation dialog before initiating a call
Show only contacts with phone numbers
- Show letters on the dialpad
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Namų
@@ -87,7 +74,6 @@
Atrodo jog Jūs dar neįvedėte nė vieno mėgiamiausiojo kontakto.
- You must be at the Edit screen to modify a contact
Ieškoti kontaktų
@@ -107,26 +93,7 @@
Dialpad
Add number to contact
-
- Dialer
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Pasirinkti rodomus laukelius
Priešdėlis
Priesaga
Telefonų numeriai
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
new file mode 100644
index 00000000..b4a7910a
--- /dev/null
+++ b/app/src/main/res/values-ml/strings.xml
@@ -0,0 +1,172 @@
+
+ Simple Contacts
+ Contacts
+ വിലാസം
+ ചേർക്കുന്നു…
+ പുതുക്കുന്നു…
+ ഫോൺ സ്റ്റോറേജ് (മറ്റ് അപ്ലിക്കേഷനുകൾക്ക് ദൃശ്യമല്ല)
+ കമ്പനി
+ ഉദ്യോഗ സ്ഥാനം
+ വെബ്സൈറ്റ്
+ കോൺടാക്റ്റുകളിലേക്ക് SMS അയയ്ക്കുക
+ കോൺടാക്റ്റുകളിലേക്ക് ഇമെയിൽ അയയ്ക്കുക
+ ഗ്രൂപ്പിലേക്ക് SMS അയയ്ക്കുക
+ ഗ്രൂപ്പിലേക്ക് ഇമെയിൽ അയയ്ക്കുക
+ വിളിക്കുക %s
+ പുതിയ കോൺടാക്റ്റ് സൃഷ്ടിക്കുക
+ നിലവിലുള്ള കോൺടാക്റ്റിലേക്ക് ചേർക്കുക
+
+
+ ഇമെയിലുകളില്ലാത്ത കോൺടാക്റ്റുകൾ കണ്ടെത്തിയില്ല
+ ഫോൺ നമ്പറുകളില്ലാത്ത കോൺടാക്റ്റുകൾ കണ്ടെത്തിയില്ല
+
+ പുതിയ കോൺടാക്റ്റ്
+ കോൺടാക്റ്റ് എഡിറ്റുചെയ്യുക
+ കോൺടാക്റ്റ് തിരഞ്ഞെടുക്കുക
+ വിളിപ്പേര്
+
+
+ ഗ്രൂപ്പുകളൊന്നുമില്ല
+ പുതിയ ഗ്രൂപ്പ് സൃഷ്ടിക്കുക
+ ഗ്രൂപ്പിൽ നിന്ന് നീക്കംചെയ്യുക
+ ഈ ഗ്രൂപ്പ് ശൂന്യമാണ്
+ കോൺടാക്റ്റുകൾ ചേർക്കുക
+ ഉപകരണത്തിൽ കോൺടാക്റ്റ് ഗ്രൂപ്പുകളൊന്നുമില്ല
+ ഗ്രൂപ്പ് സൃഷ്ടിക്കുക
+ ഗ്രൂപ്പിലേക്ക് ചേർക്കുക
+ അക്കൗണ്ടിന് കീഴിൽ ഗ്രൂപ്പ് സൃഷ്ടിക്കുക
+
+
+ ഫോട്ടോ എടുക്കുക
+ ഫോട്ടോ തിരഞ്ഞെടുക്കുക
+ ഫോട്ടോ നീക്കംചെയ്യുക
+
+
+ മുഖ്യ സ്ക്രീനിൽ ഫോൺ നമ്പറുകൾ കാണിക്കുക
+ കോണ്ടാക്ടിന്റെ ലഘുചിത്രങ്ങൾ കാണിക്കുക
+ Show a dialpad button on the main screen
+ On contact click
+ കോണ്ടാക്ടിനെ വിളിക്കുക
+ കോൺടാക്റ്റ് വിശദാംശങ്ങൾ കാണുക
+ കോൺടാക്റ്റ് ഫീൽഡുകൾ കാണിക്കുന്നത് നിയന്ത്രിക്കുക
+ ടാബുകൾ കാണിക്കുന്നത് നിയന്ത്രിക്കുക
+ കോണ്ടാക്ടുകൾ
+ ഒരു കോൾ ആരംഭിക്കുന്നതിന് മുമ്പ്, കോൾ സ്ഥിരീകരണ ഡയലോഗ് കാണിക്കുക
+ ഫോൺ നമ്പറുകളുള്ള കോൺടാക്റ്റുകൾ മാത്രം കാണിക്കുക
+ Simple Dialer-ലേക്കും Simple Messenger-ലേക്കും സ്വകാര്യ കോൺടാക്റ്റുകൾ കാണിക്കുക
+
+
+ വീട്
+ ജോലി
+ മറ്റുള്ളവ
+
+
+ മൊബൈൽ
+ പ്രധാനമായ
+ Work Fax
+ Home Fax
+ പേജർ
+ ഫോൺ നമ്പറുകളൊന്നും കണ്ടെത്തിയില്ല
+
+
+ ജന്മദിനം
+ വാർഷികം
+
+
+ നിങ്ങൾ ഇതുവരെ പ്രിയപ്പെട്ട കോൺടാക്റ്റുകളൊന്നും ചേർത്തിട്ടില്ലെന്ന് തോന്നുന്നു.
+
+
+ കോൺടാക്റ്റുകൾ തിരയുക
+ പ്രിയങ്കരങ്ങൾ തിരയുക
+ ഗ്രൂപ്പുകൾ തിരയുക
+
+
+ കോൺടാക്റ്റുകൾ ഇറക്കുമതി ചെയ്യുക
+ കോൺടാക്റ്റുകൾ എക്സ്പോർട്ടുചെയ്യുക
+ .vcf ഫയലിൽ നിന്ന് കോൺടാക്റ്റുകൾ ഇമ്പോർട്ടുചെയ്യുക
+ .vcf ഫയലിലേക്ക് കോൺടാക്റ്റുകൾ എക്സ്പോർട്ടുചെയ്യുക
+ കോണ്ടാക്ടിന്റെ ഉറവിടം ലക്ഷ്യമാക്കുക
+ കോണ്ടാക്ടിന്റെ ഉറവിടങ്ങൾ ഉൾപ്പെടുത്തുക
+ ഫയലിന്റെ പേര്(.vcf കൂടാതെ)
+
+
+ ഡയൽപാഡ്
+ കോൺടാക്റ്റിലേക്ക് നമ്പർ ചേർക്കുക
+
+
+ ഉപസർഗം
+ പ്രത്യയം
+ ഫോൺ നമ്പറുകൾ
+ ഇമെയിലുകൾ
+ വിലാസങ്ങൾ
+ ഇവന്റുകൾ (ജന്മദിനങ്ങൾ, വാർഷികങ്ങൾ)
+ വെബ്സൈറ്റുകൾ
+ വെബ്സൈറ്റുകൾ
+ ഗ്രൂപ്പുകൾ
+ കോൺടാക്റ്റ് ഉറവിടം
+ തത്സമയ സന്ദേശം അയക്കൽ
+
+
+ എല്ലാ കോൺടാക്റ്റ് ഉറവിടങ്ങളിൽ നിന്നും ഈ കോൺടാക്റ്റ് നീക്കംചെയ്യും.
+
+
+ - %d group
+ - %d groups
+
+
+
+ കോൺടാക്റ്റുകളിൽ ദൃശ്യമാകുന്ന ഫീൽഡുകൾ മാറ്റാൻ ഞാൻ ആഗ്രഹിക്കുന്നു. എനിക്ക് അത് ചെയ്യാൻ സാധിക്കുമോ?
+ Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.
+
+
+
+ Simple Contacts Pro - കോൺടാക്റ്റുകൾ മാനേജ്ചെയ്യുക
+
+ കോൺടാക്റ്റ് മാനേജുമെന്റിനായി ലളിതവും മനോഹരവുമായ ഒരു ആപ്ലിക്കേഷൻ
+
+ A lightweight app for managing your contacts loved by millions of people. The contacts can be stored on your device only, but also synchronized via Google, or other accounts.
+
+ You can use it for managing user emails and events too. It has the ability to sort/filter by multiple parameters, optionally display surname as the first name.
+
+ You can display your favorite contacts or groups on a separate list. Groups can be used for sending out batch emails or SMS, to save you some time, you can rename them easily.
+
+ It contains handy buttons for calling, or texting your contacts. All visible fields can be customized as you wish, you can easily hide the unused ones. The search function will search the given string at every visible contact field, to make you find your desired contact easily.
+
+ There is a lightweight dialpad at your service too, with smart contact suggestions.
+
+ It supports exporting/importing contacts in vCard format to .vcf files, for easy migrations or backing up your data.
+
+ With this modern and stable contacts manager you can protect your contacts by not sharing them with other apps, so you can keep your contacts private.
+
+ Like the contact source, you can also easily change the contact name, email, phone number, address, organization, groups and many other customizable fields. You can use it for storing contact events too, like birthdays, anniversaries, or any other custom ones.
+
+ This simple contact editor has many handy settings like showing phone numbers on the main screen, toggle contact thumbnail visibility, showing only contacts with phone numbers, showing a call confirmation dialog before initiating a call. It comes with a quick dialer that also makes use of letters.
+
+ To further improve the user experience, you can customize what happens at clicking on a contact. You can either initiate a call, go to the View Details screen, or edit the selected contact.
+
+ You can easily block phone numbers to avoid unwanted incoming calls.
+
+ To avoid showing potentially unwanted contacts, it has a powerful built in duplicate contact merger.
+
+ It comes with material design and dark theme by default, provides great user experience for easy usage. The lack of internet access gives you more privacy, security and stability than other apps.
+
+ Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors.
+
+ Check out the full suite of Simple Tools here:
+ https://www.simplemobiletools.com
+
+ Standalone website of Simple Contacts Pro:
+ https://www.simplemobiletools.com/contacts
+
+ Facebook:
+ https://www.facebook.com/simplemobiletools
+
+ Reddit:
+ https://www.reddit.com/r/SimpleMobileTools
+
+
+
+
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 10f1a0f5..5015502f 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -4,7 +4,6 @@
Addres
Toevoegen…
Updaten…
- Telefoonopslag
Telefoonopslag (niet zichtbaar voor andere apps)
Bedrijf
Titel
@@ -16,11 +15,6 @@
%s bellen
Nieuw contact
Aan bestaand contact toevoegen
-
- this link. Bedankt!
- ]]>
-
Geen contacten met e-mailadressen gevonden
@@ -29,10 +23,6 @@
Nieuw contact
Contact bewerken
Contact kiezen
- Contacten kiezen
- Voornaam
- Tweede voornaam
- Achternaam
Bijnaam
@@ -52,7 +42,6 @@
Foto verwijderen
- Beginnen met achternaam
Telefoonnummers in hoofdscherm tonen
Contactafbeelding tonen
Knop voor toetsenblok in hoofdscherm tonen
@@ -60,13 +49,11 @@
Contact bellen
Details tonen
Contactvelden tonen/verbergen
- Probeer dubbele contacten weg te filteren
Tabs tonen/verbergen
Contacten
Om bevestiging vragen voor het bellen
Alleen contacten met telefoonnummers tonen
- Letters op het toetsenblok tonen
- Privécontacten in Eenvoudige Telefoon en Eenvoudige Berichten tonen
+ Privécontacten in Eenvoudige Telefoon, Eenvoudige Berichten tonen en Eenvoudige Agenda Pro
Thuis
@@ -87,7 +74,6 @@
Er zijn nog geen favorieten toegevoegd.
- Ga naar Contact bewerken om gegevens aan te passen
Contacten zoeken
@@ -107,26 +93,7 @@
Toetsenblok
Nummer aan contact toevoegen
-
- Bellen
- Beantwoorden
- Weigeren
- Nummer onbekend
- Inkomend gesprek…
- Bellen…
- Gesprek beëindigd
- Gesprek beëindigen
- Gesprek gaande
- Selecteer de SIM-kaart voor dit gesprek
- Voor dit nummer altijd deze SIM-kaart gebruiken
-
-
- Snelkiezer
- Snelkiezer bewerken
- Klik op een cijfer om er een contact aan te koppelen. Vervolgens kan dit contact direct gebeld worden door in de kiezer lang op het gekoppelde cijfer te drukken.
-
- Kies zichtbare velden
Voorvoegsel
Achtervoegsel van naam
Telefoonnummers
@@ -171,17 +138,17 @@
Met deze moderne en stabiele app kunnen contactpersonen worden beschermd door ze niet te delen met andere apps en zo privé te houden.
- Like the contact source, you can also easily change the contact name, email, phone number, address, organization, groups and many other customizable fields. You can use it for storing contact events too, like birthdays, anniversaries, or any other custom ones.
+ Naam, adres, telefoonnummer, e-mail, organisatie, groepen en vele andere velden zijn gemakkelijk aan te passen. Contacten kunnen worden verplaatst naar een andere account. Ook datums van verjaardagen en jubileums zijn op te slaan.
- This simple contact editor has many handy settings like showing phone numbers on the main screen, toggle contact thumbnail visibility, showing only contacts with phone numbers, showing a call confirmation dialog before initiating a call. It comes with a quick dialer that also makes use of letters.
+ Er zijn vele handige functies, zoals het tonen van telefoonnummers in het hoofdscherm, het tonen/verbergen van contactafbeeldingen, het alleen weergeven van contacten tonen met een telefoonnummer en het vooraf om bevestiging vragen bij het beginnen van een gesprek. De app bevat een snelkiezer waarin ook op naam gezocht kan worden.
- To further improve the user experience, you can customize what happens at clicking on a contact. You can either initiate a call, go to the View Details screen, or edit the selected contact.
+ Om de gebruikerservaring nog verder te verbeteren, kan worden gekozen wat er gebeurt bij een klik op een contact: er kan direct gebeld worden, de details kunnen worden geopend of het contact kan direct bewerkt worden.
- You can easily block phone numbers to avoid unwanted incoming calls.
+ Telefoonnummers kunnen eenvoudig worden geblokkeerd om ongewenste gesprekken te voorkomen.
- To avoid showing potentially unwanted contacts, it has a powerful built in duplicate contact merger.
+ Om potentieel ongewenste vermeldingen van contacten te voorkomen, kan de app dubbele contacten samenvoegen.
- It comes with material design and dark theme by default, provides great user experience for easy usage. The lack of internet access gives you more privacy, security and stability than other apps.
+ De app is ontworpen volgens material design en heeft standaard een donker thema. De app heeft geen toegang tot het internet nodig en voorziet van meer privacy, veiligheid en stabiliteit dan andere apps.
Bevat geen advertenties of onnodige machtigingen. Volledig open-source. Kleuren van de app kunnen worden aangepast.
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 82013eff..fc65632b 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -4,7 +4,6 @@
Adres
Dodawanie…
Aktualizowanie…
- Pamięć telefonu
Pamięć telefonu (niewidoczna dla innych aplikacji)
Firma
Stanowisko
@@ -16,11 +15,6 @@
Zadzwoń do: %s
Utwórz nowy kontakt
Dodaj do istniejącego kontaktu
-
- this link. Thanks!
- ]]>
-
Nie znaleziono kontaktów z adresami e-mail
@@ -29,10 +23,6 @@
Nowy kontakt
Edytuj kontakt
Wybierz kontakt
- Wybierz kontakty
- Pierwsze imię
- Drugie imię
- Nazwisko
Pseudonim
@@ -52,7 +42,6 @@
Usuń zdjęcie
- Zacznij nazwę od nazwiska
Pokazuj numery telefonów na ekranie głównym
Pokazuj miniatury kontaktów
Pokazuj przycisk panelu wybierania numeru na ekranie głównym
@@ -60,13 +49,11 @@
Zadzwoń do konataktu
Pokaż szczegóły kontaktu
Zarządzaj pokazywanymi polami kontaktu
- Spróbuj odfiltrować zduplikowane kontakty
Zarządzaj pokazywanymi sekcjami
Kontakty
Pokazuj okno potwierdzenia zadzwonienia przed zainicjonowaniem połączenia
Pokazuj wyłącznie kontakty z numerami telefonów
- Pokazuj litery na panelu wybierania
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Dom
@@ -87,7 +74,6 @@
Wygląda na to, że nie dodałeś jeszcze żadnego ulubionego kontaktu.
- Musisz wejść do ekranu edycji, aby zmodyfikować kontakt
Szukaj kontaktów
@@ -107,26 +93,7 @@
Panel wybierania
Dodaj numer do kontaktu
-
- Dialer
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Wybierz pola do pokazywania
Prefiks
Sufiks
Numery telefonów
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 9b26500d..e0385213 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -4,7 +4,6 @@
Endereço
Inserindo…
Atualizando…
- Armazenamento do telefone
Armazenamento do telefone (não visível por outros aplicativos)
Empresa
Cargo
@@ -16,11 +15,6 @@
Ligar para %s
Criar novo contato
Adicionar um contato existente
-
- this link. Thanks!
- ]]>
-
Não foram encontrados contatos com e-mails
@@ -29,10 +23,6 @@
Novo contato
Editar contato
Selecionar contato
- Selecionar contatos
- Primeiro nome
- Nome do meio
- Sobrenome
Apelido
@@ -52,7 +42,6 @@
Remover foto
- Ordenar por sobrenome
Mostrar número de telefone na tela principal
Mostrar miniatura do contato
Mostrar o botão do discador na tela principal
@@ -60,13 +49,11 @@
Ligar para o contato
Exibir detalhes do contato
Gerenciar os campos visíveis
- Tentar filtrar contatos duplicados
Gerenciar abas visíveis
Contatos
Mostrar diálogo para confirmar a chamada antes de ligar
Mostar apenas os contatos com número de telefone
- Mostrar letras no discador
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Residencial
@@ -87,7 +74,6 @@
Parece que você ainda não adicionou nenhum contato favorito.
- Você deve estar na tela de edição para modificar um contato
Procurar contatos
@@ -107,26 +93,7 @@
Discador
Adicionar número ao contato
-
- Discador
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Selecionar os campos a mostrar
Prefixo
Sufixo
Números de telefone
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 3ad0404a..a309c527 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -4,7 +4,6 @@
Endereço
A inserir…
A atualizar…
- Armazenamento do telefone
Armazenamento do telefone (não visível por outras alicações)
Organização
Cargo
@@ -16,11 +15,6 @@
Ligar a %s
Criar novo contacto
Adicionar a um contacto existente
-
- aqui. Obrigado!
- ]]>
-
Não existem contactos com endereço de e-mail
@@ -29,10 +23,6 @@
Novo contacto
Editar contacto
Selecionar contacto
- Selecionar contactos
- Primeiro nome
- Segundo nome
- Apelido
Alcunha
@@ -52,7 +42,6 @@
Remover foto
- Ordenar por apelido
Mostrar número de telefone no ecrã principal
Mostrar miniatura do contacto
Mostrar botão Marcador no ecrã principal
@@ -60,13 +49,11 @@
Ligar
Ver detalhes
Gerir campos a mostrar
- Tentar filtrar contactos duplicados
Gerir separadores a exibir
Contactos
Mostrar diálogo para confirmar a chamada
Mostrar apenas contactos com número de telefone
- Mostrar letras no marcador
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Mostrar contactos privados em Simple Dialer, Simple SMS Messenger e em Simple Calendar Pro
Pessoal
@@ -87,7 +74,6 @@
Parece que ainda não adicionou contactos aos favoritos
- Tem que estar no ecrã de edição para alterar um contacto
Pesquisar nos contactos
@@ -107,26 +93,7 @@
Marcador
Adicionar número a um contacto existente
-
- Marcador
- Aceitar
- Recusar
- Desconhecido
- Está a chamar…
- A ligar…
- Chamada terminada
- A terminar chamada
- Chamada em curso
- Selecione um SIM para esta chamada
- Utilizar sempre este SIM para ligar a este número
-
-
- Ligação rápida
- Gerir ligações rápidas
- Clique no número para atribuir um contacto a uma ligação rápida. Posteriormente, poderá ligar diretamente ao contacto através da tecla de ligação rápida.
-
- Selecione os campos a mostrar
Prefixo
Sufixo
Número de telefone
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index a3412b4c..d9460fd7 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -4,7 +4,6 @@
Адрес
Добавление…
Обновление…
- Память устройства
Память устройства (не видна другим приложениям)
Организация
Должность
@@ -16,11 +15,6 @@
Вызов %s
Создать новый контакт
Добавить к существующему контакту
-
- данной ссылке. Спасибо!
- ]]>
-
Контакты с адресами электронной почты не найдены
@@ -29,10 +23,6 @@
Новый контакт
Редактировать контакт
Выбрать контакт
- Выбрать контакты
- Имя
- Отчество
- Фамилия
Псевдоним
@@ -52,7 +42,6 @@
Удалить фото
- Показывать сначала фамилию
Показывать номера телефонов на главном экране
Показывать фото контакта
Показывать кнопку набора номера на главном экране
@@ -60,13 +49,11 @@
Вызов контакта
Просмотр подробностей
Управление отображаемыми полями контактов
- Отфильтровывать повторяющиеся контакты
Управление отображаемыми вкладками
Контакты
Показывать диалог подтверждения вызова
Показывать только контакты с номерами телефонов
- Показывать буквы на кнопках набора номера
- Показывать личные контакты в Simple Dialer и Simple SMS Messenger
+ Показывать личные контакты в Simple Dialer, Simple SMS Messenger и Simple Calendar Pro
Домашний
@@ -87,7 +74,6 @@
Похоже, вы ещё не добавили избранные контакты.
- Для изменения контакта необходимо находиться на экране редактирования
Поиск контактов
@@ -107,26 +93,7 @@
Набор номера
Добавить номер к контакту
-
- Номеронабиратель
- Принять
- Отклонить
- Неизвестный абонент
- Вызывает…
- Набор номера…
- Вызов завершён
- Завершение вызова
- Текущий вызов
- Выбор SIM для вызова
- Запомнить выбор для этого номера
-
-
- Быстрый набор
- Управление быстрым набором
- Нажмите на цифру, чтобы назначить ей контакт. Затем вы сможете быстро звонить данному контакту долгим нажитием на указанную цифру в номеронабирателе.
-
- Выберите отображаемые поля
Префикс
Суффикс
Телефонные номера
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 01a3eb19..7768b1ab 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -4,7 +4,6 @@
Adresa
Vytvára sa…
Upravuje sa…
- Úložisko mobilu
Úložisko mobilu (neviditeľné pre ostatné apky)
Firma
Pracovná pozícia
@@ -16,11 +15,6 @@
Zavolať %s
Vytvoriť nový kontakt
Pridať k existujúcemu kontaktu
-
- tomto odkaze. Vďaka!
- ]]>
-
Nenašli sa žiadne kontakty s emailami
@@ -29,10 +23,6 @@
Nový kontakt
Upraviť kontakt
Zvoľte kontakt
- Zvoľte kontakty
- Krstné meno
- Stredné meno
- Priezvisko
Prezývka
@@ -52,7 +42,6 @@
Odstrániť foto
- Začať meno priezviskom
Zobraziť telefónne čísla na hlavnej obrazovke
Zobraziť obrázky kontaktov
Zobraziť tlačidlo pre číselník na hlavnej obrazovke
@@ -60,13 +49,11 @@
Zavolať kontakt
Zobraziť údaje kontaktu
Spravovať zobrazené polia kontaktov
- Pokúsiť sa vyfiltrovať duplicitné kontakty
Spravovať zobrazené karty
Kontakty
Zobraziť pred spustením hovoru okno na jeho potvrdenie
Zobraziť iba kontakty s telefónnymi číslami
- Zobraziť na číselníku písmená
- Zobraziť súkromné kontakty Jednoduchému Telefónu a Jednoduchému Správcovi Súborov
+ Zobraziť súkromné kontakty Jednoduchému Telefónu, Jednoduchému SMS Správcovi a Jednoduchému Kalendáru Pro
Domov
@@ -87,7 +74,6 @@
Zdá sa, že ste ešte nepridali žiadne obľúbené kontakty.
- Pre úpravu kontaktu musíte byť v Editore kontaktu
Hľadať v kontaktoch
@@ -107,26 +93,7 @@
Číselník
Pridať číslo kontaktu
-
- Telefón
- Prijať
- Odmietnuť
- Neznámy volajúci
- Vám volá…
- Vytáčanie…
- Hovor ukončený
- Hovor končí
- Prebiehajúci hovor
- Zvoľte SIM pre tento hovor
- Stále použiť túto SIM pri volaní tohto čísla
-
-
- Rýchle vytáčanie
- Spravovať rýchle vytáčanie
- Pre priradenie kontaktu kliknite na číslo. Následne viete daný kontakt rýchlo vytočiť dlhým podržaním čísla na číselníku.
-
- Zvoľte polia na zobrazenie
Titul pred menom
Titul za priezviskom
Telefónne čísla
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index f9d3da3d..e95df35f 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -4,7 +4,6 @@
Adress
Lägger till…
Uppdaterar…
- Telefonens lagringsutrymme
Telefonens lagringsutrymme (inte synligt för andra appar)
Företag
Befattning
@@ -16,11 +15,6 @@
Ring %s
Skapa ny kontakt
Lägg till i en befintlig kontakt
-
- this link. Thanks!
- ]]>
-
Inga kontakter med e-postadresser hittades
@@ -29,10 +23,6 @@
Ny kontakt
Redigera kontakt
Välj kontakt
- Välj kontakter
- Förnamn
- Mellannamn
- Efternamn
Smeknamn
@@ -52,7 +42,6 @@
Ta bort foto
- Visa efternamn först
Visa telefonnummer i huvudvyn
Visa kontaktminiatyrer
Visa en knappsatsknapp i huvudvyn
@@ -60,13 +49,11 @@
Ring kontakt
Visa kontaktuppgifter
Välj vilka kontaktfält som ska visas
- Försök filtrera bort dubblettkontakter
Välj vilka flikar som ska visas
Kontakter
Visa en bekräftelsedialogruta före uppringning
Visa bara kontakter med telefonnummer
- Visa bokstäver på knappsatsen
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Hem
@@ -87,7 +74,6 @@
Det verkar som att du inte har lagt till några favoritkontakter ännu.
- Kontakter kan bara redigeras i redigeringsvyn
Sök efter kontakter
@@ -107,26 +93,7 @@
Knappsats
Lägg till nummer i kontakt
-
- Telefon
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Välj vilka fält som ska visas
Prefix
Suffix
Telefonnummer
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 783e66cd..86616fc0 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -4,7 +4,6 @@
Adres
Ekleniyor…
Güncelleniyor…
- Telefon belleği
Telefon belleği (diğer uygulamalar tarafından görülmez)
Şirket
İş pozisyonu
@@ -16,11 +15,6 @@
%s kişisini ara
Yeni kişi oluştur
Mevcut bir kişiye ekle
-
- bu bağlantıdan indirin. Teşekkürler!
- ]]>
-
E-posta ile hiç bağlantı bulunamadı
@@ -29,10 +23,6 @@
Yeni kişi
Kişiyi düzenle
Kişi seç
- Kişileri seç
- Adı
- Göbek adı
- Soyadı
Takma adı
@@ -52,7 +42,6 @@
Fotoğrafı kaldır
- Soyadı ile başla
Ana ekranda telefon numaralarını göster
Kişi küçük resimlerini göster
Ana ekranda tuş takımı düğmesini göster
@@ -60,13 +49,11 @@
Kişiyi ara
Kişi bilgilerini göster
Görüntülenecek kişi alanlarını yönet
- Çift kişileri filtrelemeyi dene
Gösterilen sekmeleri yönet
Kişiler
Arama başlatmadan önce arama onayı penceresi göster
Sadece telefon numaralarını içeren kişileri göster
- Tuş takımında harfleri göster
- Özel kişileri Basit Çevirici ve Basit SMS Messenger\'a göster
+ Özel kişileri Basit Çevirici, Basit SMS Messenger ve Basit Takvim Pro\'a göster
Ev
@@ -87,7 +74,6 @@
Henüz herhangi bir favori kişi eklememişsiniz.
- Bir kişiyi değiştirmek için Düzen ekranında olmalısınız
Kişileri ara
@@ -107,26 +93,7 @@
Tuş takımı
Kişiye numara ekle
-
- Çevirici
- Kabul Et
- Reddet
- Bilinmeyen Arama
- Arıyor…
- Çevriliyor…
- Arama Sonlandırıldı
- Arama Sonlandırılıyor
- Devam Eden Arama
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Hızlı arama
- Hızlı aramayı yönet
- Bir kişiyi bir numaraya atamak için numaraya tıklayın. Daha sonra atanan kişiyi çeviricide atanan numaraya uzun basarak hızlıca arayabilirsiniz.
-
- Görüntülenecek alanları seç
Önek
Sonek
Telefon numaraları
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 0be8b340..62f701c0 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -4,7 +4,6 @@
Адреса
Триває додавання…
Триває оновлення…
- Пам\'ять пристрою
Пам\'ять пристрою (прихована від інших додатків)
Компанія
Посада
@@ -16,11 +15,6 @@
Телефонувати %s
Створити новий контакт
Додати до існуючого контакту
-
- this link. Thanks!
- ]]>
-
Не знайдено контактів з електронною поштою
@@ -29,10 +23,6 @@
Новий контакт
Редагувати контакт
Обрати контакт
- Обрати контакти
- Ім\'я
- По-батькові
- Прізвище
Прізвисько
@@ -52,7 +42,6 @@
Видалити фото
- Показувати спочатку прізвище
Показувати телефонні номери у списку контактів
Показувати фото контакту
Показувати панель набору номерів на головному екрані
@@ -60,13 +49,11 @@
Телефонувати контакту
Переглянути деталі контакту
Керування полями контактів, що відображаються
- Фільтрувати контакти, що дублюються
Керування вкладками, що відображаються
Контакти
Показувати діалог підтвердження виклику
Показувати лише контакти з телефонними номерами
- Показувати літери на панелі набору
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Домашній
@@ -87,7 +74,6 @@
Здається, ви ще не додали улюблені контакти.
- Для того, щоб змінити контакт, необхідно відкрити меню редагування
Пошук контактів
@@ -107,26 +93,7 @@
Панель набору
Додати номер до контакту
-
- Набір номера
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Обрати поля контактних даних
Префікс
Суфікс
Телефонні номери
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 416866b7..c2f885da 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -1,10 +1,9 @@
- 简约通讯录
- 简约通讯录
+ 简易通讯录
+ 通讯录
地址
添加中…
更新中…
- 手机空间
手机空间 (其他程序不可见)
公司
职位
@@ -16,11 +15,6 @@
打电话给 %s
建立新联系人
添加至已存在的联系人
-
- this link. Thanks!
- ]]>
-
未发现含有电子邮箱的联系人
@@ -29,10 +23,6 @@
新联系人
编辑联系人
选择联系人
- 选择联系人
- 名字
- 中间名
- 姓氏
昵称
@@ -52,24 +42,21 @@
移除照片
- 姓氏在前
主页面显示电话号码
显示联系人缩图
在主页面显示拨号按钮
点击联系人
打电话给联系人
显示联系人资料
- 管理显示的联系人栏位
- 试着过滤重复的联系人
+ 管理显示的联系人字段
管理显示的页面
联系人
开始通话前显示通话确认框
只显示含有电话话码的联系人
- 在拨号界面上显示字母
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ 显示私密联系人给简易拨号器和简易短信
- 住家
+ 家庭
工作
其它
@@ -77,7 +64,7 @@
手机
主用
工作传真
- 住家传真
+ 家庭传真
呼叫器
未发现电话号码
@@ -86,13 +73,12 @@
纪念日
- 你似乎还没加入任何我的收藏联系人。
- 你必须在编辑页面去修改联系人
+ 您似乎还没加入任何我的收藏联系人。
搜索联系人
搜索我的收藏
- Search groups
+ 搜索群组
导入联系人
@@ -107,26 +93,7 @@
拨号界面
添加号码至通讯录
-
- 拨号器
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- 选择要显示的栏位
前缀
后缀
电话号码
@@ -140,55 +107,55 @@
即时通讯 (IM)
- The contact will be removed from all contact sources.
+ 该联系人将会被从所有联系人来源移除。
- - %d group
- - %d groups
+ - %d 群组
+ - %d 群组
- 我想要更改在通讯录会看到哪些栏位。我能这么做吗?
- 可以,你要做的是到[设置] -> [管理显示的联系人栏位]。在那里,你可以选择应该看到什么栏位。其中有些甚至默认是关闭的,所以你可能会在那里发现一些新的。
+ 我想要更改在通讯录会看到哪些字段。我能这么做吗?
+ 可以,您要做的是到[设置] -> [管理显示的联系人字段]。在那里,您可以选择应该看到什么字段。其中有些甚至默认是关闭的,所以您可能会在那里发现一些新的。
- Simple Contacts Pro - Manage your contacts easily
+ 简易通讯录 Pro - 轻松管理您的联系人
- Easy and quick contact management with no ads, handles groups and favorites too.
+ 简单快速无广告的联系人管理,亦可处理群组和收藏。
- A lightweight app for managing your contacts loved by millions of people. The contacts can be stored on your device only, but also synchronized via Google, or other accounts.
+ 得到百万人喜爱的轻量级联系人管理应用。联系人可以仅保存在您的设备上,但也可以通过 Google 或者其他账户同步。
- You can use it for managing user emails and events too. It has the ability to sort/filter by multiple parameters, optionally display surname as the first name.
+ 您也可以使用它管理用户电子邮件地址和活动。它具备依据多个参数进行排序和过滤的能力,也可选将姓氏显示在前。
- You can display your favorite contacts or groups on a separate list. Groups can be used for sending out batch emails or SMS, to save you some time, you can rename them easily.
+ 您可以在一个分开的列表显示您收藏的联系人或者群组。群组可以被用来批量发送电子邮件或者短信,为节省时间,您也可以轻易将其重命名。
- It contains handy buttons for calling, or texting your contacts. All visible fields can be customized as you wish, you can easily hide the unused ones. The search function will search the given string at every visible contact field, to make you find your desired contact easily.
+ 它具备呼叫或者短信您联系的便捷按钮。所有可见的字段均可以依据您的意愿自定义,当然也可以轻易的隐藏不使用的。搜索功能会在联系人的全部可见字段搜索指定的字符串,使您便捷的找到所需的联系人。
- There is a lightweight dialpad at your service too, with smart contact suggestions.
+ 同时具备一个轻量级的拨号盘,具备智能联系人推荐功能。
- It supports exporting/importing contacts in vCard format to .vcf files, for easy migrations or backing up your data.
+ 它支持将 vCard 格式导出和导入为 .vcf 文件,方便您迁移或者备份您的数据。
- With this modern and stable contacts manager you can protect your contacts by not sharing them with other apps, so you can keep your contacts private.
+ 借助此现代化且稳定的联系人管理器,您可以保护您的通讯录不被其他应用共用,从而保持您的通讯录私密性。
- Like the contact source, you can also easily change the contact name, email, phone number, address, organization, groups and many other customizable fields. You can use it for storing contact events too, like birthdays, anniversaries, or any other custom ones.
+ 如同联系人来源,您可以轻松的更改联系人名字、电子邮件、电话号码、地址、组织、群组和许多其他自定义字段。您也可以使用它来保存联系人活动,比如生日、纪念日或者其他任何自定义的类型。
- This simple contact editor has many handy settings like showing phone numbers on the main screen, toggle contact thumbnail visibility, showing only contacts with phone numbers, showing a call confirmation dialog before initiating a call. It comes with a quick dialer that also makes use of letters.
+ 此款简易联系人编辑器包含许多便捷的设定,诸如在主屏幕显示电话号码、切换联系人缩略图可见性、仅显示包含电话号码的联系人和在发起呼叫前显示确认对话框。它还包括一个使用字母的快速拨号器。
- To further improve the user experience, you can customize what happens at clicking on a contact. You can either initiate a call, go to the View Details screen, or edit the selected contact.
+ 为了更好的提升用户体验,您可以自定义点击联系人时的行为。您可以发起呼叫、前往详情查看页面或者编辑选定的联系人。
- You can easily block phone numbers to avoid unwanted incoming calls.
+ 您可以阻止某个电话号码来避免不需要的呼入来电。
- To avoid showing potentially unwanted contacts, it has a powerful built in duplicate contact merger.
+ 为了避免显示可能不想要的联系人,它内建有一个重复联系人合并工具。
- It comes with material design and dark theme by default, provides great user experience for easy usage. The lack of internet access gives you more privacy, security and stability than other apps.
+ 它遵循质感设计且默认应用黑暗模式,提供便于使用的极佳的用户体验。相对于其他应用,不包含互联网访问给予您更佳的隐私、保密性和稳定性。
- 不包含广告及非必要的权限,而且完全开放源代码,并提供自定义颜色。
+ 不包含广告和不必要的权限。它完全开放源代码,提供可自定义的颜色。
- Check out the full suite of Simple Tools here:
+ 于此查看简易工具系列全套:
https://www.simplemobiletools.com
- Standalone website of Simple Contacts Pro:
+ 简易通讯录 Pro 的独立网站:
https://www.simplemobiletools.com/contacts
Facebook:
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index e1ea7e75..e739f373 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -4,7 +4,6 @@
地址
添加中…
更新中…
- 手機空間
手機空間 (其他程式不可見)
公司
職位
@@ -16,11 +15,6 @@
打電話給 %s
建立新聯絡人
添加至已存在的聯絡人
-
- this link. Thanks!
- ]]>
-
未發現含有電子信箱的聯絡人
@@ -29,10 +23,6 @@
新聯絡人
編輯聯絡人
選擇聯絡人
- 選擇聯絡人
- 名字
- 中間名
- 姓氏
暱稱
@@ -52,7 +42,6 @@
移除相片
- 姓氏在前
主畫面顯示電話號碼
顯示聯絡人縮圖
在主畫面顯示撥號按鈕
@@ -60,13 +49,11 @@
打電話給聯絡人
顯示聯絡人資料
管理顯示的聯絡人欄位
- 試著過濾重複的聯絡人
管理顯示的頁面
聯絡人
開始通話前顯示通話確認框
只顯示含有電話話碼的聯絡人
- 在撥號畫面上顯示字母
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
住家
@@ -87,7 +74,6 @@
你似乎還沒加入任何我的最愛聯絡人。
- 你必須在編輯畫面去修改聯絡人
搜尋聯絡人
@@ -107,26 +93,7 @@
撥號畫面
添加號碼至通訊錄
-
- 撥號器
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- 快速撥號
- 管理快速撥號
- 點擊一個數字以分配一個聯絡人給它。然後你可以在撥號器上,長按指定的數字來快速撥號給指定的聯絡人。
-
- 選擇要顯示的欄位
前缀
後綴
電話號碼
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
deleted file mode 100644
index 03cc889a..00000000
--- a/app/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
- #33FFFFFF
-
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index e4a6c4ad..5fe71800 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -4,10 +4,5 @@
48dp
40dp
60dp
- 72dp
- 30dp
-
- 34sp
- 20sp
- 34sp
+ 300dp
diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml
index 41c8cb99..a49dc323 100644
--- a/app/src/main/res/values/donottranslate.xml
+++ b/app/src/main/res/values/donottranslate.xml
@@ -12,6 +12,7 @@
ICQ
Jabber
Telegram
+ Viber
Added an initial implementation of Speed Dial, contacts can be set in the app settings
@@ -39,6 +40,4 @@
Added Address and Notes fields
Allow storing contacts in a local database, hidden from other apps
- %1$s (%2$s)
-
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ff8a0308..209bf69c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -4,7 +4,6 @@
Address
Inserting…
Updating…
- Phone storage
Phone storage (not visible by other apps)
Company
Job position
@@ -16,11 +15,6 @@
Call %s
Create new contact
Add to an existing contact
-
- this link. Thanks!
- ]]>
-
No contacts with emails have been found
@@ -29,10 +23,6 @@
New contact
Edit contact
Select contact
- Select contacts
- First name
- Middle name
- Surname
Nickname
@@ -52,7 +42,6 @@
Remove photo
- Start name with surname
Show phone numbers on the main screen
Show contact thumbnails
Show a dialpad button on the main screen
@@ -60,13 +49,11 @@
Call contact
View contact details
Manage shown contact fields
- Try filtering out duplicate contacts
Manage shown tabs
Contacts
Show a call confirmation dialog before initiating a call
Show only contacts with phone numbers
- Show letters on the dialpad
- Show private contacts to Simple Dialer and Simple SMS Messenger
+ Show private contacts to Simple Dialer, Simple SMS Messenger and Simple Calendar Pro
Home
@@ -87,7 +74,6 @@
Seems like you haven\'t added any favorite contacts yet.
- You must be at the Edit screen to modify a contact
Search contacts
@@ -107,26 +93,7 @@
Dialpad
Add number to contact
-
- Dialer
- Accept
- Decline
- Unknown Caller
- Is Calling…
- Dialing…
- Call Ended
- Call Ending
- Ongoing Call
- Select a SIM for this call
- Always use this SIM for this number
-
-
- Speed dial
- Manage speed dial
- Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer.
-
- Select fields to show
Prefix
Suffix
Phone numbers
@@ -155,7 +122,7 @@
Simple Contacts Pro - Manage your contacts easily
- Easy and quick contact management with no ads, handles groups and favorites too.
+ A premium app for contact management with no ads, supports groups and favorites
A lightweight app for managing your contacts loved by millions of people. The contacts can be stored on your device only, but also synchronized via Google, or other accounts.
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index f9f377e2..9c3b80f3 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,19 +1,5 @@
-
-
-
-
-
+
diff --git a/build.gradle b/build.gradle
index d991c1f9..9e841957 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
- ext.kotlin_version = '1.3.72'
+ ext.kotlin_version = '1.4.10'
repositories {
google()
@@ -9,7 +9,7 @@ buildscript {
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.6.3'
+ classpath 'com.android.tools.build:gradle:4.0.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
diff --git a/fastlane/metadata/android/de/short_description.txt b/fastlane/metadata/android/de/short_description.txt
index 357f4ee9..ff703e67 100644
--- a/fastlane/metadata/android/de/short_description.txt
+++ b/fastlane/metadata/android/de/short_description.txt
@@ -1 +1 @@
-Verwaltet Ihre Kontakte ohne Werbeanzeigen und respektiert Ihre Privatsphäre.
+Verwalten Sie Ihre Kontakte professionell, schnell und sicher mit dieser App
diff --git a/fastlane/metadata/android/en-US/changelogs/64.txt b/fastlane/metadata/android/en-US/changelogs/64.txt
new file mode 100644
index 00000000..e0c6effe
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/64.txt
@@ -0,0 +1,6 @@
+ * All calling related functions with many improvements have been moved into the new Simple Dialer app, please get it from https://play.google.com/store/apps/details?id=com.simplemobiletools.dialer
+ * Added a toggle for accessing privately stored contacts by Simple Dialer and Simple SMS Messenger apps
+ * Removed many no longer needed permissions
+ * Lowered the minimal required OS version back to 21 (Android 5, Lollipop)
+ * Allow customizing the default tab at startup
+ * Added a couple other UI and translation improvements
diff --git a/fastlane/metadata/android/en-US/changelogs/65.txt b/fastlane/metadata/android/en-US/changelogs/65.txt
new file mode 100644
index 00000000..85e7d6e5
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/65.txt
@@ -0,0 +1,2 @@
+ * Use Call action at clicking the phone icon, not just Dial
+ * Use a nicer app icon on some older Android versions
diff --git a/fastlane/metadata/android/en-US/changelogs/67.txt b/fastlane/metadata/android/en-US/changelogs/67.txt
new file mode 100644
index 00000000..60c92b88
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/67.txt
@@ -0,0 +1 @@
+ * Properly handle call initiating
diff --git a/fastlane/metadata/android/en-US/changelogs/68.txt b/fastlane/metadata/android/en-US/changelogs/68.txt
new file mode 100644
index 00000000..524744d1
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/68.txt
@@ -0,0 +1,3 @@
+ * Added sorting by full name, which is the way most people expect sorting to work
+ * Improve searching, do not reset it at opening a contact
+ * Some translation and stability improvements
diff --git a/fastlane/metadata/android/en-US/changelogs/69.txt b/fastlane/metadata/android/en-US/changelogs/69.txt
new file mode 100644
index 00000000..50e435cd
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/69.txt
@@ -0,0 +1,2 @@
+ * Properly check phone numbers at Search too
+ * Fixed a glitch with wrong contacts being listed
diff --git a/fastlane/metadata/android/en-US/changelogs/70.txt b/fastlane/metadata/android/en-US/changelogs/70.txt
new file mode 100644
index 00000000..7bb4c87a
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/70.txt
@@ -0,0 +1 @@
+ * Reverting a check at fetching contacts, let's show more contacts rather than less
diff --git a/fastlane/metadata/android/en-US/changelogs/71.txt b/fastlane/metadata/android/en-US/changelogs/71.txt
new file mode 100644
index 00000000..53fb3082
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/71.txt
@@ -0,0 +1 @@
+ * Adding some private contact handling related improvements
diff --git a/fastlane/metadata/android/en-US/changelogs/72.txt b/fastlane/metadata/android/en-US/changelogs/72.txt
new file mode 100644
index 00000000..c0cabefe
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/72.txt
@@ -0,0 +1 @@
+ * Adding some smaller translation, stability and UX improvements
diff --git a/fastlane/metadata/android/en-US/changelogs/73.txt b/fastlane/metadata/android/en-US/changelogs/73.txt
new file mode 100644
index 00000000..905cd26b
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/73.txt
@@ -0,0 +1 @@
+ * Adding some improvements related to contacts having multiple phone numbers
diff --git a/fastlane/metadata/android/en-US/changelogs/74.txt b/fastlane/metadata/android/en-US/changelogs/74.txt
new file mode 100644
index 00000000..34445e30
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/74.txt
@@ -0,0 +1,3 @@
+ * Allow adding contact events without specifying a year
+ * Always show the contacts middle name after the first name
+ * Make sure groups are properly sorted by name
diff --git a/fastlane/metadata/android/en-US/changelogs/75.txt b/fastlane/metadata/android/en-US/changelogs/75.txt
new file mode 100644
index 00000000..bd5bcbef
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/75.txt
@@ -0,0 +1,2 @@
+ * Do not require the Telephony hardware feature for installing the app
+ * Some translation and UX improvements
diff --git a/fastlane/metadata/android/en-US/changelogs/76.txt b/fastlane/metadata/android/en-US/changelogs/76.txt
new file mode 100644
index 00000000..64f58851
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/76.txt
@@ -0,0 +1,2 @@
+ * Fixed search with non UTF characters
+ * Added many smaller translation and UX improvements
diff --git a/fastlane/metadata/android/en-US/changelogs/77.txt b/fastlane/metadata/android/en-US/changelogs/77.txt
new file mode 100644
index 00000000..de9c2bcf
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/77.txt
@@ -0,0 +1,3 @@
+ * Redesigned the View and Edit screens, use bigger contact image
+ * Added quick action buttons to Viber, WhatsApp, Telegram and Signal contacts
+ * Added some UX and translation improvements
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.jpg
index 6fcde946..a3a5fdc6 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.jpg
index a3a5fdc6..109fbcea 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_5.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_5.jpg
deleted file mode 100644
index 109fbcea..00000000
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_5.jpg and /dev/null differ
diff --git a/fastlane/metadata/android/en-US/images/raw_screenshots/app_4.jpg b/fastlane/metadata/android/en-US/images/raw_screenshots/app_4.jpg
index 1cf552f5..fb3bc478 100644
Binary files a/fastlane/metadata/android/en-US/images/raw_screenshots/app_4.jpg and b/fastlane/metadata/android/en-US/images/raw_screenshots/app_4.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/raw_screenshots/app_5.jpg b/fastlane/metadata/android/en-US/images/raw_screenshots/app_5.jpg
deleted file mode 100644
index fb3bc478..00000000
Binary files a/fastlane/metadata/android/en-US/images/raw_screenshots/app_5.jpg and /dev/null differ
diff --git a/fastlane/metadata/android/en-US/images/raw_screenshots/app_6.png b/fastlane/metadata/android/en-US/images/raw_screenshots/app_5.png
similarity index 100%
rename from fastlane/metadata/android/en-US/images/raw_screenshots/app_6.png
rename to fastlane/metadata/android/en-US/images/raw_screenshots/app_5.png
diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt
index 754859ae..0bbc6a7e 100644
--- a/fastlane/metadata/android/en-US/short_description.txt
+++ b/fastlane/metadata/android/en-US/short_description.txt
@@ -1 +1 @@
-A contacts app for managing your contacts without ads.
+A premium app for contact management with no ads, supports groups and favorites
diff --git a/fastlane/metadata/android/es/short_description.txt b/fastlane/metadata/android/es/short_description.txt
index b8012a08..edd23f6c 100644
--- a/fastlane/metadata/android/es/short_description.txt
+++ b/fastlane/metadata/android/es/short_description.txt
@@ -1 +1 @@
-Una app para administrar tus contactos sin anuncios, respetando tu privacidad.
+La mejor app de gestión de contactos con soporte de la función de grupos
diff --git a/fastlane/metadata/android/zh-rCN/full_description.txt b/fastlane/metadata/android/zh-rCN/full_description.txt
index 17be6ae4..29e80e61 100644
--- a/fastlane/metadata/android/zh-rCN/full_description.txt
+++ b/fastlane/metadata/android/zh-rCN/full_description.txt
@@ -1,7 +1,39 @@
-一个用来从任何来源建立或管理联系人的简约应用程序。联系人只能储存于你的设备上,不过也能透过Google或其他帐号来同步。你能将我的收藏联系人显示在独立名单上。
+得到百万人喜爱的轻量级联系人管理应用。联系人可以仅保存在您的设备上,但也可以通过 Google 或者其他账户同步。
-你也能用来管理使用者信箱和活动。它能够以多项参数来排序/筛选,以及选择将姓氏显示在名字前面。
+您也可以使用它管理用户电子邮件地址和活动。它具备依据多个参数进行排序和过滤的能力,也可选将姓氏显示在前。
-不包含广告及非必要的权限,而且完全开放源代码,并提供自定义颜色。
+您可以在一个分开的列表显示您收藏的联系人或者群组。群组可以被用来批量发送电子邮件或者短信,为节省时间,您也可以轻易将其重命名。
-这程序只是一系列众多应用程序的其中一项,你可以在这发现更多 https://www.simplemobiletools.com
+它具备呼叫或者短信您联系的便捷按钮。所有可见的字段均可以依据您的意愿自定义,当然也可以轻易的隐藏不使用的。搜索功能会在联系人的全部可见字段搜索指定的字符串,使您便捷的找到所需的联系人。
+
+同时具备一个轻量级的拨号盘,具备智能联系人推荐功能。
+
+它支持将 vCard 格式导出和导入为 .vcf 文件,方便您迁移或者备份您的数据。
+
+借助此现代化且稳定的联系人管理器,您可以保护您的通讯录不被其他应用共用,从而保持您的通讯录私密性。
+
+如同联系人来源,您可以轻松的更改联系人名字、电子邮件、电话号码、地址、组织、群组和许多其他自定义字段。您也可以使用它来保存联系人活动,比如生日、纪念日或者其他任何自定义的类型。
+
+此款简易联系人编辑器包含许多便捷的设定,诸如在主屏幕显示电话号码、切换联系人缩略图可见性、仅显示包含电话号码的联系人和在发起呼叫前显示确认对话框。它还包括一个使用字母的快速拨号器。
+
+为了更好的提升用户体验,您可以自定义点击联系人时的行为。您可以发起呼叫、前往详情查看页面或者编辑选定的联系人。
+
+您可以阻止某个电话号码来避免不需要的呼入来电。
+
+为了避免显示可能不想要的联系人,它内建用一个重复联系人合并工具。
+
+它遵循质感设计且默认应用黑暗模式,提供便于使用的极佳的用户体验。相对于其他应用,不包含互联网访问给予您更佳的隐私、保密性和稳定性。
+
+不包含广告和不必要的权限。它完全开放源代码,提供可自定义的颜色。
+
+于此查看简易工具系列全套:
+https://www.simplemobiletools.com
+
+简易通讯录 Pro 的独立网站:
+https://www.simplemobiletools.com/contacts
+
+Facebook:
+https://www.facebook.com/simplemobiletools
+
+Reddit:
+https://www.reddit.com/r/SimpleMobileTools
diff --git a/fastlane/metadata/android/zh-rCN/short_description.txt b/fastlane/metadata/android/zh-rCN/short_description.txt
index cf703058..ea5f8309 100644
--- a/fastlane/metadata/android/zh-rCN/short_description.txt
+++ b/fastlane/metadata/android/zh-rCN/short_description.txt
@@ -1 +1 @@
-一个没有广告的通讯录应用程序,用来管理联系人,并且尊重您的隐私。
+简单快速无广告的联系人管理,亦可处理群组和收藏。
diff --git a/fastlane/metadata/android/zh-rCN/title.txt b/fastlane/metadata/android/zh-rCN/title.txt
index d7d55d07..c7ab37a5 100644
--- a/fastlane/metadata/android/zh-rCN/title.txt
+++ b/fastlane/metadata/android/zh-rCN/title.txt
@@ -1 +1 @@
-简约通讯录
+简易通讯录 Pro - 轻松管理您的联系人
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 8a03306d..272e8b44 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Sun Mar 15 21:46:10 CET 2020
+#Thu Jun 18 23:08:40 CEST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip