Merge pull request #29 from SimpleMobileTools/master

upd
This commit is contained in:
solokot 2020-05-01 23:01:45 +03:00 committed by GitHub
commit a73c63f053
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
125 changed files with 3474 additions and 2951 deletions

View File

@ -1,6 +1,26 @@
Changelog
==========
Version 6.9.0 *(2020-04-16)*
----------------------------
* Use colored contact avatars with the first letter of their name to make the app happier :)
* Properly recognize the local Phone contact source, even when empty
* Fix some glitches related to the letters in the fastscroller not being correctly sorted
* Couple other stability, translation and UI improvements
Version 6.8.0 *(2020-03-18)*
----------------------------
* Remember the last used folder at contacts exporting
* Do not request the Storage permission on Android 10+, use Scoped Storage
Version 6.7.1 *(2020-03-08)*
----------------------------
* Fixed some letter scrollbar related glitches
* Added some translation and stability related improvements
Version 6.7.0 *(2020-02-05)*
----------------------------

View File

@ -1,5 +1,5 @@
# Simple Contacts
<img alt="Logo" src="app/src/main/res/mipmap-xxxhdpi/ic_launcher.png" width="80" />
<img alt="Logo" src="fastlane/metadata/android/en-US/images/icon.png" width="120" />
A simple app for creating or managing your contacts from any source. The contacts can be stored on your device only, but also synchronized via Google, or other accounts. You can display your favorite contacts on a separate list.

View File

@ -11,14 +11,14 @@ if (keystorePropertiesFile.exists()) {
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "com.simplemobiletools.contacts.pro"
minSdkVersion 21
targetSdkVersion 29
versionCode 57
versionName "6.7.0"
versionCode 60
versionName "6.9.0"
setProperty("archivesBaseName", "contacts")
}
@ -57,13 +57,13 @@ android {
}
dependencies {
implementation 'com.simplemobiletools:commons:5.22.10'
implementation 'com.simplemobiletools:commons:5.27.1'
implementation 'joda-time:joda-time:2.10.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4'
implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.5'
implementation 'com.github.tibbi:IndicatorFastScroll:d615a5c141'
implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a'
kapt "androidx.room:room-compiler:2.2.2"
implementation "androidx.room:room-runtime:2.2.2"
annotationProcessor "androidx.room:room-compiler:2.2.2"
kapt "androidx.room:room-compiler:2.2.5"
implementation "androidx.room:room-runtime:2.2.5"
annotationProcessor "androidx.room:room-compiler:2.2.5"
}

View File

@ -9,13 +9,17 @@
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
<uses-feature
android:name="android.hardware.telephony"
@ -30,7 +34,6 @@
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_launcher_name"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/AppTheme">
@ -60,6 +63,12 @@
</intent-filter>
</activity>
<activity
android:name=".activities.CallActivity"
android:label="@string/ongoing_call"
android:screenOrientation="portrait"
android:showOnLockScreen="true"/>
<activity
android:name=".activities.SettingsActivity"
android:label="@string/settings"
@ -216,7 +225,7 @@
android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/>
<activity
android:name=".activities.ManageBlockedNumbersActivity"
android:name="com.simplemobiletools.commons.activities.ManageBlockedNumbersActivity"
android:label="@string/blocked_numbers"
android:parentActivityName=".activities.SettingsActivity"/>
@ -257,6 +266,25 @@
</intent-filter>
</activity>
<service
android:name=".services.CallService"
android:permission="android.permission.BIND_INCALL_SERVICE">
<meta-data
android:name="android.telecom.IN_CALL_SERVICE_UI"
android:value="true" />
<intent-filter>
<action android:name="android.telecom.InCallService"/>
</intent-filter>
</service>
<receiver android:name=".receivers.CallActionReceiver">
<intent-filter>
<action android:name="com.simplemobiletools.contacts.action.ACCEPT_CALL"/>
<action android:name="com.simplemobiletools.contacts.action.DECLINE_CALL"/>
</intent-filter>
</receiver>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"

View File

@ -0,0 +1,361 @@
package com.simplemobiletools.contacts.pro.activities
import android.annotation.SuppressLint
import android.app.*
import android.content.Context
import android.content.Intent
import android.graphics.*
import android.media.AudioManager
import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.os.PowerManager
import android.provider.MediaStore
import android.telecom.Call
import android.util.Size
import android.view.WindowManager
import android.widget.RemoteViews
import androidx.core.app.NotificationCompat
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.MINUTE_SECONDS
import com.simplemobiletools.commons.helpers.isOreoMr1Plus
import com.simplemobiletools.commons.helpers.isOreoPlus
import com.simplemobiletools.commons.helpers.isQPlus
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.extensions.audioManager
import com.simplemobiletools.contacts.pro.extensions.config
import com.simplemobiletools.contacts.pro.helpers.ACCEPT_CALL
import com.simplemobiletools.contacts.pro.helpers.CallManager
import com.simplemobiletools.contacts.pro.helpers.DECLINE_CALL
import com.simplemobiletools.contacts.pro.models.CallContact
import com.simplemobiletools.contacts.pro.receivers.CallActionReceiver
import kotlinx.android.synthetic.main.activity_call.*
import java.util.*
class CallActivity : SimpleActivity() {
private val CALL_NOTIFICATION_ID = 1
private var isSpeakerOn = false
private var isMicrophoneOn = true
private var isCallEnded = false
private var callDuration = 0
private var callContact: CallContact? = null
private var callContactAvatar: Bitmap? = null
private var proximityWakeLock: PowerManager.WakeLock? = null
private var callTimer = Timer()
override fun onCreate(savedInstanceState: Bundle?) {
supportActionBar?.hide()
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_call)
updateTextColors(call_holder)
initButtons()
callContact = CallManager.getCallContact(applicationContext)
callContactAvatar = getCallContactAvatar()
addLockScreenFlags()
setupNotification()
updateOtherPersonsInfo()
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_wrapper.setBackgroundColor(config.backgroundColor)
}
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
}
val callContact = CallManager.getCallContact(applicationContext) ?: 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_ACTIVE -> callStarted()
Call.STATE_DISCONNECTED -> endCall()
Call.STATE_CONNECTING -> initOutgoingCallUI()
}
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 callStarted() {
incoming_call_holder.beGone()
ongoing_call_holder.beVisible()
audioManager.mode = AudioManager.MODE_IN_CALL
callTimer.scheduleAtFixedRate(getCallTimerUpdateTask(), 1000, 1000)
}
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 {
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)
.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
}
}

View File

@ -1,9 +1,10 @@
package com.simplemobiletools.contacts.pro.activities
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.provider.ContactsContract
import android.provider.ContactsContract.CommonDataKinds.*
import android.widget.ImageView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
@ -15,12 +16,9 @@ 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.extensions.applyColorFilter
import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor
import com.simplemobiletools.commons.extensions.getContrastColor
import com.simplemobiletools.commons.extensions.getContactLetterIcon
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.extensions.config
import com.simplemobiletools.contacts.pro.extensions.sendEmailIntent
import com.simplemobiletools.contacts.pro.extensions.sendSMSIntent
import com.simplemobiletools.contacts.pro.extensions.shareContacts
@ -33,13 +31,7 @@ abstract class ContactActivity : SimpleActivity() {
protected var currentContactPhotoPath = ""
fun showPhotoPlaceholder(photoView: ImageView) {
val background = resources.getDrawable(R.drawable.contact_circular_background)
background.applyColorFilter(config.primaryColor)
photoView.background = background
val placeholder = resources.getColoredDrawableWithColor(R.drawable.ic_person_vector, config.primaryColor.getContrastColor())
val padding = resources.getDimension(R.dimen.activity_margin).toInt()
photoView.setPadding(padding, padding, padding, padding)
val placeholder = BitmapDrawable(resources, getContactLetterIcon(contact?.getNameToDisplay() ?: "S"))
photoView.setImageDrawable(placeholder)
currentContactPhotoPath = ""
contact?.photo = null
@ -48,30 +40,29 @@ abstract class ContactActivity : SimpleActivity() {
fun updateContactPhoto(path: String, photoView: ImageView, bitmap: Bitmap? = null) {
currentContactPhotoPath = path
val options = RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.centerCrop()
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.centerCrop()
if (isDestroyed || isFinishing) {
return
}
Glide.with(this)
.load(bitmap ?: path)
.transition(DrawableTransitionOptions.withCrossFade())
.apply(options)
.apply(RequestOptions.circleCropTransform())
.listener(object : RequestListener<Drawable> {
override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
photoView.setPadding(0, 0, 0, 0)
photoView.background = ColorDrawable(0)
return false
}
.load(bitmap ?: path)
.transition(DrawableTransitionOptions.withCrossFade())
.apply(options)
.apply(RequestOptions.circleCropTransform())
.listener(object : RequestListener<Drawable> {
override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
photoView.background = ColorDrawable(0)
return false
}
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
showPhotoPlaceholder(photoView)
return true
}
}).into(photoView)
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
showPhotoPlaceholder(photoView)
return true
}
}).into(photoView)
}
fun deleteContact() {
@ -121,67 +112,67 @@ abstract class ContactActivity : SimpleActivity() {
}
fun getPhoneNumberTypeText(type: Int, label: String): String {
return if (type == ContactsContract.CommonDataKinds.BaseTypes.TYPE_CUSTOM) {
return if (type == BaseTypes.TYPE_CUSTOM) {
label
} else {
getString(when (type) {
ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE -> R.string.mobile
ContactsContract.CommonDataKinds.Phone.TYPE_HOME -> R.string.home
ContactsContract.CommonDataKinds.Phone.TYPE_WORK -> R.string.work
ContactsContract.CommonDataKinds.Phone.TYPE_MAIN -> R.string.main_number
ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK -> R.string.work_fax
ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME -> R.string.home_fax
ContactsContract.CommonDataKinds.Phone.TYPE_PAGER -> R.string.pager
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 == ContactsContract.CommonDataKinds.BaseTypes.TYPE_CUSTOM) {
return if (type == BaseTypes.TYPE_CUSTOM) {
label
} else {
getString(when (type) {
ContactsContract.CommonDataKinds.Email.TYPE_HOME -> R.string.home
ContactsContract.CommonDataKinds.Email.TYPE_WORK -> R.string.work
ContactsContract.CommonDataKinds.Email.TYPE_MOBILE -> R.string.mobile
Email.TYPE_HOME -> R.string.home
Email.TYPE_WORK -> R.string.work
Email.TYPE_MOBILE -> R.string.mobile
else -> R.string.other
})
}
}
fun getAddressTypeText(type: Int, label: String): String {
return if (type == ContactsContract.CommonDataKinds.BaseTypes.TYPE_CUSTOM) {
return if (type == BaseTypes.TYPE_CUSTOM) {
label
} else {
getString(when (type) {
ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME -> R.string.home
ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK -> R.string.work
StructuredPostal.TYPE_HOME -> R.string.home
StructuredPostal.TYPE_WORK -> R.string.work
else -> R.string.other
})
}
}
fun getIMTypeText(type: Int, label: String): String {
return if (type == ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM) {
return if (type == Im.PROTOCOL_CUSTOM) {
label
} else {
getString(when (type) {
ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM -> R.string.aim
ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN -> R.string.windows_live
ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO -> R.string.yahoo
ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE -> R.string.skype
ContactsContract.CommonDataKinds.Im.PROTOCOL_QQ -> R.string.qq
ContactsContract.CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK -> R.string.hangouts
ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ -> R.string.icq
Im.PROTOCOL_AIM -> R.string.aim
Im.PROTOCOL_MSN -> R.string.windows_live
Im.PROTOCOL_YAHOO -> R.string.yahoo
Im.PROTOCOL_SKYPE -> R.string.skype
Im.PROTOCOL_QQ -> R.string.qq
Im.PROTOCOL_GOOGLE_TALK -> R.string.hangouts
Im.PROTOCOL_ICQ -> R.string.icq
else -> R.string.jabber
})
}
}
fun getEventTextId(type: Int) = when (type) {
ContactsContract.CommonDataKinds.Event.TYPE_ANNIVERSARY -> R.string.anniversary
ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY -> R.string.birthday
Event.TYPE_ANNIVERSARY -> R.string.anniversary
Event.TYPE_BIRTHDAY -> R.string.birthday
else -> R.string.other
}
}

View File

@ -9,12 +9,12 @@ import android.os.Bundle
import android.telecom.PhoneAccount
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.isDefaultDialer
import com.simplemobiletools.contacts.pro.extensions.telecomManager
import com.simplemobiletools.contacts.pro.helpers.REQUEST_CODE_SET_DEFAULT_DIALER
@TargetApi(Build.VERSION_CODES.M)
class DialerActivity : SimpleActivity() {

View File

@ -14,21 +14,22 @@ import android.view.Menu
import android.view.MenuItem
import android.view.View
import com.simplemobiletools.commons.extensions.*
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.callContact
import com.simplemobiletools.contacts.pro.extensions.config
import com.simplemobiletools.contacts.pro.extensions.isDefaultDialer
import com.simplemobiletools.contacts.pro.extensions.startCallIntent
import com.simplemobiletools.contacts.pro.helpers.ContactsHelper
import com.simplemobiletools.contacts.pro.helpers.KEY_PHONE
import com.simplemobiletools.contacts.pro.helpers.LOCATION_DIALPAD
import com.simplemobiletools.contacts.pro.helpers.REQUEST_CODE_SET_DEFAULT_DIALER
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<Contact>()
@ -105,11 +106,14 @@ class DialpadActivity : SimpleActivity() {
return true
}
private fun checkDialIntent() {
if (intent.action == Intent.ACTION_DIAL && intent.data != null && intent.dataString?.contains("tel:") == 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
}
}
@ -164,7 +168,9 @@ class DialpadActivity : SimpleActivity() {
private fun gotContacts(newContacts: ArrayList<Contact>) {
contacts = newContacts
checkDialIntent()
if (!checkDialIntent() && dialpad_input.value.isEmpty()) {
dialpadValueChanged("")
}
}
@TargetApi(Build.VERSION_CODES.O)
@ -174,7 +180,7 @@ class DialpadActivity : SimpleActivity() {
val secretCode = text.substring(4, text.length - 4)
if (isOreoPlus()) {
if (isDefaultDialer()) {
getSystemService(TelephonyManager::class.java).sendDialerSpecialCode(secretCode)
getSystemService(TelephonyManager::class.java)?.sendDialerSpecialCode(secretCode)
} else {
launchSetDefaultDialerIntent()
}

View File

@ -9,6 +9,7 @@ import android.graphics.Bitmap
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
@ -29,6 +30,9 @@ import com.simplemobiletools.contacts.pro.dialogs.SelectGroupsDialog
import com.simplemobiletools.contacts.pro.extensions.*
import com.simplemobiletools.contacts.pro.helpers.*
import com.simplemobiletools.contacts.pro.models.*
import com.simplemobiletools.contacts.pro.models.Email
import com.simplemobiletools.contacts.pro.models.Event
import com.simplemobiletools.contacts.pro.models.Organization
import kotlinx.android.synthetic.main.activity_edit_contact.*
import kotlinx.android.synthetic.main.item_edit_address.view.*
import kotlinx.android.synthetic.main.item_edit_email.view.*
@ -209,10 +213,6 @@ class EditContactActivity : ContactActivity() {
contact_start_call.beVisibleIf(contact!!.phoneNumbers.isNotEmpty())
contact_send_email.beVisibleIf(contact!!.emails.isNotEmpty())
val background = resources.getDrawable(R.drawable.contact_circular_background)
background.applyColorFilter(config.primaryColor)
contact_photo.background = background
if (contact!!.photoUri.isEmpty() && contact!!.photo == null) {
showPhotoPlaceholder(contact_photo)
} else {
@ -220,36 +220,22 @@ class EditContactActivity : ContactActivity() {
}
val textColor = config.textColor
contact_send_sms.applyColorFilter(textColor)
contact_start_call.applyColorFilter(textColor)
contact_send_email.applyColorFilter(textColor)
contact_name_image.applyColorFilter(textColor)
contact_numbers_image.applyColorFilter(textColor)
contact_emails_image.applyColorFilter(textColor)
contact_addresses_image.applyColorFilter(textColor)
contact_ims_image.applyColorFilter(textColor)
contact_events_image.applyColorFilter(textColor)
contact_notes_image.applyColorFilter(textColor)
contact_organization_image.applyColorFilter(textColor)
contact_websites_image.applyColorFilter(textColor)
contact_groups_image.applyColorFilter(textColor)
contact_source_image.applyColorFilter(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 {
it.applyColorFilter(textColor)
}
val adjustedPrimaryColor = getAdjustedPrimaryColor()
contact_numbers_add_new.applyColorFilter(adjustedPrimaryColor)
contact_numbers_add_new.background.applyColorFilter(textColor)
contact_emails_add_new.applyColorFilter(adjustedPrimaryColor)
contact_emails_add_new.background.applyColorFilter(textColor)
contact_addresses_add_new.applyColorFilter(adjustedPrimaryColor)
contact_addresses_add_new.background.applyColorFilter(textColor)
contact_ims_add_new.applyColorFilter(adjustedPrimaryColor)
contact_ims_add_new.background.applyColorFilter(textColor)
contact_events_add_new.applyColorFilter(adjustedPrimaryColor)
contact_events_add_new.background.applyColorFilter(textColor)
contact_websites_add_new.applyColorFilter(adjustedPrimaryColor)
contact_websites_add_new.background.applyColorFilter(textColor)
contact_groups_add_new.applyColorFilter(adjustedPrimaryColor)
contact_groups_add_new.background.applyColorFilter(textColor)
arrayOf(contact_numbers_add_new, contact_emails_add_new, contact_addresses_add_new, contact_ims_add_new, contact_events_add_new,
contact_websites_add_new, contact_groups_add_new).forEach {
it.applyColorFilter(adjustedPrimaryColor)
}
arrayOf(contact_numbers_add_new.background, contact_emails_add_new.background, contact_addresses_add_new.background, contact_ims_add_new.background,
contact_events_add_new.background, contact_websites_add_new.background, contact_groups_add_new.background).forEach {
it.applyColorFilter(textColor)
}
contact_toggle_favorite.setOnClickListener { toggleFavorite() }
contact_photo.setOnClickListener { trySetPhoto() }
@ -315,8 +301,8 @@ class EditContactActivity : ContactActivity() {
Intent("com.android.camera.action.CROP").apply {
setDataAndType(imageUri, "image/*")
putExtra(MediaStore.EXTRA_OUTPUT, lastPhotoIntentUri)
putExtra("outputX", 720)
putExtra("outputY", 720)
putExtra("outputX", 512)
putExtra("outputY", 512)
putExtra("aspectX", 1)
putExtra("aspectY", 1)
putExtra("crop", "true")
@ -601,6 +587,18 @@ class EditContactActivity : ContactActivity() {
getPublicContactSource(contact!!.source) {
contact_source.text = it
}
// if the last used contact source is not available anymore, use the first available one. Could happen at ejecting SIM card
ContactsHelper(this).getSaveableContactSources { sources ->
val sourceNames = sources.map { it.name }
if (!sourceNames.contains(originalContactSource)) {
originalContactSource = sourceNames.first()
contact?.source = originalContactSource
getPublicContactSource(contact!!.source) {
contact_source.text = it
}
}
}
}
private fun setupTypePickers() {
@ -743,20 +741,20 @@ class EditContactActivity : ContactActivity() {
private fun showNumberTypePicker(numberTypeField: TextView) {
val items = arrayListOf(
RadioItem(CommonDataKinds.Phone.TYPE_MOBILE, getString(R.string.mobile)),
RadioItem(CommonDataKinds.Phone.TYPE_HOME, getString(R.string.home)),
RadioItem(CommonDataKinds.Phone.TYPE_WORK, getString(R.string.work)),
RadioItem(CommonDataKinds.Phone.TYPE_MAIN, getString(R.string.main_number)),
RadioItem(CommonDataKinds.Phone.TYPE_FAX_WORK, getString(R.string.work_fax)),
RadioItem(CommonDataKinds.Phone.TYPE_FAX_HOME, getString(R.string.home_fax)),
RadioItem(CommonDataKinds.Phone.TYPE_PAGER, getString(R.string.pager)),
RadioItem(CommonDataKinds.Phone.TYPE_OTHER, getString(R.string.other)),
RadioItem(CommonDataKinds.Phone.TYPE_CUSTOM, getString(R.string.custom))
RadioItem(Phone.TYPE_MOBILE, getString(R.string.mobile)),
RadioItem(Phone.TYPE_HOME, getString(R.string.home)),
RadioItem(Phone.TYPE_WORK, getString(R.string.work)),
RadioItem(Phone.TYPE_MAIN, getString(R.string.main_number)),
RadioItem(Phone.TYPE_FAX_WORK, getString(R.string.work_fax)),
RadioItem(Phone.TYPE_FAX_HOME, getString(R.string.home_fax)),
RadioItem(Phone.TYPE_PAGER, getString(R.string.pager)),
RadioItem(Phone.TYPE_OTHER, getString(R.string.other)),
RadioItem(Phone.TYPE_CUSTOM, getString(R.string.custom))
)
val currentNumberTypeId = getPhoneNumberTypeId(numberTypeField.value)
RadioGroupDialog(this, items, currentNumberTypeId) {
if (it as Int == CommonDataKinds.Phone.TYPE_CUSTOM) {
if (it as Int == Phone.TYPE_CUSTOM) {
CustomLabelDialog(this) {
numberTypeField.text = it
}
@ -768,11 +766,11 @@ class EditContactActivity : ContactActivity() {
private fun showEmailTypePicker(emailTypeField: TextView) {
val items = arrayListOf(
RadioItem(CommonDataKinds.Email.TYPE_HOME, getString(R.string.home)),
RadioItem(CommonDataKinds.Email.TYPE_WORK, getString(R.string.work)),
RadioItem(CommonDataKinds.Email.TYPE_MOBILE, getString(R.string.mobile)),
RadioItem(CommonDataKinds.Email.TYPE_OTHER, getString(R.string.other)),
RadioItem(CommonDataKinds.Email.TYPE_CUSTOM, getString(R.string.custom))
RadioItem(CommonDataKinds.Email.TYPE_HOME, getString(R.string.home)),
RadioItem(CommonDataKinds.Email.TYPE_WORK, getString(R.string.work)),
RadioItem(CommonDataKinds.Email.TYPE_MOBILE, getString(R.string.mobile)),
RadioItem(CommonDataKinds.Email.TYPE_OTHER, getString(R.string.other)),
RadioItem(CommonDataKinds.Email.TYPE_CUSTOM, getString(R.string.custom))
)
val currentEmailTypeId = getEmailTypeId(emailTypeField.value)
@ -789,15 +787,15 @@ class EditContactActivity : ContactActivity() {
private fun showAddressTypePicker(addressTypeField: TextView) {
val items = arrayListOf(
RadioItem(CommonDataKinds.StructuredPostal.TYPE_HOME, getString(R.string.home)),
RadioItem(CommonDataKinds.StructuredPostal.TYPE_WORK, getString(R.string.work)),
RadioItem(CommonDataKinds.StructuredPostal.TYPE_OTHER, getString(R.string.other)),
RadioItem(CommonDataKinds.StructuredPostal.TYPE_CUSTOM, getString(R.string.custom))
RadioItem(StructuredPostal.TYPE_HOME, getString(R.string.home)),
RadioItem(StructuredPostal.TYPE_WORK, getString(R.string.work)),
RadioItem(StructuredPostal.TYPE_OTHER, getString(R.string.other)),
RadioItem(StructuredPostal.TYPE_CUSTOM, getString(R.string.custom))
)
val currentAddressTypeId = getAddressTypeId(addressTypeField.value)
RadioGroupDialog(this, items, currentAddressTypeId) {
if (it as Int == CommonDataKinds.StructuredPostal.TYPE_CUSTOM) {
if (it as Int == StructuredPostal.TYPE_CUSTOM) {
CustomLabelDialog(this) {
addressTypeField.text = it
}
@ -809,20 +807,20 @@ class EditContactActivity : ContactActivity() {
private fun showIMTypePicker(imTypeField: TextView) {
val items = arrayListOf(
RadioItem(CommonDataKinds.Im.PROTOCOL_AIM, getString(R.string.aim)),
RadioItem(CommonDataKinds.Im.PROTOCOL_MSN, getString(R.string.windows_live)),
RadioItem(CommonDataKinds.Im.PROTOCOL_YAHOO, getString(R.string.yahoo)),
RadioItem(CommonDataKinds.Im.PROTOCOL_SKYPE, getString(R.string.skype)),
RadioItem(CommonDataKinds.Im.PROTOCOL_QQ, getString(R.string.qq)),
RadioItem(CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK, getString(R.string.hangouts)),
RadioItem(CommonDataKinds.Im.PROTOCOL_ICQ, getString(R.string.icq)),
RadioItem(CommonDataKinds.Im.PROTOCOL_JABBER, getString(R.string.jabber)),
RadioItem(CommonDataKinds.Im.PROTOCOL_CUSTOM, getString(R.string.custom))
RadioItem(Im.PROTOCOL_AIM, getString(R.string.aim)),
RadioItem(Im.PROTOCOL_MSN, getString(R.string.windows_live)),
RadioItem(Im.PROTOCOL_YAHOO, getString(R.string.yahoo)),
RadioItem(Im.PROTOCOL_SKYPE, getString(R.string.skype)),
RadioItem(Im.PROTOCOL_QQ, getString(R.string.qq)),
RadioItem(Im.PROTOCOL_GOOGLE_TALK, getString(R.string.hangouts)),
RadioItem(Im.PROTOCOL_ICQ, getString(R.string.icq)),
RadioItem(Im.PROTOCOL_JABBER, getString(R.string.jabber)),
RadioItem(Im.PROTOCOL_CUSTOM, getString(R.string.custom))
)
val currentIMTypeId = getIMTypeId(imTypeField.value)
RadioGroupDialog(this, items, currentIMTypeId) {
if (it as Int == CommonDataKinds.Im.PROTOCOL_CUSTOM) {
if (it as Int == Im.PROTOCOL_CUSTOM) {
CustomLabelDialog(this) {
imTypeField.text = it
}
@ -834,9 +832,9 @@ class EditContactActivity : ContactActivity() {
private fun showEventTypePicker(eventTypeField: TextView) {
val items = arrayListOf(
RadioItem(CommonDataKinds.Event.TYPE_ANNIVERSARY, getString(R.string.anniversary)),
RadioItem(CommonDataKinds.Event.TYPE_BIRTHDAY, getString(R.string.birthday)),
RadioItem(CommonDataKinds.Event.TYPE_OTHER, getString(R.string.other))
RadioItem(CommonDataKinds.Event.TYPE_ANNIVERSARY, getString(R.string.anniversary)),
RadioItem(CommonDataKinds.Event.TYPE_BIRTHDAY, getString(R.string.birthday)),
RadioItem(CommonDataKinds.Event.TYPE_OTHER, getString(R.string.other))
)
val currentEventTypeId = getEventTypeId(eventTypeField.value)
@ -910,7 +908,7 @@ class EditContactActivity : ContactActivity() {
val numberHolder = contact_numbers_holder.getChildAt(i)
val number = numberHolder.contact_number.value
val numberType = getPhoneNumberTypeId(numberHolder.contact_number_type.value)
val numberLabel = if (numberType == CommonDataKinds.Phone.TYPE_CUSTOM) numberHolder.contact_number_type.value else ""
val numberLabel = if (numberType == Phone.TYPE_CUSTOM) numberHolder.contact_number_type.value else ""
if (number.isNotEmpty()) {
phoneNumbers.add(PhoneNumber(number, numberType, numberLabel, number.normalizeNumber()))
@ -942,7 +940,7 @@ class EditContactActivity : ContactActivity() {
val addressHolder = contact_addresses_holder.getChildAt(i)
val address = addressHolder.contact_address.value
val addressType = getAddressTypeId(addressHolder.contact_address_type.value)
val addressLabel = if (addressType == CommonDataKinds.StructuredPostal.TYPE_CUSTOM) addressHolder.contact_address_type.value else ""
val addressLabel = if (addressType == StructuredPostal.TYPE_CUSTOM) addressHolder.contact_address_type.value else ""
if (address.isNotEmpty()) {
addresses.add(Address(address, addressType, addressLabel))
@ -958,7 +956,7 @@ class EditContactActivity : ContactActivity() {
val IMsHolder = contact_ims_holder.getChildAt(i)
val IM = IMsHolder.contact_im.value
val IMType = getIMTypeId(IMsHolder.contact_im_type.value)
val IMLabel = if (IMType == CommonDataKinds.Im.PROTOCOL_CUSTOM) IMsHolder.contact_im_type.value else ""
val IMLabel = if (IMType == Im.PROTOCOL_CUSTOM) IMsHolder.contact_im_type.value else ""
if (IM.isNotEmpty()) {
IMs.add(IM(IM, IMType, IMLabel))
@ -1116,8 +1114,8 @@ class EditContactActivity : ContactActivity() {
private fun trySetPhoto() {
val items = arrayListOf(
RadioItem(TAKE_PHOTO, getString(R.string.take_photo)),
RadioItem(CHOOSE_PHOTO, getString(R.string.choose_photo))
RadioItem(TAKE_PHOTO, getString(R.string.take_photo)),
RadioItem(CHOOSE_PHOTO, getString(R.string.choose_photo))
)
if (currentContactPhotoPath.isNotEmpty() || contact!!.photo != null) {
@ -1135,13 +1133,13 @@ class EditContactActivity : ContactActivity() {
private fun parseIntentData(data: ArrayList<ContentValues>) {
data.forEach {
when (it.get(CommonDataKinds.StructuredName.MIMETYPE)) {
when (it.get(StructuredName.MIMETYPE)) {
CommonDataKinds.Email.CONTENT_ITEM_TYPE -> parseEmail(it)
CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE -> parseAddress(it)
StructuredPostal.CONTENT_ITEM_TYPE -> parseAddress(it)
CommonDataKinds.Organization.CONTENT_ITEM_TYPE -> parseOrganization(it)
CommonDataKinds.Event.CONTENT_ITEM_TYPE -> parseEvent(it)
CommonDataKinds.Website.CONTENT_ITEM_TYPE -> parseWebsite(it)
CommonDataKinds.Note.CONTENT_ITEM_TYPE -> parseNote(it)
Website.CONTENT_ITEM_TYPE -> parseWebsite(it)
Note.CONTENT_ITEM_TYPE -> parseNote(it)
}
}
}
@ -1154,9 +1152,9 @@ class EditContactActivity : ContactActivity() {
}
private fun parseAddress(contentValues: ContentValues) {
val type = contentValues.getAsInteger(CommonDataKinds.StructuredPostal.DATA2) ?: DEFAULT_ADDRESS_TYPE
val addressValue = contentValues.getAsString(CommonDataKinds.StructuredPostal.DATA4)
?: contentValues.getAsString(CommonDataKinds.StructuredPostal.DATA1) ?: return
val type = contentValues.getAsInteger(StructuredPostal.DATA2) ?: DEFAULT_ADDRESS_TYPE
val addressValue = contentValues.getAsString(StructuredPostal.DATA4)
?: contentValues.getAsString(StructuredPostal.DATA1) ?: return
val address = Address(addressValue, type, "")
contact!!.addresses.add(address)
}
@ -1175,12 +1173,12 @@ class EditContactActivity : ContactActivity() {
}
private fun parseWebsite(contentValues: ContentValues) {
val website = contentValues.getAsString(CommonDataKinds.Website.DATA1) ?: return
val website = contentValues.getAsString(Website.DATA1) ?: return
contact!!.websites.add(website)
}
private fun parseNote(contentValues: ContentValues) {
val note = contentValues.getAsString(CommonDataKinds.Note.DATA1) ?: return
val note = contentValues.getAsString(Note.DATA1) ?: return
contact!!.notes = note
}
@ -1214,15 +1212,15 @@ class EditContactActivity : ContactActivity() {
}
private fun getPhoneNumberTypeId(value: String) = when (value) {
getString(R.string.mobile) -> CommonDataKinds.Phone.TYPE_MOBILE
getString(R.string.home) -> CommonDataKinds.Phone.TYPE_HOME
getString(R.string.work) -> CommonDataKinds.Phone.TYPE_WORK
getString(R.string.main_number) -> CommonDataKinds.Phone.TYPE_MAIN
getString(R.string.work_fax) -> CommonDataKinds.Phone.TYPE_FAX_WORK
getString(R.string.home_fax) -> CommonDataKinds.Phone.TYPE_FAX_HOME
getString(R.string.pager) -> CommonDataKinds.Phone.TYPE_PAGER
getString(R.string.other) -> CommonDataKinds.Phone.TYPE_OTHER
else -> CommonDataKinds.Phone.TYPE_CUSTOM
getString(R.string.mobile) -> Phone.TYPE_MOBILE
getString(R.string.home) -> Phone.TYPE_HOME
getString(R.string.work) -> Phone.TYPE_WORK
getString(R.string.main_number) -> Phone.TYPE_MAIN
getString(R.string.work_fax) -> Phone.TYPE_FAX_WORK
getString(R.string.home_fax) -> Phone.TYPE_FAX_HOME
getString(R.string.pager) -> Phone.TYPE_PAGER
getString(R.string.other) -> Phone.TYPE_OTHER
else -> Phone.TYPE_CUSTOM
}
private fun getEmailTypeId(value: String) = when (value) {
@ -1240,21 +1238,21 @@ class EditContactActivity : ContactActivity() {
}
private fun getAddressTypeId(value: String) = when (value) {
getString(R.string.home) -> CommonDataKinds.StructuredPostal.TYPE_HOME
getString(R.string.work) -> CommonDataKinds.StructuredPostal.TYPE_WORK
getString(R.string.other) -> CommonDataKinds.StructuredPostal.TYPE_OTHER
else -> CommonDataKinds.StructuredPostal.TYPE_CUSTOM
getString(R.string.home) -> StructuredPostal.TYPE_HOME
getString(R.string.work) -> StructuredPostal.TYPE_WORK
getString(R.string.other) -> StructuredPostal.TYPE_OTHER
else -> StructuredPostal.TYPE_CUSTOM
}
private fun getIMTypeId(value: String) = when (value) {
getString(R.string.aim) -> CommonDataKinds.Im.PROTOCOL_AIM
getString(R.string.windows_live) -> CommonDataKinds.Im.PROTOCOL_MSN
getString(R.string.yahoo) -> CommonDataKinds.Im.PROTOCOL_YAHOO
getString(R.string.skype) -> CommonDataKinds.Im.PROTOCOL_SKYPE
getString(R.string.qq) -> CommonDataKinds.Im.PROTOCOL_QQ
getString(R.string.hangouts) -> CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK
getString(R.string.icq) -> CommonDataKinds.Im.PROTOCOL_ICQ
getString(R.string.jabber) -> CommonDataKinds.Im.PROTOCOL_JABBER
else -> CommonDataKinds.Im.PROTOCOL_CUSTOM
getString(R.string.aim) -> Im.PROTOCOL_AIM
getString(R.string.windows_live) -> Im.PROTOCOL_MSN
getString(R.string.yahoo) -> Im.PROTOCOL_YAHOO
getString(R.string.skype) -> Im.PROTOCOL_SKYPE
getString(R.string.qq) -> Im.PROTOCOL_QQ
getString(R.string.hangouts) -> Im.PROTOCOL_GOOGLE_TALK
getString(R.string.icq) -> Im.PROTOCOL_ICQ
getString(R.string.jabber) -> Im.PROTOCOL_JABBER
else -> Im.PROTOCOL_CUSTOM
}
}

View File

@ -38,8 +38,8 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener {
private var searchMenuItem: MenuItem? = null
private val contactsFavoritesList = arrayListOf(
CONTACTS_TAB_MASK,
FAVORITES_TAB_MASK
CONTACTS_TAB_MASK,
FAVORITES_TAB_MASK
)
override fun onCreate(savedInstanceState: Bundle?) {
@ -116,17 +116,17 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener {
}
insert_or_edit_tabs_holder.onTabSelectionChanged(
tabUnselectedAction = {
it.icon?.applyColorFilter(config.textColor)
},
tabSelectedAction = {
if (isSearchOpen) {
getCurrentFragment()?.onSearchQueryChanged("")
searchMenuItem?.collapseActionView()
}
viewpager.currentItem = it.position
it.icon?.applyColorFilter(getAdjustedPrimaryColor())
tabUnselectedAction = {
it.icon?.applyColorFilter(config.textColor)
},
tabSelectedAction = {
if (isSearchOpen) {
getCurrentFragment()?.onSearchQueryChanged("")
searchMenuItem?.collapseActionView()
}
viewpager.currentItem = it.position
it.icon?.applyColorFilter(getAdjustedPrimaryColor())
}
)
insert_or_edit_tabs_holder.removeAllTabs()
@ -143,7 +143,7 @@ class InsertOrEditContactActivity : SimpleActivity(), RefreshContactsListener {
insert_or_edit_tabs_holder.beVisibleIf(skippedTabs == 0)
select_contact_label?.setTextColor(getAdjustedPrimaryColor())
new_contact_tmb?.setImageDrawable(resources.getColoredDrawableWithColor(R.drawable.ic_new_contact_vector, config.textColor))
new_contact_tmb?.setImageDrawable(resources.getColoredDrawableWithColor(R.drawable.ic_add_person_vector, config.textColor))
new_contact_holder?.setOnClickListener {
createNewContact()
}

View File

@ -1,12 +1,12 @@
package com.simplemobiletools.contacts.pro.activities
import android.annotation.SuppressLint
import android.app.Activity
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.Color
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Icon
import android.graphics.drawable.LayerDrawable
@ -43,14 +43,19 @@ import kotlinx.android.synthetic.main.fragment_contacts.*
import kotlinx.android.synthetic.main.fragment_favorites.*
import kotlinx.android.synthetic.main.fragment_groups.*
import java.io.FileOutputStream
import java.io.OutputStream
import java.util.*
class MainActivity : SimpleActivity(), RefreshContactsListener {
private val PICK_IMPORT_SOURCE_INTENT = 1
private val PICK_EXPORT_FILE_INTENT = 2
private var isSearchOpen = false
private var searchMenuItem: MenuItem? = null
private var werePermissionsHandled = false
private var isFirstResume = true
private var isGettingContacts = false
private var ignoredExportContactSources = HashSet<String>()
private var handledShowTabs = 0
private var storedTextColor = 0
@ -157,7 +162,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
}
}
val dialpadIcon = resources.getColoredDrawableWithColor(R.drawable.ic_dialpad_vector, if (isBlackAndWhiteTheme()) Color.BLACK else config.primaryColor.getContrastColor())
val dialpadIcon = resources.getColoredDrawableWithColor(R.drawable.ic_dialpad_vector, getFABIconColor())
main_dialpad_button.apply {
setImageDrawable(dialpadIcon)
background.applyColorFilter(getAdjustedPrimaryColor())
@ -217,6 +222,16 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
return true
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
super.onActivityResult(requestCode, resultCode, resultData)
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)
}
}
private fun storeStateVariables() {
config.apply {
storedTextColor = textColor
@ -253,12 +268,14 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
override fun onMenuItemActionExpand(item: MenuItem?): Boolean {
getCurrentFragment()?.onSearchOpened()
isSearchOpen = true
main_dialpad_button.beGone()
return true
}
override fun onMenuItemActionCollapse(item: MenuItem?): Boolean {
getCurrentFragment()?.onSearchClosed()
isSearchOpen = false
main_dialpad_button.beVisibleIf(config.showDialpadButton)
return true
}
})
@ -298,11 +315,11 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
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()
.setShortLabel(newEvent)
.setLongLabel(newEvent)
.setIcon(Icon.createWithBitmap(bmp))
.setIntent(intent)
.build()
}
@SuppressLint("NewApi")
@ -315,11 +332,11 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
val intent = Intent(this, EditContactActivity::class.java)
intent.action = Intent.ACTION_VIEW
return ShortcutInfo.Builder(this, "create_new_contact")
.setShortLabel(newEvent)
.setLongLabel(newEvent)
.setIcon(Icon.createWithBitmap(bmp))
.setIntent(intent)
.build()
.setShortLabel(newEvent)
.setLongLabel(newEvent)
.setIcon(Icon.createWithBitmap(bmp))
.setIntent(intent)
.build()
}
private fun getCurrentFragment(): MyViewPagerFragment? {
@ -383,17 +400,17 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
}
main_tabs_holder.onTabSelectionChanged(
tabUnselectedAction = {
it.icon?.applyColorFilter(config.textColor)
},
tabSelectedAction = {
if (isSearchOpen) {
getCurrentFragment()?.onSearchQueryChanged("")
searchMenuItem?.collapseActionView()
}
viewpager.currentItem = it.position
it.icon?.applyColorFilter(getAdjustedPrimaryColor())
tabUnselectedAction = {
it.icon?.applyColorFilter(config.textColor)
},
tabSelectedAction = {
if (isSearchOpen) {
getCurrentFragment()?.onSearchQueryChanged("")
searchMenuItem?.collapseActionView()
}
viewpager.currentItem = it.position
it.icon?.applyColorFilter(getAdjustedPrimaryColor())
}
)
if (intent?.action == Intent.ACTION_VIEW && intent.data != null) {
@ -446,9 +463,17 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
}
private fun tryImportContacts() {
handlePermission(PERMISSION_READ_STORAGE) {
if (it) {
importContacts()
if (isQPlus()) {
Intent(Intent.ACTION_GET_CONTENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "text/x-vcard"
startActivityForResult(this, PICK_IMPORT_SOURCE_INTENT)
}
} else {
handlePermission(PERMISSION_READ_STORAGE) {
if (it) {
importContacts()
}
}
}
}
@ -493,28 +518,42 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
}
private fun tryExportContacts() {
handlePermission(PERMISSION_WRITE_STORAGE) {
if (it) {
exportContacts()
if (isQPlus()) {
ExportContactsDialog(this, config.lastExportPath, true) { file, ignoredContactSources ->
ignoredExportContactSources = ignoredContactSources
Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
type = "text/x-vcard"
putExtra(Intent.EXTRA_TITLE, file.name)
addCategory(Intent.CATEGORY_OPENABLE)
startActivityForResult(this, PICK_EXPORT_FILE_INTENT)
}
}
} else {
handlePermission(PERMISSION_WRITE_STORAGE) {
if (it) {
ExportContactsDialog(this, config.lastExportPath, false) { file, ignoredContactSources ->
getFileOutputStream(file.toFileDirItem(this), true) {
exportContactsTo(ignoredContactSources, it)
}
}
}
}
}
}
private fun exportContacts() {
FilePickerDialog(this, pickFile = false, showFAB = true) {
ExportContactsDialog(this, it) { file, ignoredContactSources ->
ContactsHelper(this).getContacts(true, ignoredContactSources) { contacts ->
if (contacts.isEmpty()) {
toast(R.string.no_entries_for_exporting)
} else {
VcfExporter().exportContacts(this, file, contacts, true) { result ->
toast(when (result) {
VcfExporter.ExportResult.EXPORT_OK -> R.string.exporting_successful
VcfExporter.ExportResult.EXPORT_PARTIAL -> R.string.exporting_some_entries_failed
else -> R.string.exporting_failed
})
}
}
private fun exportContactsTo(ignoredContactSources: HashSet<String>, outputStream: OutputStream?) {
ContactsHelper(this).getContacts(true, ignoredContactSources) { contacts ->
if (contacts.isEmpty()) {
toast(R.string.no_entries_for_exporting)
} else {
VcfExporter().exportContacts(this, outputStream, contacts, true) { result ->
toast(when (result) {
VcfExporter.ExportResult.EXPORT_OK -> R.string.exporting_successful
VcfExporter.ExportResult.EXPORT_PARTIAL -> R.string.exporting_some_entries_failed
else -> R.string.exporting_failed
})
}
}
}
@ -524,10 +563,10 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
val licenses = LICENSE_JODA or LICENSE_GLIDE or LICENSE_GSON or LICENSE_INDICATOR_FAST_SCROLL
val faqItems = arrayListOf(
FAQItem(R.string.faq_1_title, R.string.faq_1_text),
FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons),
FAQItem(R.string.faq_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_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)
)
startAboutActivity(R.string.app_name, licenses, BuildConfig.VERSION_NAME, faqItems, true)

View File

@ -1,95 +0,0 @@
package com.simplemobiletools.contacts.pro.activities
import android.content.Intent
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
import com.simplemobiletools.commons.extensions.underlineText
import com.simplemobiletools.commons.extensions.updateTextColors
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.adapters.ManageBlockedNumbersAdapter
import com.simplemobiletools.contacts.pro.dialogs.AddBlockedNumberDialog
import com.simplemobiletools.contacts.pro.extensions.getBlockedNumbers
import com.simplemobiletools.contacts.pro.extensions.isDefaultDialer
import com.simplemobiletools.contacts.pro.helpers.REQUEST_CODE_SET_DEFAULT_DIALER
import com.simplemobiletools.contacts.pro.models.BlockedNumber
import kotlinx.android.synthetic.main.activity_manage_blocked_numbers.*
class ManageBlockedNumbersActivity : SimpleActivity(), RefreshRecyclerViewListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_manage_blocked_numbers)
updateBlockedNumbers()
updateTextColors(manage_blocked_numbers_wrapper)
updatePlaceholderTexts()
manage_blocked_numbers_placeholder_2.apply {
underlineText()
setTextColor(getAdjustedPrimaryColor())
setOnClickListener {
if (isDefaultDialer()) {
addOrEditBlockedNumber()
} else {
launchSetDefaultDialerIntent()
}
}
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_add_blocked_number, menu)
updateMenuItemColors(menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.add_blocked_number -> addOrEditBlockedNumber()
else -> return super.onOptionsItemSelected(item)
}
return true
}
override fun refreshItems() {
updateBlockedNumbers()
}
private fun updatePlaceholderTexts() {
manage_blocked_numbers_placeholder.text = getString(if (isDefaultDialer()) R.string.not_blocking_anyone else R.string.must_make_default_dialer)
manage_blocked_numbers_placeholder_2.text = getString(if (isDefaultDialer()) R.string.add_a_blocked_number else R.string.set_as_default)
}
private fun updateBlockedNumbers() {
ensureBackgroundThread {
val blockedNumbers = getBlockedNumbers()
runOnUiThread {
ManageBlockedNumbersAdapter(this, blockedNumbers, this, manage_blocked_numbers_list) {
addOrEditBlockedNumber(it as BlockedNumber)
}.apply {
manage_blocked_numbers_list.adapter = this
}
manage_blocked_numbers_placeholder.beVisibleIf(blockedNumbers.isEmpty())
manage_blocked_numbers_placeholder_2.beVisibleIf(blockedNumbers.isEmpty())
}
}
}
private fun addOrEditBlockedNumber(currentNumber: BlockedNumber? = null) {
AddBlockedNumberDialog(this, currentNumber) {
updateBlockedNumbers()
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
super.onActivityResult(requestCode, resultCode, resultData)
if (requestCode == REQUEST_CODE_SET_DEFAULT_DIALER && isDefaultDialer()) {
updatePlaceholderTexts()
updateBlockedNumbers()
}
}
}

View File

@ -6,6 +6,8 @@ import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.provider.ContactsContract
import android.provider.ContactsContract.CommonDataKinds.Email
import android.provider.ContactsContract.CommonDataKinds.Phone
import android.view.Menu
import android.view.MenuItem
import androidx.appcompat.widget.SearchView
@ -46,8 +48,8 @@ class SelectContactActivity : SimpleActivity() {
handlePermission(PERMISSION_WRITE_CONTACTS) {
if (it) {
specialMimeType = when (intent.data) {
ContactsContract.CommonDataKinds.Email.CONTENT_URI -> ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE
ContactsContract.CommonDataKinds.Phone.CONTENT_URI -> ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
Email.CONTENT_URI -> Email.CONTENT_ITEM_TYPE
Phone.CONTENT_URI -> Phone.CONTENT_ITEM_TYPE
else -> null
}
initContacts()
@ -178,8 +180,8 @@ class SelectContactActivity : SimpleActivity() {
var contacts = it.filter {
if (specialMimeType != null) {
val hasRequiredValues = when (specialMimeType) {
ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE -> it.emails.isNotEmpty()
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE -> it.phoneNumbers.isNotEmpty()
Email.CONTENT_ITEM_TYPE -> it.emails.isNotEmpty()
Phone.CONTENT_ITEM_TYPE -> it.phoneNumbers.isNotEmpty()
else -> true
}
!it.isPrivate() && hasRequiredValues
@ -242,8 +244,8 @@ class SelectContactActivity : SimpleActivity() {
select_contact_placeholder_2.beVisibleIf(contacts.isEmpty())
select_contact_placeholder.beVisibleIf(contacts.isEmpty())
select_contact_placeholder.setText(when (specialMimeType) {
ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_emails
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_phone_numbers
Email.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_emails
Phone.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_phone_numbers
else -> R.string.no_contacts_found
})
}

View File

@ -5,6 +5,7 @@ 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.beVisibleIf
import com.simplemobiletools.commons.extensions.getFontSizeText
@ -91,10 +92,10 @@ class SettingsActivity : SimpleActivity() {
settings_font_size.text = getFontSizeText()
settings_font_size_holder.setOnClickListener {
val items = arrayListOf(
RadioItem(FONT_SIZE_SMALL, getString(R.string.small)),
RadioItem(FONT_SIZE_MEDIUM, getString(R.string.medium)),
RadioItem(FONT_SIZE_LARGE, getString(R.string.large)),
RadioItem(FONT_SIZE_EXTRA_LARGE, getString(R.string.extra_large)))
RadioItem(FONT_SIZE_SMALL, getString(R.string.small)),
RadioItem(FONT_SIZE_MEDIUM, getString(R.string.medium)),
RadioItem(FONT_SIZE_LARGE, getString(R.string.large)),
RadioItem(FONT_SIZE_EXTRA_LARGE, getString(R.string.extra_large)))
RadioGroupDialog(this@SettingsActivity, items, config.fontSize) {
config.fontSize = it as Int
@ -165,9 +166,9 @@ class SettingsActivity : SimpleActivity() {
settings_on_contact_click.text = getOnContactClickText()
settings_on_contact_click_holder.setOnClickListener {
val items = arrayListOf(
RadioItem(ON_CLICK_CALL_CONTACT, getString(R.string.call_contact)),
RadioItem(ON_CLICK_VIEW_CONTACT, getString(R.string.view_contact)),
RadioItem(ON_CLICK_EDIT_CONTACT, getString(R.string.edit_contact)))
RadioItem(ON_CLICK_CALL_CONTACT, getString(R.string.call_contact)),
RadioItem(ON_CLICK_VIEW_CONTACT, getString(R.string.view_contact)),
RadioItem(ON_CLICK_EDIT_CONTACT, getString(R.string.edit_contact)))
RadioGroupDialog(this@SettingsActivity, items, config.onContactClick) {
config.onContactClick = it as Int

View File

@ -1,40 +1,39 @@
package com.simplemobiletools.contacts.pro.activities
import android.annotation.TargetApi
import android.content.ContentValues
import android.content.Intent
import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Build
import android.telecom.TelecomManager
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.extensions.config
import com.simplemobiletools.contacts.pro.helpers.*
import com.simplemobiletools.contacts.pro.helpers.KEY_MAILTO
import com.simplemobiletools.contacts.pro.helpers.KEY_PHONE
import com.simplemobiletools.contacts.pro.helpers.LOCATION_CONTACTS_TAB
import com.simplemobiletools.contacts.pro.helpers.LOCATION_FAVORITES_TAB
open class SimpleActivity : BaseSimpleActivity() {
override fun getAppIconIDs() = arrayListOf(
R.mipmap.ic_launcher_red,
R.mipmap.ic_launcher_pink,
R.mipmap.ic_launcher_purple,
R.mipmap.ic_launcher_deep_purple,
R.mipmap.ic_launcher_indigo,
R.mipmap.ic_launcher_blue,
R.mipmap.ic_launcher_light_blue,
R.mipmap.ic_launcher_cyan,
R.mipmap.ic_launcher_teal,
R.mipmap.ic_launcher_green,
R.mipmap.ic_launcher_light_green,
R.mipmap.ic_launcher_lime,
R.mipmap.ic_launcher_yellow,
R.mipmap.ic_launcher_amber,
R.mipmap.ic_launcher,
R.mipmap.ic_launcher_deep_orange,
R.mipmap.ic_launcher_brown,
R.mipmap.ic_launcher_blue_grey,
R.mipmap.ic_launcher_grey_black
R.mipmap.ic_launcher_red,
R.mipmap.ic_launcher_pink,
R.mipmap.ic_launcher_purple,
R.mipmap.ic_launcher_deep_purple,
R.mipmap.ic_launcher_indigo,
R.mipmap.ic_launcher_blue,
R.mipmap.ic_launcher_light_blue,
R.mipmap.ic_launcher_cyan,
R.mipmap.ic_launcher_teal,
R.mipmap.ic_launcher_green,
R.mipmap.ic_launcher_light_green,
R.mipmap.ic_launcher_lime,
R.mipmap.ic_launcher_yellow,
R.mipmap.ic_launcher_amber,
R.mipmap.ic_launcher,
R.mipmap.ic_launcher_deep_orange,
R.mipmap.ic_launcher_brown,
R.mipmap.ic_launcher_blue_grey,
R.mipmap.ic_launcher_grey_black
)
override fun getAppLauncherName() = getString(R.string.app_launcher_name)
@ -64,22 +63,11 @@ open class SimpleActivity : BaseSimpleActivity() {
}
}
@TargetApi(Build.VERSION_CODES.M)
protected fun launchSetDefaultDialerIntent() {
Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER).putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName).apply {
if (resolveActivity(packageManager) != null) {
startActivityForResult(this, REQUEST_CODE_SET_DEFAULT_DIALER)
} else {
toast(R.string.no_app_found)
}
}
}
protected fun getTabIcon(position: Int): Drawable {
val drawableId = when (position) {
LOCATION_CONTACTS_TAB -> R.drawable.ic_person_vector
LOCATION_FAVORITES_TAB -> R.drawable.ic_star_on_vector
else -> R.drawable.ic_group_vector
else -> R.drawable.ic_people_vector
}
return resources.getColoredDrawableWithColor(drawableId, config.textColor)

View File

@ -9,6 +9,9 @@ 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.PERMISSION_READ_CONTACTS
@ -70,6 +73,14 @@ class ViewContactActivity : ContactActivity() {
}
}
override fun onBackPressed() {
if (contact_photo_big.alpha == 1f) {
hideBigContactPhoto()
} else {
super.onBackPressed()
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_view_contact, menu)
menu.apply {
@ -155,15 +166,18 @@ class ViewContactActivity : ContactActivity() {
contact_start_call.beVisibleIf(contact!!.phoneNumbers.isNotEmpty())
contact_send_email.beVisibleIf(contact!!.emails.isNotEmpty())
val background = resources.getDrawable(R.drawable.contact_circular_background)
background.applyColorFilter(config.primaryColor)
contact_photo.background = background
if (contact!!.photoUri.isEmpty() && contact!!.photo == null) {
showPhotoPlaceholder(contact_photo)
} else {
updateContactPhoto(contact!!.photoUri, contact_photo, contact!!.photo)
Glide.with(this).load(contact!!.photo ?: currentContactPhotoPath).into(contact_photo_big)
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()
@ -171,24 +185,16 @@ class ViewContactActivity : ContactActivity() {
}
contact_photo_big.setOnClickListener {
contact_photo_big.animate().alpha(0f).withEndAction { it.beGone() }.start()
hideBigContactPhoto()
}
}
val textColor = config.textColor
contact_send_sms.applyColorFilter(textColor)
contact_start_call.applyColorFilter(textColor)
contact_send_email.applyColorFilter(textColor)
contact_name_image.applyColorFilter(textColor)
contact_numbers_image.applyColorFilter(textColor)
contact_emails_image.applyColorFilter(textColor)
contact_addresses_image.applyColorFilter(textColor)
contact_events_image.applyColorFilter(textColor)
contact_source_image.applyColorFilter(textColor)
contact_notes_image.applyColorFilter(textColor)
contact_organization_image.applyColorFilter(textColor)
contact_websites_image.applyColorFilter(textColor)
contact_groups_image.applyColorFilter(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 {
it.applyColorFilter(textColor)
}
contact_send_sms.setOnClickListener { trySendSMS() }
contact_start_call.setOnClickListener { tryStartCall(contact!!) }
@ -288,7 +294,7 @@ class ViewContactActivity : ContactActivity() {
contact_nickname.copyOnLongClick(nickname)
if (contact_prefix.isGone() && contact_first_name.isGone() && contact_middle_name.isGone() && contact_surname.isGone() && contact_suffix.isGone()
&& contact_nickname.isGone()) {
&& contact_nickname.isGone()) {
contact_name_image.beInvisible()
(contact_photo.layoutParams as RelativeLayout.LayoutParams).bottomMargin = resources.getDimension(R.dimen.medium_margin).toInt()
}
@ -617,6 +623,10 @@ 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)

View File

@ -1,13 +1,12 @@
package com.simplemobiletools.contacts.pro.adapters
import android.graphics.drawable.Drawable
import android.graphics.drawable.BitmapDrawable
import android.util.TypedValue
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.signature.ObjectKey
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
@ -35,8 +34,6 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
private val NEW_GROUP_ID = -1
private lateinit var contactDrawable: Drawable
private lateinit var businessContactDrawable: Drawable
private var config = activity.config
private var textToHighlight = highlightText
@ -48,13 +45,8 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
private val itemLayout = if (showPhoneNumbers) R.layout.item_contact_with_number else R.layout.item_contact_without_number
private var smallPadding = activity.resources.getDimension(R.dimen.small_margin).toInt()
private var mediumPadding = activity.resources.getDimension(R.dimen.medium_margin).toInt()
private var bigPadding = activity.resources.getDimension(R.dimen.normal_margin).toInt()
init {
setupDragListener(true)
initDrawables()
}
override fun getActionMenuId() = R.menu.cab
@ -122,11 +114,6 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
private fun getItemWithKey(key: Int): Contact? = contactItems.firstOrNull { it.id == key }
fun initDrawables() {
contactDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_person_vector, textColor)
businessContactDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_business_vector, textColor)
}
fun updateItems(newItems: ArrayList<Contact>, highlightText: String = "") {
if (newItems.hashCode() != contactItems.hashCode()) {
contactItems = newItems.clone() as ArrayList<Contact>
@ -154,7 +141,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
resources.getQuantityString(R.plurals.delete_contacts, itemsCnt, itemsCnt)
}
val baseString = R.string.delete_contacts_confirmation
val baseString = R.string.deletion_confirmation
val question = String.format(resources.getString(baseString), items)
ConfirmationDialog(activity, question) {
@ -286,11 +273,6 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
contact_name.setTextColor(textColor)
contact_name.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
if (!showContactThumbnails && !showPhoneNumbers) {
contact_name.setPadding(bigPadding, bigPadding, bigPadding, bigPadding)
} else {
contact_name.setPadding(if (showContactThumbnails) smallPadding else bigPadding, smallPadding, smallPadding, 0)
}
if (contact_number != null) {
val phoneNumberToUse = if (textToHighlight.isEmpty()) {
@ -302,49 +284,33 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
val numberText = phoneNumberToUse?.value ?: ""
contact_number.text = if (textToHighlight.isEmpty()) numberText else numberText.highlightTextPart(textToHighlight, adjustedPrimaryColor, false, true)
contact_number.setTextColor(textColor)
contact_number.setPadding(if (showContactThumbnails) smallPadding else bigPadding, 0, smallPadding, 0)
contact_number.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
}
contact_tmb.beVisibleIf(showContactThumbnails)
if (showContactThumbnails) {
val placeholderImage = if (contact.isABusinessContact()) businessContactDrawable else contactDrawable
when {
contact.photoUri.isNotEmpty() -> {
val options = RequestOptions()
.signature(ObjectKey(contact.photoUri))
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.error(placeholderImage)
.centerCrop()
val placeholderImage = BitmapDrawable(resources, context.getContactLetterIcon(fullName))
if (contact.photoUri.isEmpty() && contact.photo == null) {
contact_tmb.setImageDrawable(placeholderImage)
} else {
val options = RequestOptions()
.signature(ObjectKey(contact.getSignatureKey()))
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.error(placeholderImage)
.centerCrop()
Glide.with(activity)
.load(contact.photoUri)
.transition(DrawableTransitionOptions.withCrossFade())
.apply(options)
.apply(RequestOptions.circleCropTransform())
.into(contact_tmb)
contact_tmb.setPadding(smallPadding, smallPadding, smallPadding, smallPadding)
val itemToLoad: Any? = if (contact.photoUri.isNotEmpty()) {
contact.photoUri
} else {
contact.photo
}
contact.photo != null -> {
val options = RequestOptions()
.signature(ObjectKey(contact.hashCode()))
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.error(placeholderImage)
.centerCrop()
Glide.with(activity)
.load(contact.photo)
.transition(DrawableTransitionOptions.withCrossFade())
.apply(options)
.apply(RequestOptions.circleCropTransform())
.into(contact_tmb)
contact_tmb.setPadding(smallPadding, smallPadding, smallPadding, smallPadding)
}
else -> {
contact_tmb.setPadding(mediumPadding, mediumPadding, mediumPadding, mediumPadding)
contact_tmb.setImageDrawable(placeholderImage)
}
Glide.with(activity)
.load(itemToLoad)
.apply(options)
.apply(RequestOptions.circleCropTransform())
.into(contact_tmb)
}
}
}

View File

@ -25,8 +25,6 @@ import java.util.*
class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList<Group>, val refreshListener: RefreshContactsListener?, recyclerView: MyRecyclerView,
fastScroller: FastScroller, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
private var smallPadding = activity.resources.getDimension(R.dimen.small_margin).toInt()
private var bigPadding = activity.resources.getDimension(R.dimen.normal_margin).toInt()
private var textToHighlight = ""
var adjustedPrimaryColor = activity.getAdjustedPrimaryColor()
@ -113,7 +111,7 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList<Group>, val
resources.getQuantityString(R.plurals.delete_groups, itemsCnt, itemsCnt)
}
val baseString = R.string.delete_contacts_confirmation
val baseString = R.string.deletion_confirmation
val question = String.format(resources.getString(baseString), items)
ConfirmationDialog(activity, question) {
@ -165,17 +163,11 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList<Group>, val
setTextColor(textColor)
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
text = groupTitle
if (showContactThumbnails) {
setPadding(smallPadding, bigPadding, bigPadding, bigPadding)
} else {
setPadding(bigPadding, bigPadding, bigPadding, bigPadding)
}
}
group_tmb.beVisibleIf(showContactThumbnails)
if (showContactThumbnails) {
group_tmb.applyColorFilter(textColor)
group_tmb.setImageDrawable(activity.getColoredGroupIcon(group.title))
}
}
}

View File

@ -1,87 +0,0 @@
package com.simplemobiletools.contacts.pro.adapters
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.extensions.config
import com.simplemobiletools.contacts.pro.extensions.deleteBlockedNumber
import com.simplemobiletools.contacts.pro.models.BlockedNumber
import kotlinx.android.synthetic.main.item_manage_blocked_number.view.*
import java.util.*
class ManageBlockedNumbersAdapter(activity: BaseSimpleActivity, var blockedNumbers: ArrayList<BlockedNumber>, val listener: RefreshRecyclerViewListener?,
recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
private val config = activity.config
init {
setupDragListener(true)
}
override fun getActionMenuId() = R.menu.cab_remove_only
override fun prepareActionMode(menu: Menu) {}
override fun actionItemPressed(id: Int) {
when (id) {
R.id.cab_remove -> removeSelection()
}
}
override fun getSelectableItemCount() = blockedNumbers.size
override fun getIsItemSelectable(position: Int) = true
override fun getItemSelectionKey(position: Int) = blockedNumbers.getOrNull(position)?.id?.toInt()
override fun getItemKeyPosition(key: Int) = blockedNumbers.indexOfFirst { it.id.toInt() == key }
override fun onActionModeCreated() {}
override fun onActionModeDestroyed() {}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_manage_blocked_number, parent)
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val blockedNumber = blockedNumbers[position]
holder.bindView(blockedNumber, true, true) { itemView, adapterPosition ->
setupView(itemView, blockedNumber)
}
bindViewHolder(holder)
}
override fun getItemCount() = blockedNumbers.size
private fun getSelectedItems() = blockedNumbers.filter { selectedKeys.contains(it.id.toInt()) } as ArrayList<BlockedNumber>
private fun setupView(view: View, blockedNumber: BlockedNumber) {
view.apply {
manage_blocked_number_holder?.isSelected = selectedKeys.contains(blockedNumber.id.toInt())
manage_blocked_number_title.apply {
text = blockedNumber.number
setTextColor(config.textColor)
}
}
}
private fun removeSelection() {
val removeBlockedNumbers = ArrayList<BlockedNumber>(selectedKeys.size)
val positions = getSelectedItemPositions()
getSelectedItems().forEach {
removeBlockedNumbers.add(it)
activity.deleteBlockedNumber(it.number)
}
blockedNumbers.removeAll(removeBlockedNumbers)
removeSelectedItems(positions)
if (blockedNumbers.isEmpty()) {
listener?.refreshItems()
}
}
}

View File

@ -1,5 +1,6 @@
package com.simplemobiletools.contacts.pro.adapters
import android.graphics.drawable.BitmapDrawable
import android.util.SparseArray
import android.util.TypedValue
import android.view.View
@ -7,7 +8,6 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.signature.ObjectKey
import com.simplemobiletools.commons.extensions.*
@ -27,20 +27,14 @@ class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayLis
private val itemViews = SparseArray<View>()
private val selectedPositions = HashSet<Int>()
private val config = activity.config
private val textColor = config.textColor
private val adjustedPrimaryColor = activity.getAdjustedPrimaryColor()
private val fontSize = activity.getTextSize()
private val contactDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_person_vector, textColor)
private val showContactThumbnails = config.showContactThumbnails
private val showPhoneNumbers = config.showPhoneNumbers
private val itemLayout = if (showPhoneNumbers) R.layout.item_add_favorite_with_number else R.layout.item_add_favorite_without_number
private var textToHighlight = ""
private var smallPadding = activity.resources.getDimension(R.dimen.small_margin).toInt()
private var mediumPadding = activity.resources.getDimension(R.dimen.medium_margin).toInt()
private var bigPadding = activity.resources.getDimension(R.dimen.normal_margin).toInt()
init {
contacts.forEachIndexed { index, contact ->
if (selectedContacts.asSequence().map { it.id }.contains(contact.id)) {
@ -121,11 +115,6 @@ class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayLis
contact_name.setTextColor(textColor)
contact_name.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
if (!showContactThumbnails && !showPhoneNumbers) {
contact_name.setPadding(bigPadding, bigPadding, bigPadding, bigPadding)
} else {
contact_name.setPadding(if (showContactThumbnails) smallPadding else bigPadding, smallPadding, smallPadding, 0)
}
if (contact_number != null) {
val phoneNumberToUse = if (textToHighlight.isEmpty()) {
@ -137,7 +126,6 @@ class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayLis
val numberText = phoneNumberToUse?.value ?: ""
contact_number.text = if (textToHighlight.isEmpty()) numberText else numberText.highlightTextPart(textToHighlight, adjustedPrimaryColor, false, true)
contact_number.setTextColor(textColor)
contact_number.setPadding(if (showContactThumbnails) smallPadding else bigPadding, 0, smallPadding, 0)
contact_number.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
}
@ -150,40 +138,36 @@ class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayLis
}
contact_tmb.beVisibleIf(showContactThumbnails)
if (showContactThumbnails) {
if (contact.photoUri.isNotEmpty()) {
val options = RequestOptions()
.signature(ObjectKey(contact.photoUri))
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.error(contactDrawable)
.centerCrop()
if (!activity.isDestroyed && !activity.isFinishing) {
Glide.with(activity)
.load(contact.photoUri)
.transition(DrawableTransitionOptions.withCrossFade())
.apply(options)
.apply(RequestOptions.circleCropTransform())
.into(contact_tmb)
contact_tmb.setPadding(smallPadding, smallPadding, smallPadding, smallPadding)
}
} else if (contact.photo != null) {
if (showContactThumbnails) {
val avatarName = when {
contact.isABusinessContact() -> contact.getFullCompany()
config.startNameWithSurname -> contact.surname
else -> contact.firstName
}
val placeholderImage = BitmapDrawable(resources, context.getContactLetterIcon(avatarName))
if (contact.photoUri.isEmpty() && contact.photo == null) {
contact_tmb.setImageDrawable(placeholderImage)
} else {
val options = RequestOptions()
.signature(ObjectKey(contact.hashCode()))
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.error(contactDrawable)
.centerCrop()
.signature(ObjectKey(contact.getSignatureKey()))
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.error(placeholderImage)
.centerCrop()
val itemToLoad: Any? = if (contact.photoUri.isNotEmpty()) {
contact.photoUri
} else {
contact.photo
}
Glide.with(activity)
.load(contact.photo)
.transition(DrawableTransitionOptions.withCrossFade())
.apply(options)
.apply(RequestOptions.circleCropTransform())
.into(contact_tmb)
contact_tmb.setPadding(smallPadding, smallPadding, smallPadding, smallPadding)
} else {
contact_tmb.setPadding(mediumPadding, mediumPadding, mediumPadding, mediumPadding)
contact_tmb.setImageDrawable(contactDrawable)
.load(itemToLoad)
.apply(options)
.apply(RequestOptions.circleCropTransform())
.into(contact_tmb)
}
}
}

View File

@ -5,6 +5,7 @@ import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import com.simplemobiletools.contacts.pro.helpers.Converters
import com.simplemobiletools.contacts.pro.helpers.FIRST_CONTACT_ID
@ -16,7 +17,7 @@ import com.simplemobiletools.contacts.pro.models.Group
import com.simplemobiletools.contacts.pro.models.LocalContact
import java.util.concurrent.Executors
@Database(entities = [LocalContact::class, Group::class], version = 1)
@Database(entities = [LocalContact::class, Group::class], version = 2)
@TypeConverters(Converters::class)
abstract class ContactsDatabase : RoomDatabase() {
@ -32,13 +33,14 @@ abstract class ContactsDatabase : RoomDatabase() {
synchronized(ContactsDatabase::class) {
if (db == null) {
db = Room.databaseBuilder(context.applicationContext, ContactsDatabase::class.java, "local_contacts.db")
.addCallback(object : Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
increaseAutoIncrementIds()
}
})
.build()
.addCallback(object : Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
increaseAutoIncrementIds()
}
})
.addMigrations(MIGRATION_1_2)
.build()
}
}
}
@ -67,5 +69,13 @@ abstract class ContactsDatabase : RoomDatabase() {
}
}
}
private val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.apply {
execSQL("ALTER TABLE contacts ADD COLUMN photo_uri TEXT NOT NULL DEFAULT ''")
}
}
}
}
}

View File

@ -1,44 +0,0 @@
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.extensions.showKeyboard
import com.simplemobiletools.commons.extensions.value
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.extensions.addBlockedNumber
import com.simplemobiletools.contacts.pro.extensions.deleteBlockedNumber
import com.simplemobiletools.contacts.pro.models.BlockedNumber
import kotlinx.android.synthetic.main.dialog_add_blocked_number.view.*
class AddBlockedNumberDialog(val activity: BaseSimpleActivity, val originalNumber: BlockedNumber? = null, val callback: () -> Unit) {
init {
val view = activity.layoutInflater.inflate(R.layout.dialog_add_blocked_number, null).apply {
if (originalNumber != null) {
add_blocked_number_edittext.setText(originalNumber.number)
}
}
AlertDialog.Builder(activity)
.setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null)
.create().apply {
activity.setupDialogStuff(view, this) {
showKeyboard(view.add_blocked_number_edittext)
getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
val newBlockedNumber = view.add_blocked_number_edittext.value
if (originalNumber != null && newBlockedNumber != originalNumber.number) {
activity.deleteBlockedNumber(originalNumber.number)
}
if (newBlockedNumber.isNotEmpty()) {
activity.addBlockedNumber(newBlockedNumber)
}
callback()
dismiss()
}
}
}
}
}

View File

@ -2,11 +2,13 @@ package com.simplemobiletools.contacts.pro.dialogs
import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.SimpleActivity
import com.simplemobiletools.contacts.pro.adapters.FilterContactSourcesAdapter
import com.simplemobiletools.contacts.pro.extensions.config
import com.simplemobiletools.contacts.pro.extensions.getVisibleContactSources
import com.simplemobiletools.contacts.pro.helpers.ContactsHelper
import com.simplemobiletools.contacts.pro.models.ContactSource
@ -14,15 +16,30 @@ import kotlinx.android.synthetic.main.dialog_export_contacts.view.*
import java.io.File
import java.util.*
class ExportContactsDialog(val activity: SimpleActivity, val path: String, private val callback: (file: File, ignoredContactSources: HashSet<String>) -> Unit) {
class ExportContactsDialog(val activity: SimpleActivity, val path: String, val hidePath: Boolean,
private val callback: (file: File, ignoredContactSources: HashSet<String>) -> Unit) {
private var contactSources = ArrayList<ContactSource>()
private var ignoreClicks = false
private var realPath = if (path.isEmpty()) activity.internalStoragePath else path
init {
val view = (activity.layoutInflater.inflate(R.layout.dialog_export_contacts, null) as ViewGroup).apply {
export_contacts_folder.text = activity.humanizePath(path)
export_contacts_folder.text = activity.humanizePath(realPath)
export_contacts_filename.setText("contacts_${activity.getCurrentFormattedDateTime()}")
if (hidePath) {
export_contacts_folder_label.beGone()
export_contacts_folder.beGone()
} else {
export_contacts_folder.setOnClickListener {
activity.hideKeyboard(export_contacts_filename)
FilePickerDialog(activity, realPath, false, showFAB = true) {
export_contacts_folder.text = activity.humanizePath(it)
realPath = it
}
}
}
ContactsHelper(activity).getContactSources {
it.mapTo(contactSources) { it.copy() }
activity.runOnUiThread {
@ -45,14 +62,15 @@ class ExportContactsDialog(val activity: SimpleActivity, val path: String, priva
when {
filename.isEmpty() -> activity.toast(R.string.empty_name)
filename.isAValidFilename() -> {
val file = File(path, "$filename.vcf")
if (file.exists()) {
val file = File(realPath, "$filename.vcf")
if (!hidePath && file.exists()) {
activity.toast(R.string.name_taken)
return@setOnClickListener
}
ignoreClicks = true
ensureBackgroundThread {
activity.config.lastExportPath = file.absolutePath.getParentPath()
val selectedSources = (view.export_contacts_list.adapter as FilterContactSourcesAdapter).getSelectedContactSources()
val ignoredSources = contactSources.filter { !selectedSources.contains(it) }.map { it.getFullIdentifier() }.toHashSet()
callback(file, ignoredSources)

View File

@ -4,9 +4,7 @@ import android.content.Intent
import android.net.Uri
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.sharePathIntent
import com.simplemobiletools.commons.extensions.showErrorToast
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.PERMISSION_CALL_PHONE
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.contacts.pro.BuildConfig
@ -57,20 +55,13 @@ fun SimpleActivity.startCall(contact: Contact) {
}
fun SimpleActivity.showContactSourcePicker(currentSource: String, callback: (newSource: String) -> Unit) {
ContactsHelper(this).getContactSources {
val ignoredTypes = arrayListOf(
SIGNAL_PACKAGE,
TELEGRAM_PACKAGE,
WHATSAPP_PACKAGE
)
ContactsHelper(this).getSaveableContactSources { sources ->
val items = ArrayList<RadioItem>()
val filteredSources = it.filter { !ignoredTypes.contains(it.type) }
var sources = filteredSources.map { it.name }
var currentSourceIndex = sources.indexOfFirst { it == currentSource }
sources = filteredSources.map { it.publicName }
var sourceNames = sources.map { it.name }
var currentSourceIndex = sourceNames.indexOfFirst { it == currentSource }
sourceNames = sources.map { it.publicName }
sources.forEachIndexed { index, account ->
sourceNames.forEachIndexed { index, account ->
items.add(RadioItem(index, account))
if (currentSource == SMT_PRIVATE && account == getString(R.string.phone_storage_hidden)) {
currentSourceIndex = index
@ -79,7 +70,7 @@ fun SimpleActivity.showContactSourcePicker(currentSource: String, callback: (new
runOnUiThread {
RadioGroupDialog(this, items, currentSourceIndex) {
callback(filteredSources[it as Int].name)
callback(sources[it as Int].name)
}
}
}
@ -92,11 +83,13 @@ fun BaseSimpleActivity.shareContacts(contacts: ArrayList<Contact>) {
return
}
VcfExporter().exportContacts(this, file, contacts, false) {
if (it == VcfExporter.ExportResult.EXPORT_OK) {
sharePathIntent(file.absolutePath, BuildConfig.APPLICATION_ID)
} else {
showErrorToast("$it")
getFileOutputStream(file.toFileDirItem(this), true) {
VcfExporter().exportContacts(this, it, contacts, false) {
if (it == VcfExporter.ExportResult.EXPORT_OK) {
sharePathIntent(file.absolutePath, BuildConfig.APPLICATION_ID)
} else {
showErrorToast("$it")
}
}
}
}

View File

@ -1,24 +1,20 @@
package com.simplemobiletools.contacts.pro.extensions
import android.annotation.TargetApi
import android.content.ContentValues
import android.content.Context
import android.content.Context.AUDIO_SERVICE
import android.content.Intent
import android.database.Cursor
import android.media.AudioManager
import android.net.Uri
import android.os.Build
import android.os.Handler
import android.os.Looper
import android.provider.BlockedNumberContract
import android.provider.BlockedNumberContract.BlockedNumbers
import android.provider.ContactsContract
import android.telecom.TelecomManager
import androidx.core.content.FileProvider
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.extensions.getIntValue
import com.simplemobiletools.commons.extensions.hasPermission
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
import com.simplemobiletools.commons.helpers.isMarshmallowPlus
import com.simplemobiletools.commons.helpers.isNougatPlus
import com.simplemobiletools.contacts.pro.BuildConfig
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.EditContactActivity
@ -27,7 +23,6 @@ import com.simplemobiletools.contacts.pro.databases.ContactsDatabase
import com.simplemobiletools.contacts.pro.helpers.*
import com.simplemobiletools.contacts.pro.interfaces.ContactsDao
import com.simplemobiletools.contacts.pro.interfaces.GroupsDao
import com.simplemobiletools.contacts.pro.models.BlockedNumber
import com.simplemobiletools.contacts.pro.models.Contact
import com.simplemobiletools.contacts.pro.models.ContactSource
import com.simplemobiletools.contacts.pro.models.Organization
@ -39,13 +34,13 @@ val Context.contactsDB: ContactsDao get() = ContactsDatabase.getInstance(applica
val Context.groupsDB: GroupsDao get() = ContactsDatabase.getInstance(applicationContext).GroupsDao()
val Context.telecomManager: TelecomManager get() = getSystemService(Context.TELECOM_SERVICE) as TelecomManager
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("", "")
return Contact(0, "", "", "", "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), originalContactSource, 0, 0, "",
null, "", ArrayList(), organization, ArrayList(), ArrayList())
null, "", ArrayList(), organization, ArrayList(), ArrayList())
}
fun Context.viewContact(contact: Contact) {
@ -235,7 +230,7 @@ fun Context.sendSMSToContacts(contacts: ArrayList<Contact>) {
val numbers = StringBuilder()
contacts.forEach {
val number = it.phoneNumbers.firstOrNull { it.type == ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE }
?: it.phoneNumbers.firstOrNull()
?: it.phoneNumbers.firstOrNull()
if (number != null) {
numbers.append("${number.value};")
}
@ -321,7 +316,7 @@ fun Context.getVisibleContactSources(): ArrayList<String> {
val sources = getAllContactSources()
val ignoredContactSources = config.ignoredContactSources
return ArrayList(sources).filter { !ignoredContactSources.contains(it.getFullIdentifier()) }
.map { it.name }.toMutableList() as ArrayList<String>
.map { it.name }.toMutableList() as ArrayList<String>
}
fun Context.getAllContactSources(): ArrayList<ContactSource> {
@ -330,60 +325,4 @@ fun Context.getAllContactSources(): ArrayList<ContactSource> {
return sources.toMutableList() as ArrayList<ContactSource>
}
@TargetApi(Build.VERSION_CODES.N)
fun Context.getBlockedNumbers(): ArrayList<BlockedNumber> {
val blockedNumbers = ArrayList<BlockedNumber>()
if (!isNougatPlus() || !isDefaultDialer()) {
return blockedNumbers
}
val uri = BlockedNumberContract.BlockedNumbers.CONTENT_URI
val projection = arrayOf(
BlockedNumberContract.BlockedNumbers.COLUMN_ID,
BlockedNumberContract.BlockedNumbers.COLUMN_ORIGINAL_NUMBER,
BlockedNumberContract.BlockedNumbers.COLUMN_E164_NUMBER
)
var cursor: Cursor? = null
try {
cursor = contentResolver.query(uri, projection, null, null, null)
if (cursor?.moveToFirst() == true) {
do {
val id = cursor.getLongValue(BlockedNumberContract.BlockedNumbers.COLUMN_ID)
val number = cursor.getStringValue(BlockedNumberContract.BlockedNumbers.COLUMN_ORIGINAL_NUMBER) ?: ""
val normalizedNumber = cursor.getStringValue(BlockedNumberContract.BlockedNumbers.COLUMN_E164_NUMBER) ?: ""
val blockedNumber = BlockedNumber(id, number, normalizedNumber)
blockedNumbers.add(blockedNumber)
} while (cursor.moveToNext())
}
} finally {
cursor?.close()
}
return blockedNumbers
}
@TargetApi(Build.VERSION_CODES.N)
fun Context.addBlockedNumber(number: String) {
ContentValues().apply {
put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, number)
try {
contentResolver.insert(BlockedNumbers.CONTENT_URI, this)
} catch (e: Exception) {
showErrorToast(e)
}
}
}
@TargetApi(Build.VERSION_CODES.N)
fun Context.deleteBlockedNumber(number: String) {
val values = ContentValues()
values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, number)
val uri = contentResolver.insert(BlockedNumbers.CONTENT_URI, values)
contentResolver.delete(uri!!, null, null)
}
@TargetApi(Build.VERSION_CODES.M)
fun Context.isDefaultDialer() = isMarshmallowPlus() && telecomManager.defaultDialerPackage == packageName
fun Context.getPrivateContactSource() = ContactSource(SMT_PRIVATE, SMT_PRIVATE, getString(R.string.phone_storage_hidden))

View File

@ -2,7 +2,6 @@ package com.simplemobiletools.contacts.pro.fragments
import android.content.Context
import android.content.Intent
import android.content.res.ColorStateList
import android.util.AttributeSet
import android.view.ViewGroup
import androidx.coordinatorlayout.widget.CoordinatorLayout
@ -10,6 +9,7 @@ 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.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.GroupContactsActivity
@ -45,7 +45,6 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
var skipHashComparing = false
var forceListRedraw = false
var wasLetterFastScrollerSetup = false
fun setupFragment(activity: SimpleActivity) {
config = activity.config
@ -84,7 +83,6 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
this is GroupsFragment -> (fragment_list.adapter as GroupsAdapter).updateTextColor(color)
else -> (fragment_list.adapter as ContactsAdapter).apply {
updateTextColor(color)
initDrawables()
}
}
}
@ -112,8 +110,8 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fun refreshContacts(contacts: ArrayList<Contact>) {
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)) {
(config.showTabs and FAVORITES_TAB_MASK == 0 && this is FavoritesFragment) ||
(config.showTabs and GROUPS_TAB_MASK == 0 && this is GroupsFragment)) {
return
}
@ -151,38 +149,10 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
setupContactsFavoritesAdapter(contacts)
contactsIgnoringSearch = (fragment_list?.adapter as? ContactsAdapter)?.contactItems ?: ArrayList()
if (!wasLetterFastScrollerSetup) {
wasLetterFastScrollerSetup = true
val states = arrayOf(intArrayOf(android.R.attr.state_enabled),
intArrayOf(-android.R.attr.state_enabled),
intArrayOf(-android.R.attr.state_checked),
intArrayOf(android.R.attr.state_pressed)
)
val textColor = config.textColor
val colors = intArrayOf(textColor, textColor, textColor, textColor)
val myList = ColorStateList(states, colors)
letter_fastscroller.textColor = myList
letter_fastscroller.setupWithRecyclerView(fragment_list, { position ->
try {
val name = contacts[position].getNameToDisplay()
var character = if (name.isNotEmpty()) name.substring(0, 1) else ""
if (!character.areLettersOnly()) {
character = "#"
}
FastScrollItemIndicator.Text(character.toUpperCase(Locale.getDefault()))
} catch (e: Exception) {
FastScrollItemIndicator.Text("")
}
})
letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller)
letter_fastscroller_thumb.textColor = config.primaryColor.getContrastColor()
}
letter_fastscroller.textColor = config.textColor.getColorStateList()
setupLetterFastscroller(contacts)
letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller)
letter_fastscroller_thumb.textColor = config.primaryColor.getContrastColor()
}
}
@ -270,6 +240,31 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
}
}
private fun setupLetterFastscroller(contacts: ArrayList<Contact>) {
letter_fastscroller.setupWithRecyclerView(fragment_list, { position ->
try {
val contact = contacts[position]
var name = when {
contact.isABusinessContact() -> contact.getFullCompany()
context.config.sorting and SORT_BY_SURNAME != 0 && contact.surname.isNotEmpty() -> contact.surname
context.config.sorting and SORT_BY_MIDDLE_NAME != 0 && contact.middleName.isNotEmpty() -> contact.middleName
context.config.sorting and SORT_BY_FIRST_NAME != 0 && contact.firstName.isNotEmpty() -> contact.firstName
context.config.startNameWithSurname -> contact.surname
else -> contact.firstName
}
if (name.isEmpty()) {
name = contact.getNameToDisplay()
}
val character = if (name.isNotEmpty()) name.substring(0, 1) else ""
FastScrollItemIndicator.Text(character.toUpperCase(Locale.getDefault()))
} catch (e: Exception) {
FastScrollItemIndicator.Text("")
}
})
}
fun fontSizeChanged() {
if (this is GroupsFragment) {
(fragment_list.adapter as? GroupsAdapter)?.apply {
@ -321,6 +316,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fragment_placeholder.beVisibleIf(filtered.isEmpty())
(adapter as? ContactsAdapter)?.updateItems(filtered, text.normalizeString())
setupLetterFastscroller(filtered)
} else if (adapter is GroupsAdapter) {
val filtered = groupsIgnoringSearch.filter {
it.title.contains(text, true)
@ -343,6 +339,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fun onSearchClosed() {
if (fragment_list.adapter is ContactsAdapter) {
(fragment_list.adapter as? ContactsAdapter)?.updateItems(contactsIgnoringSearch)
setupLetterFastscroller(contactsIgnoringSearch)
setupViewVisibility(contactsIgnoringSearch.isNotEmpty())
} else if (fragment_list.adapter is GroupsAdapter) {
(fragment_list.adapter as? GroupsAdapter)?.updateItems(groupsIgnoringSearch)

View File

@ -0,0 +1,64 @@
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.extensions.getNameFromPhoneNumber
import com.simplemobiletools.commons.extensions.getPhotoUriFromPhoneNumber
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 getCallContact(context: Context): CallContact? {
val callContact = CallContact("", "")
if (call == null) {
return callContact
}
val uri = Uri.decode(call!!.details.handle.toString())
if (uri.startsWith("tel:")) {
val number = uri.substringAfter("tel:")
callContact.name = context.getNameFromPhoneNumber(number)
callContact.photoUri = context.getPhotoUriFromPhoneNumber(number)
}
return callContact
}
}
}

View File

@ -60,6 +60,14 @@ class Config(context: Context) : BaseConfig(context) {
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()
var lastExportPath: String
get() = prefs.getString(LAST_EXPORT_PATH, "")!!
set(lastExportPath) = prefs.edit().putString(LAST_EXPORT_PATH, lastExportPath).apply()
var speedDial: String
get() = prefs.getString(SPEED_DIAL, "")!!
set(speedDial) = prefs.edit().putString(SPEED_DIAL, speedDial).apply()

View File

@ -22,6 +22,8 @@ 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 CONTACT_ID = "contact_id"
const val SMT_PRIVATE = "smt_private" // used at the contact source of local contacts hidden from other apps
@ -31,7 +33,10 @@ 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
const val REQUEST_CODE_SET_DEFAULT_DIALER = 1
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_PHONE = "phone"
@ -114,7 +119,7 @@ const val TELEGRAM_PACKAGE = "org.telegram.messenger"
const val SIGNAL_PACKAGE = "org.thoughtcrime.securesms"
const val WHATSAPP_PACKAGE = "com.whatsapp"
fun getEmptyLocalContact() = LocalContact(0, "", "", "", "", "", "", null, ArrayList(), ArrayList(), ArrayList(), 0, ArrayList(), "", ArrayList(), "", "", ArrayList(), ArrayList())
fun getEmptyLocalContact() = LocalContact(0, "", "", "", "", "", "", null, "", ArrayList(), ArrayList(), ArrayList(), 0, ArrayList(), "", ArrayList(), "", "", ArrayList(), ArrayList())
fun getProperText(text: String, shouldNormalize: Boolean) = if (shouldNormalize) text.normalizeString() else text

View File

@ -114,6 +114,7 @@ class LocalContactsHelper(val context: Context) {
contactId = localContact.id!!
thumbnailUri = ""
photo = contactPhoto
photoUri = localContact.photoUri
notes = localContact.notes
groups = storedGroups.filter { localContact.groups.contains(it.id) } as ArrayList<Group>
organization = Organization(localContact.company, localContact.jobPosition)

View File

@ -2,11 +2,10 @@ package com.simplemobiletools.contacts.pro.helpers
import android.net.Uri
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.getFileOutputStream
import com.simplemobiletools.commons.extensions.showErrorToast
import com.simplemobiletools.commons.extensions.toFileDirItem
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.extensions.getByteArray
@ -17,8 +16,12 @@ import ezvcard.Ezvcard
import ezvcard.VCard
import ezvcard.parameter.ImageType
import ezvcard.property.*
import ezvcard.property.Email
import ezvcard.property.Organization
import ezvcard.property.Photo
import ezvcard.property.StructuredName
import ezvcard.util.PartialDate
import java.io.File
import java.io.OutputStream
import java.util.*
class VcfExporter {
@ -29,151 +32,149 @@ class VcfExporter {
private var contactsExported = 0
private var contactsFailed = 0
fun exportContacts(activity: BaseSimpleActivity, file: File, contacts: ArrayList<Contact>, showExportingToast: Boolean, callback: (result: ExportResult) -> Unit) {
activity.getFileOutputStream(file.toFileDirItem(activity), true) {
try {
if (it == null) {
callback(EXPORT_FAIL)
return@getFileOutputStream
fun exportContacts(activity: BaseSimpleActivity, outputStream: OutputStream?, contacts: ArrayList<Contact>, showExportingToast: Boolean, callback: (result: ExportResult) -> Unit) {
try {
if (outputStream == null) {
callback(EXPORT_FAIL)
return
}
if (showExportingToast) {
activity.toast(R.string.exporting)
}
val cards = ArrayList<VCard>()
for (contact in contacts) {
val card = VCard()
StructuredName().apply {
prefixes.add(contact.prefix)
given = contact.firstName
additionalNames.add(contact.middleName)
family = contact.surname
suffixes.add(contact.suffix)
card.structuredName = this
}
if (showExportingToast) {
activity.toast(R.string.exporting)
if (contact.nickname.isNotEmpty()) {
card.setNickname(contact.nickname)
}
val cards = ArrayList<VCard>()
for (contact in contacts) {
val card = VCard()
StructuredName().apply {
prefixes.add(contact.prefix)
given = contact.firstName
additionalNames.add(contact.middleName)
family = contact.surname
suffixes.add(contact.suffix)
card.structuredName = this
}
contact.phoneNumbers.forEach {
val phoneNumber = Telephone(it.value)
phoneNumber.parameters.addType(getPhoneNumberTypeLabel(it.type, it.label))
card.addTelephoneNumber(phoneNumber)
}
if (contact.nickname.isNotEmpty()) {
card.setNickname(contact.nickname)
}
contact.emails.forEach {
val email = Email(it.value)
email.parameters.addType(getEmailTypeLabel(it.type, it.label))
card.addEmail(email)
}
contact.phoneNumbers.forEach {
val phoneNumber = Telephone(it.value)
phoneNumber.parameters.addType(getPhoneNumberTypeLabel(it.type, it.label))
card.addTelephoneNumber(phoneNumber)
}
contact.emails.forEach {
val email = Email(it.value)
email.parameters.addType(getEmailTypeLabel(it.type, it.label))
card.addEmail(email)
}
contact.events.forEach {
if (it.type == CommonDataKinds.Event.TYPE_ANNIVERSARY || it.type == CommonDataKinds.Event.TYPE_BIRTHDAY) {
val dateTime = it.value.getDateTimeFromDateString()
if (it.value.startsWith("--")) {
val partialDate = PartialDate.builder().year(null).month(dateTime.monthOfYear).date(dateTime.dayOfMonth).build()
if (it.type == CommonDataKinds.Event.TYPE_BIRTHDAY) {
card.birthdays.add(Birthday(partialDate))
} else {
card.anniversaries.add(Anniversary(partialDate))
}
contact.events.forEach {
if (it.type == Event.TYPE_ANNIVERSARY || it.type == Event.TYPE_BIRTHDAY) {
val dateTime = it.value.getDateTimeFromDateString()
if (it.value.startsWith("--")) {
val partialDate = PartialDate.builder().year(null).month(dateTime.monthOfYear).date(dateTime.dayOfMonth).build()
if (it.type == Event.TYPE_BIRTHDAY) {
card.birthdays.add(Birthday(partialDate))
} else {
Calendar.getInstance().apply {
clear()
set(Calendar.YEAR, dateTime.year)
set(Calendar.MONTH, dateTime.monthOfYear - 1)
set(Calendar.DAY_OF_MONTH, dateTime.dayOfMonth)
if (it.type == CommonDataKinds.Event.TYPE_BIRTHDAY) {
card.birthdays.add(Birthday(time))
} else {
card.anniversaries.add(Anniversary(time))
}
card.anniversaries.add(Anniversary(partialDate))
}
} else {
Calendar.getInstance().apply {
clear()
set(Calendar.YEAR, dateTime.year)
set(Calendar.MONTH, dateTime.monthOfYear - 1)
set(Calendar.DAY_OF_MONTH, dateTime.dayOfMonth)
if (it.type == Event.TYPE_BIRTHDAY) {
card.birthdays.add(Birthday(time))
} else {
card.anniversaries.add(Anniversary(time))
}
}
}
}
contact.addresses.forEach {
val address = Address()
address.streetAddress = it.value
address.parameters.addType(getAddressTypeLabel(it.type, it.label))
card.addAddress(address)
}
contact.IMs.forEach {
val impp = when (it.type) {
CommonDataKinds.Im.PROTOCOL_AIM -> Impp.aim(it.value)
CommonDataKinds.Im.PROTOCOL_YAHOO -> Impp.yahoo(it.value)
CommonDataKinds.Im.PROTOCOL_MSN -> Impp.msn(it.value)
CommonDataKinds.Im.PROTOCOL_ICQ -> Impp.icq(it.value)
CommonDataKinds.Im.PROTOCOL_SKYPE -> Impp.skype(it.value)
CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK -> Impp(HANGOUTS, it.value)
CommonDataKinds.Im.PROTOCOL_QQ -> Impp(QQ, it.value)
CommonDataKinds.Im.PROTOCOL_JABBER -> Impp(JABBER, it.value)
else -> Impp(it.label, it.value)
}
card.addImpp(impp)
}
if (contact.notes.isNotEmpty()) {
card.addNote(contact.notes)
}
if (contact.organization.isNotEmpty()) {
val organization = Organization()
organization.values.add(contact.organization.company)
card.organization = organization
card.titles.add(Title(contact.organization.jobPosition))
}
contact.websites.forEach {
card.addUrl(it)
}
if (contact.thumbnailUri.isNotEmpty()) {
val photoByteArray = MediaStore.Images.Media.getBitmap(activity.contentResolver, Uri.parse(contact.thumbnailUri)).getByteArray()
val photo = Photo(photoByteArray, ImageType.JPEG)
card.addPhoto(photo)
}
if (contact.groups.isNotEmpty()) {
val groupList = Categories()
contact.groups.forEach {
groupList.values.add(it.title)
}
card.categories = groupList
}
cards.add(card)
contactsExported++
}
Ezvcard.write(cards).go(it)
} catch (e: Exception) {
activity.showErrorToast(e)
contact.addresses.forEach {
val address = Address()
address.streetAddress = it.value
address.parameters.addType(getAddressTypeLabel(it.type, it.label))
card.addAddress(address)
}
contact.IMs.forEach {
val impp = when (it.type) {
Im.PROTOCOL_AIM -> Impp.aim(it.value)
Im.PROTOCOL_YAHOO -> Impp.yahoo(it.value)
Im.PROTOCOL_MSN -> Impp.msn(it.value)
Im.PROTOCOL_ICQ -> Impp.icq(it.value)
Im.PROTOCOL_SKYPE -> Impp.skype(it.value)
Im.PROTOCOL_GOOGLE_TALK -> Impp(HANGOUTS, it.value)
Im.PROTOCOL_QQ -> Impp(QQ, it.value)
Im.PROTOCOL_JABBER -> Impp(JABBER, it.value)
else -> Impp(it.label, it.value)
}
card.addImpp(impp)
}
if (contact.notes.isNotEmpty()) {
card.addNote(contact.notes)
}
if (contact.organization.isNotEmpty()) {
val organization = Organization()
organization.values.add(contact.organization.company)
card.organization = organization
card.titles.add(Title(contact.organization.jobPosition))
}
contact.websites.forEach {
card.addUrl(it)
}
if (contact.thumbnailUri.isNotEmpty()) {
val photoByteArray = MediaStore.Images.Media.getBitmap(activity.contentResolver, Uri.parse(contact.thumbnailUri)).getByteArray()
val photo = Photo(photoByteArray, ImageType.JPEG)
card.addPhoto(photo)
}
if (contact.groups.isNotEmpty()) {
val groupList = Categories()
contact.groups.forEach {
groupList.values.add(it.title)
}
card.categories = groupList
}
cards.add(card)
contactsExported++
}
callback(when {
contactsExported == 0 -> EXPORT_FAIL
contactsFailed > 0 -> ExportResult.EXPORT_PARTIAL
else -> ExportResult.EXPORT_OK
})
Ezvcard.write(cards).go(outputStream)
} catch (e: Exception) {
activity.showErrorToast(e)
}
callback(when {
contactsExported == 0 -> EXPORT_FAIL
contactsFailed > 0 -> ExportResult.EXPORT_PARTIAL
else -> ExportResult.EXPORT_OK
})
}
private fun getPhoneNumberTypeLabel(type: Int, label: String) = when (type) {
CommonDataKinds.Phone.TYPE_MOBILE -> CELL
CommonDataKinds.Phone.TYPE_HOME -> HOME
CommonDataKinds.Phone.TYPE_WORK -> WORK
CommonDataKinds.Phone.TYPE_MAIN -> PREF
CommonDataKinds.Phone.TYPE_FAX_WORK -> WORK_FAX
CommonDataKinds.Phone.TYPE_FAX_HOME -> HOME_FAX
CommonDataKinds.Phone.TYPE_PAGER -> PAGER
CommonDataKinds.Phone.TYPE_OTHER -> OTHER
Phone.TYPE_MOBILE -> CELL
Phone.TYPE_HOME -> HOME
Phone.TYPE_WORK -> WORK
Phone.TYPE_MAIN -> PREF
Phone.TYPE_FAX_WORK -> WORK_FAX
Phone.TYPE_FAX_HOME -> HOME_FAX
Phone.TYPE_PAGER -> PAGER
Phone.TYPE_OTHER -> OTHER
else -> label
}
@ -186,9 +187,9 @@ class VcfExporter {
}
private fun getAddressTypeLabel(type: Int, label: String) = when (type) {
CommonDataKinds.StructuredPostal.TYPE_HOME -> HOME
CommonDataKinds.StructuredPostal.TYPE_WORK -> WORK
CommonDataKinds.StructuredPostal.TYPE_OTHER -> OTHER
StructuredPostal.TYPE_HOME -> HOME
StructuredPostal.TYPE_WORK -> WORK
StructuredPostal.TYPE_OTHER -> OTHER
else -> label
}
}

View File

@ -3,6 +3,7 @@ package com.simplemobiletools.contacts.pro.helpers
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.provider.ContactsContract.CommonDataKinds
import android.provider.ContactsContract.CommonDataKinds.*
import android.widget.Toast
import com.simplemobiletools.commons.extensions.showErrorToast
import com.simplemobiletools.contacts.pro.activities.SimpleActivity
@ -12,6 +13,9 @@ import com.simplemobiletools.contacts.pro.extensions.groupsDB
import com.simplemobiletools.contacts.pro.extensions.normalizeNumber
import com.simplemobiletools.contacts.pro.helpers.VcfImporter.ImportResult.*
import com.simplemobiletools.contacts.pro.models.*
import com.simplemobiletools.contacts.pro.models.Email
import com.simplemobiletools.contacts.pro.models.Event
import com.simplemobiletools.contacts.pro.models.Organization
import ezvcard.Ezvcard
import ezvcard.VCard
import java.io.File
@ -50,7 +54,7 @@ class VcfImporter(val activity: SimpleActivity) {
ezContact.telephoneNumbers.forEach {
val number = it.text
val type = getPhoneNumberTypeId(it.types.firstOrNull()?.value ?: MOBILE, it.types.getOrNull(1)?.value)
val label = if (type == CommonDataKinds.Phone.TYPE_CUSTOM) {
val label = if (type == Phone.TYPE_CUSTOM) {
it.types.firstOrNull()?.value ?: ""
} else {
""
@ -76,7 +80,7 @@ class VcfImporter(val activity: SimpleActivity) {
ezContact.addresses.forEach {
val address = it.streetAddress
val type = getAddressTypeId(it.types.firstOrNull()?.value ?: HOME)
val label = if (type == CommonDataKinds.StructuredPostal.TYPE_CUSTOM) {
val label = if (type == StructuredPostal.TYPE_CUSTOM) {
it.types.firstOrNull()?.value ?: ""
} else {
""
@ -115,24 +119,24 @@ class VcfImporter(val activity: SimpleActivity) {
val typeString = it.uri.scheme
val value = URLDecoder.decode(it.uri.toString().substring(it.uri.scheme.length + 1), "UTF-8")
val type = when {
it.isAim -> CommonDataKinds.Im.PROTOCOL_AIM
it.isYahoo -> CommonDataKinds.Im.PROTOCOL_YAHOO
it.isMsn -> CommonDataKinds.Im.PROTOCOL_MSN
it.isIcq -> CommonDataKinds.Im.PROTOCOL_ICQ
it.isSkype -> CommonDataKinds.Im.PROTOCOL_SKYPE
typeString == HANGOUTS -> CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK
typeString == QQ -> CommonDataKinds.Im.PROTOCOL_QQ
typeString == JABBER -> CommonDataKinds.Im.PROTOCOL_JABBER
else -> CommonDataKinds.Im.PROTOCOL_CUSTOM
it.isAim -> Im.PROTOCOL_AIM
it.isYahoo -> Im.PROTOCOL_YAHOO
it.isMsn -> Im.PROTOCOL_MSN
it.isIcq -> Im.PROTOCOL_ICQ
it.isSkype -> Im.PROTOCOL_SKYPE
typeString == HANGOUTS -> Im.PROTOCOL_GOOGLE_TALK
typeString == QQ -> Im.PROTOCOL_QQ
typeString == JABBER -> Im.PROTOCOL_JABBER
else -> Im.PROTOCOL_CUSTOM
}
val label = if (type == CommonDataKinds.Im.PROTOCOL_CUSTOM) URLDecoder.decode(typeString, "UTF-8") else ""
val label = if (type == Im.PROTOCOL_CUSTOM) URLDecoder.decode(typeString, "UTF-8") else ""
val IM = IM(value, type, label)
IMs.add(IM)
}
val contact = Contact(0, prefix, firstName, middleName, surname, suffix, nickname, photoUri, phoneNumbers, emails, addresses, events,
targetContactSource, starred, contactId, thumbnailUri, photo, notes, groups, organization, websites, IMs)
targetContactSource, starred, contactId, thumbnailUri, photo, notes, groups, organization, websites, IMs)
// if there is no N and ORG fields at the given contact, only FN, treat it as an organization
if (contact.getNameToDisplay().isEmpty() && contact.organization.isEmpty() && ezContact.formattedName?.value?.isNotEmpty() == true) {
@ -189,28 +193,28 @@ class VcfImporter(val activity: SimpleActivity) {
}
private fun getPhoneNumberTypeId(type: String, subtype: String?) = when (type.toUpperCase()) {
CELL -> CommonDataKinds.Phone.TYPE_MOBILE
CELL -> Phone.TYPE_MOBILE
HOME -> {
if (subtype?.toUpperCase() == FAX) {
CommonDataKinds.Phone.TYPE_FAX_HOME
Phone.TYPE_FAX_HOME
} else {
CommonDataKinds.Phone.TYPE_HOME
Phone.TYPE_HOME
}
}
WORK -> {
if (subtype?.toUpperCase() == FAX) {
CommonDataKinds.Phone.TYPE_FAX_WORK
Phone.TYPE_FAX_WORK
} else {
CommonDataKinds.Phone.TYPE_WORK
Phone.TYPE_WORK
}
}
PREF, MAIN -> CommonDataKinds.Phone.TYPE_MAIN
WORK_FAX -> CommonDataKinds.Phone.TYPE_FAX_WORK
HOME_FAX -> CommonDataKinds.Phone.TYPE_FAX_HOME
FAX -> CommonDataKinds.Phone.TYPE_FAX_WORK
PAGER -> CommonDataKinds.Phone.TYPE_PAGER
OTHER -> CommonDataKinds.Phone.TYPE_OTHER
else -> CommonDataKinds.Phone.TYPE_CUSTOM
PREF, MAIN -> Phone.TYPE_MAIN
WORK_FAX -> Phone.TYPE_FAX_WORK
HOME_FAX -> Phone.TYPE_FAX_HOME
FAX -> Phone.TYPE_FAX_WORK
PAGER -> Phone.TYPE_PAGER
OTHER -> Phone.TYPE_OTHER
else -> Phone.TYPE_CUSTOM
}
private fun getEmailTypeId(type: String) = when (type.toUpperCase()) {
@ -222,10 +226,10 @@ class VcfImporter(val activity: SimpleActivity) {
}
private fun getAddressTypeId(type: String) = when (type.toUpperCase()) {
HOME -> CommonDataKinds.StructuredPostal.TYPE_HOME
WORK -> CommonDataKinds.StructuredPostal.TYPE_WORK
OTHER -> CommonDataKinds.StructuredPostal.TYPE_OTHER
else -> CommonDataKinds.StructuredPostal.TYPE_CUSTOM
HOME -> StructuredPostal.TYPE_HOME
WORK -> StructuredPostal.TYPE_WORK
OTHER -> StructuredPostal.TYPE_OTHER
else -> StructuredPostal.TYPE_CUSTOM
}
private fun savePhoto(byteArray: ByteArray?): String {

View File

@ -1,3 +0,0 @@
package com.simplemobiletools.contacts.pro.models
data class BlockedNumber(val id: Long, val number: String, val normalizedNumber: String)

View File

@ -0,0 +1,4 @@
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)

View File

@ -138,4 +138,6 @@ data class Contact(var id: Int, var prefix: String, var firstName: String, var m
}
fun isPrivate() = source == SMT_PRIVATE
fun getSignatureKey() = if (photoUri.isNotEmpty()) photoUri else hashCode()
}

View File

@ -15,6 +15,7 @@ data class LocalContact(
@ColumnInfo(name = "suffix") var suffix: String,
@ColumnInfo(name = "nickname") var nickname: String,
@ColumnInfo(name = "photo", typeAffinity = ColumnInfo.BLOB) var photo: ByteArray?,
@ColumnInfo(name = "photo_uri") var photoUri: String,
@ColumnInfo(name = "phone_numbers") var phoneNumbers: ArrayList<PhoneNumber>,
@ColumnInfo(name = "emails") var emails: ArrayList<Email>,
@ColumnInfo(name = "events") var events: ArrayList<Event>,

View File

@ -0,0 +1,17 @@
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()
}
}
}

View File

@ -0,0 +1,25 @@
package com.simplemobiletools.contacts.pro.services
import android.content.Intent
import android.os.Build
import android.telecom.Call
import android.telecom.InCallService
import androidx.annotation.RequiresApi
import com.simplemobiletools.contacts.pro.activities.CallActivity
import com.simplemobiletools.contacts.pro.helpers.CallManager
@RequiresApi(Build.VERSION_CODES.M)
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
}
}

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/color_primary"/>
</shape>

View File

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M12,7L12,3L2,3v18h20L22,7L12,7zM6,19L4,19v-2h2v2zM6,15L4,15v-2h2v2zM6,11L4,11L4,9h2v2zM6,7L4,7L4,5h2v2zM10,19L8,19v-2h2v2zM10,15L8,15v-2h2v2zM10,11L8,11L8,9h2v2zM10,7L8,7L8,5h2v2zM20,19h-8v-2h2v-2h-2v-2h2v-2h-2L12,9h8v10zM18,11h-2v2h2v-2zM18,15h-2v2h2v-2z"/>
</vector>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/ripple_foreground">
<item android:id="@+id/shortcut_dialpad_background">
<shape android:shape="oval">
<solid android:color="@color/md_green_700" />
</shape>
</item>
<item
android:bottom="@dimen/medium_margin"
android:drawable="@drawable/ic_phone_vector"
android:left="@dimen/medium_margin"
android:right="@dimen/medium_margin"
android:top="@dimen/medium_margin" />
</ripple>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/ripple_foreground">
<item android:id="@+id/shortcut_dialpad_background">
<shape android:shape="oval">
<solid android:color="@color/md_red_700" />
</shape>
</item>
<item
android:bottom="@dimen/medium_margin"
android:drawable="@drawable/ic_phone_down_vector"
android:left="@dimen/medium_margin"
android:right="@dimen/medium_margin"
android:top="@dimen/medium_margin" />
</ripple>

View File

@ -1,9 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:width="96dp"
android:height="96dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M8,10L5,10L5,7L3,7v3L0,10v2h3v3h2v-3h3v-2zM18,11c1.66,0 2.99,-1.34 2.99,-3S19.66,5 18,5c-0.32,0 -0.63,0.05 -0.91,0.14 0.57,0.81 0.9,1.79 0.9,2.86s-0.34,2.04 -0.9,2.86c0.28,0.09 0.59,0.14 0.91,0.14zM13,11c1.66,0 2.99,-1.34 2.99,-3S14.66,5 13,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM19.62,13.16c0.83,0.73 1.38,1.66 1.38,2.84v2h3v-2c0,-1.54 -2.37,-2.49 -4.38,-2.84zM13,13c-2,0 -6,1 -6,3v2h12v-2c0,-2 -4,-3 -6,-3z"/>
<path
android:fillColor="#FFFFFF"
android:pathData="M8,10L5,10L5,7L3,7v3L0,10v2h3v3h2v-3h3v-2zM18,11c1.66,0 2.99,-1.34 2.99,-3S19.66,5 18,5c-0.32,0 -0.63,0.05 -0.91,0.14 0.57,0.81 0.9,1.79 0.9,2.86s-0.34,2.04 -0.9,2.86c0.28,0.09 0.59,0.14 0.91,0.14zM13,11c1.66,0 2.99,-1.34 2.99,-3S14.66,5 13,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM19.62,13.16c0.83,0.73 1.38,1.66 1.38,2.84v2h3v-2c0,-1.54 -2.37,-2.49 -4.38,-2.84zM13,13c-2,0 -6,1 -6,3v2h12v-2c0,-2 -4,-3 -6,-3z" />
</vector>

View File

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M16,11c1.66,0 2.99,-1.34 2.99,-3S17.66,5 16,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM8,11c1.66,0 2.99,-1.34 2.99,-3S9.66,5 8,5C6.34,5 5,6.34 5,8s1.34,3 3,3zM8,13c-2.33,0 -7,1.17 -7,3.5L1,19h14v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5zM16,13c-0.29,0 -0.62,0.02 -0.97,0.05 1.16,0.84 1.97,1.97 1.97,3.45L17,19h6v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M19,11C19,11 19.0088,9.8569 18.1571,9.8714 17.362,9.885 17.3,11 17.3,11c0,0.74 -0.16,1.43 -0.43,2.05l1.23,1.23C18.66,13.3 19,12.19 19,11ZM14.98,11.17C14.98,11.11 15,11.06 15,11L15,5C15,3.34 13.66,2 12,2 10.34,2 9,3.34 9,5L9,5.18ZM4.27,3 L3,4.27l6.01,6.01 0,0.72c0,1.66 1.33,3 2.99,3 0.22,0 0.44,-0.03 0.65,-0.08l1.66,1.66C13.6,15.91 12.81,16.1 12,16.1 9.24,16.1 6.7,14 6.7,11 6.7,11 6.6686,9.9807 5.8435,9.992 5.0185,10.0033 5,11 5,11c0,3.41 2.72,6.23 6,6.72L11,21c0,0 -0.0013,1.036 1.0127,1.0169C12.9886,21.9987 13,21 13,21l0,-3.28c0.91,-0.13 1.77,-0.45 2.54,-0.9L19.73,21 21,19.73Z" />
</vector>

View File

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M15,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM6,10L6,7L4,7v3L1,10v2h3v3h2v-3h3v-2L6,10zM15,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/md_red_700"
android:pathData="M23.4267,12.2343C20.4492,9.413 16.4272,7.6753 11.9951,7.6753c-4.4321,0 -8.4541,1.7377 -11.4316,4.559 -0.1757,0.1757 -0.2831,0.4198 -0.2831,0.6931 0,0.2733 0.1074,0.5174 0.2831,0.6931l2.421,2.421c0.1757,0.1757 0.4198,0.2831 0.6931,0.2831 0.2636,0 0.5076,-0.1074 0.6834,-0.2733 0.7712,-0.7224 1.6498,-1.3277 2.5968,-1.806 0.3222,-0.1562 0.5467,-0.4881 0.5467,-0.8786l0,-3.0263C8.92,9.8718 10.4332,9.6278 11.9951,9.6278c1.562,0 3.0751,0.2441 4.4906,0.7029l0,3.0263c0,0.3807 0.2245,0.7224 0.5467,0.8786 0.9567,0.4783 1.8255,1.0934 2.6065,1.806 0.1757,0.1757 0.4198,0.2733 0.6834,0.2733 0.2733,0 0.5174,-0.1074 0.6931,-0.2831l2.421,-2.421c0.1757,-0.1757 0.2831,-0.4198 0.2831,-0.6931 0,-0.2733 -0.1171,-0.5076 -0.2929,-0.6834z" />
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M23.4267,12.2343C20.4492,9.413 16.4272,7.6753 11.9951,7.6753c-4.4321,0 -8.4541,1.7377 -11.4316,4.559 -0.1757,0.1757 -0.2831,0.4198 -0.2831,0.6931 0,0.2733 0.1074,0.5174 0.2831,0.6931l2.421,2.421c0.1757,0.1757 0.4198,0.2831 0.6931,0.2831 0.2636,0 0.5076,-0.1074 0.6834,-0.2733 0.7712,-0.7224 1.6498,-1.3277 2.5968,-1.806 0.3222,-0.1562 0.5467,-0.4881 0.5467,-0.8786l0,-3.0263C8.92,9.8718 10.4332,9.6278 11.9951,9.6278c1.562,0 3.0751,0.2441 4.4906,0.7029l0,3.0263c0,0.3807 0.2245,0.7224 0.5467,0.8786 0.9567,0.4783 1.8255,1.0934 2.6065,1.806 0.1757,0.1757 0.4198,0.2733 0.6834,0.2733 0.2733,0 0.5174,-0.1074 0.6931,-0.2831l2.421,-2.421c0.1757,-0.1757 0.2831,-0.4198 0.2831,-0.6931 0,-0.2733 -0.1171,-0.5076 -0.2929,-0.6834z" />
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/md_green_700"
android:pathData="M6.62,10.79c1.44,2.83 3.76,5.14 6.59,6.59l2.2,-2.2c0.27,-0.27 0.67,-0.36 1.02,-0.24 1.12,0.37 2.33,0.57 3.57,0.57 0.55,0 1,0.45 1,1V20c0,0.55 -0.45,1 -1,1 -9.39,0 -17,-7.61 -17,-17 0,-0.55 0.45,-1 1,-1h3.5c0.55,0 1,0.45 1,1 0,1.25 0.2,2.45 0.57,3.57 0.11,0.35 0.03,0.74 -0.25,1.02l-2.2,2.2z" />
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v2.21l2.45,2.45c0.03,-0.2 0.05,-0.41 0.05,-0.63zM19,12c0,0.94 -0.2,1.82 -0.54,2.64l1.51,1.51C20.63,14.91 21,13.5 21,12c0,-4.28 -2.99,-7.86 -7,-8.77v2.06c2.89,0.86 5,3.54 5,6.71zM4.27,3L3,4.27 7.73,9L3,9v6h4l5,5v-6.73l4.25,4.25c-0.67,0.52 -1.42,0.93 -2.25,1.18v2.06c1.38,-0.31 2.63,-0.95 3.69,-1.81L19.73,21 21,19.73l-9,-9L4.27,3zM12,4L9.91,6.09 12,8.18L12,4z" />
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z" />
</vector>

View File

@ -0,0 +1,6 @@
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/md_grey">
<item
android:id="@android:id/mask"
android:drawable="@android:color/white" />
</ripple>

View File

@ -0,0 +1,200 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/call_holder"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/caller_avatar"
android:layout_width="@dimen/incoming_call_button_size"
android:layout_height="@dimen/incoming_call_button_size"
android:contentDescription="@string/accept"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.2"
tools:src="@drawable/ic_call_accept" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/caller_name_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/normal_margin"
android:textSize="@dimen/caller_name_text_size"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/caller_avatar"
tools:text="Caller name" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/call_status_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/normal_margin"
android:alpha="0.8"
android:textSize="@dimen/call_status_text_size"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/caller_name_label"
tools:text="Is Calling" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/ongoing_call_holder"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/call_toggle_microphone"
android:layout_width="@dimen/dialpad_button_size"
android:layout_height="@dimen/dialpad_button_size"
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_microphone_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.15"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.75" />
<ImageView
android:id="@+id/call_toggle_speaker"
android:layout_width="@dimen/dialpad_button_size"
android:layout_height="@dimen/dialpad_button_size"
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_speaker_off_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.75" />
<ImageView
android:id="@+id/call_dialpad"
android:layout_width="@dimen/dialpad_button_size"
android:layout_height="@dimen/dialpad_button_size"
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_dialpad_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.85"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.75" />
<ImageView
android:id="@+id/call_end"
android:layout_width="@dimen/dialpad_button_size"
android:layout_height="@dimen/dialpad_button_size"
android:contentDescription="@string/decline"
android:src="@drawable/ic_call_decline"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.9" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/incoming_call_holder"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/call_decline"
android:layout_width="@dimen/incoming_call_button_size"
android:layout_height="@dimen/incoming_call_button_size"
android:contentDescription="@string/decline"
android:src="@drawable/ic_call_decline"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.15"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.85" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/call_decline_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/normal_margin"
android:text="@string/decline"
android:textSize="@dimen/big_text_size"
app:layout_constraintEnd_toEndOf="@+id/call_decline"
app:layout_constraintStart_toStartOf="@+id/call_decline"
app:layout_constraintTop_toBottomOf="@+id/call_decline" />
<ImageView
android:id="@+id/call_accept"
android:layout_width="@dimen/incoming_call_button_size"
android:layout_height="@dimen/incoming_call_button_size"
android:contentDescription="@string/accept"
android:src="@drawable/ic_call_accept"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.85"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.85" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/call_accept_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/normal_margin"
android:text="@string/accept"
android:textSize="@dimen/big_text_size"
app:layout_constraintEnd_toEndOf="@+id/call_accept"
app:layout_constraintStart_toStartOf="@+id/call_accept"
app:layout_constraintTop_toBottomOf="@+id/call_accept" />
</androidx.constraintlayout.widget.ConstraintLayout>
<RelativeLayout
android:id="@+id/dialpad_wrapper"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginBottom="@dimen/activity_margin"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/call_status_label">
<com.simplemobiletools.commons.views.MyEditText
android:id="@+id/dialpad_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/dialpad_include"
android:layout_marginStart="@dimen/dialpad_button_size"
android:layout_marginEnd="@dimen/medium_margin"
android:layout_toStartOf="@+id/dialpad_close"
android:gravity="center"
android:inputType="phone"
android:textCursorDrawable="@null"
android:textSize="@dimen/dialpad_text_size" />
<ImageView
android:id="@+id/dialpad_close"
android:layout_width="@dimen/normal_icon_size"
android:layout_height="@dimen/normal_icon_size"
android:layout_alignTop="@+id/dialpad_input"
android:layout_alignBottom="@+id/dialpad_input"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="@dimen/activity_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_cross_vector" />
<include
android:id="@+id/dialpad_include"
layout="@layout/dialpad" />
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/dialpad_holder"
android:layout_width="match_parent"
@ -16,21 +15,19 @@
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"
app:layout_constraintBottom_toTopOf="@+id/dialpad_input"
app:layout_constraintTop_toTopOf="parent"/>
app:layout_constraintTop_toTopOf="parent" />
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/dialpad_fastscroller"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:paddingStart="@dimen/normal_margin"
android:paddingLeft="@dimen/normal_margin"
app:layout_constraintBottom_toBottomOf="@+id/dialpad_list"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/dialpad_list">
<include layout="@layout/fastscroller_handle_vertical"/>
<include layout="@layout/fastscroller_handle_vertical" />
</com.simplemobiletools.commons.views.FastScroller>
@ -39,7 +36,7 @@
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@drawable/divider"
app:layout_constraintBottom_toTopOf="@+id/dialpad_input"/>
app:layout_constraintBottom_toTopOf="@+id/dialpad_input" />
<com.simplemobiletools.commons.views.MyEditText
android:id="@+id/dialpad_input"
@ -50,9 +47,9 @@
android:inputType="phone"
android:textCursorDrawable="@null"
android:textSize="@dimen/dialpad_text_size"
app:layout_constraintBottom_toTopOf="@+id/dialpad_2"
app:layout_constraintBottom_toTopOf="@+id/dialpad_wrapper"
app:layout_constraintEnd_toStartOf="@+id/dialpad_clear_char"
app:layout_constraintStart_toStartOf="parent"/>
app:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/dialpad_clear_char"
@ -65,263 +62,14 @@
android:src="@drawable/ic_backspace_vector"
app:layout_constraintBottom_toBottomOf="@+id/dialpad_input"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/dialpad_input"/>
app:layout_constraintTop_toTopOf="@+id/dialpad_input" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_1"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
<include
android:id="@+id/dialpad_wrapper"
layout="@layout/dialpad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_margin"
android:text="1"
app:layout_constraintBottom_toTopOf="@+id/dialpad_4"
app:layout_constraintEnd_toStartOf="@+id/dialpad_2"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_2"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="2"
app:layout_constraintBottom_toTopOf="@+id/dialpad_5"
app:layout_constraintEnd_toStartOf="@+id/dialpad_3"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_1"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_2_letters"
style="@style/DialpadLetterStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="ABC"
app:layout_constraintBottom_toTopOf="@+id/dialpad_5"
app:layout_constraintEnd_toStartOf="@+id/dialpad_3"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_1"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_3"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/activity_margin"
android:text="3"
app:layout_constraintBottom_toTopOf="@+id/dialpad_6"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_2"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_3_letters"
style="@style/DialpadLetterStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/activity_margin"
android:text="DEF"
app:layout_constraintBottom_toTopOf="@+id/dialpad_6"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_2"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_4"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_margin"
android:text="4"
app:layout_constraintBottom_toTopOf="@+id/dialpad_7"
app:layout_constraintEnd_toStartOf="@+id/dialpad_5"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_4_letters"
style="@style/DialpadLetterStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_margin"
android:text="GHI"
app:layout_constraintBottom_toTopOf="@+id/dialpad_7"
app:layout_constraintEnd_toStartOf="@+id/dialpad_5"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_5"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="5"
app:layout_constraintBottom_toTopOf="@+id/dialpad_8"
app:layout_constraintEnd_toStartOf="@+id/dialpad_6"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_4"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_5_letters"
style="@style/DialpadLetterStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="JKL"
app:layout_constraintBottom_toTopOf="@+id/dialpad_8"
app:layout_constraintEnd_toStartOf="@+id/dialpad_6"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_4"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_6"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/activity_margin"
android:text="6"
app:layout_constraintBottom_toTopOf="@+id/dialpad_9"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_5"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_6_letters"
style="@style/DialpadLetterStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/activity_margin"
android:text="MNO"
app:layout_constraintBottom_toTopOf="@+id/dialpad_9"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_5"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_7"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_margin"
android:text="7"
app:layout_constraintBottom_toTopOf="@+id/dialpad_asterisk"
app:layout_constraintEnd_toStartOf="@+id/dialpad_8"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_7_letters"
style="@style/DialpadLetterStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_margin"
android:text="PQRS"
app:layout_constraintBottom_toTopOf="@+id/dialpad_asterisk"
app:layout_constraintEnd_toStartOf="@+id/dialpad_8"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_8"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="8"
app:layout_constraintBottom_toTopOf="@+id/dialpad_0_holder"
app:layout_constraintEnd_toStartOf="@+id/dialpad_9"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_7"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_8_letters"
style="@style/DialpadLetterStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="TUV"
app:layout_constraintBottom_toTopOf="@+id/dialpad_0_holder"
app:layout_constraintEnd_toStartOf="@+id/dialpad_9"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_7"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_9"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/activity_margin"
android:text="9"
app:layout_constraintBottom_toTopOf="@+id/dialpad_hashtag"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_8"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_9_letters"
style="@style/DialpadLetterStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/activity_margin"
android:text="WXYZ"
app:layout_constraintBottom_toTopOf="@+id/dialpad_hashtag"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_8"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_asterisk"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_margin"
android:text="*"
app:layout_constraintBottom_toTopOf="@+id/dialpad_call_button"
app:layout_constraintEnd_toStartOf="@+id/dialpad_0_holder"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"/>
<RelativeLayout
android:id="@+id/dialpad_0_holder"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless"
app:layout_constraintBottom_toTopOf="@+id/dialpad_call_button"
app:layout_constraintEnd_toStartOf="@+id/dialpad_hashtag"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_asterisk">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_0"
style="@style/DialpadNumberStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="0"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_plus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/dialpad_0"
android:layout_alignBottom="@+id/dialpad_0"
android:layout_centerHorizontal="true"
android:layout_toEndOf="@+id/dialpad_0"
android:gravity="center"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/small_margin"
android:text="+"
android:textSize="@dimen/actionbar_text_size"/>
</RelativeLayout>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_hashtag"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/activity_margin"
android:text="#"
app:layout_constraintBottom_toTopOf="@+id/dialpad_call_button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_0_holder"/>
app:layout_constraintBottom_toTopOf="@+id/dialpad_call_button" />
<ImageView
android:id="@+id/dialpad_call_button"
@ -334,6 +82,6 @@
android:src="@drawable/ic_phone_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -478,7 +478,7 @@
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_group_vector"/>
android:src="@drawable/ic_people_vector"/>
<LinearLayout
android:id="@+id/contact_groups_holder"

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/group_contacts_coordinator"
android:layout_width="match_parent"
@ -16,13 +15,15 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/activity_margin"
android:alpha="0.8"
android:gravity="center"
android:paddingStart="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/activity_margin"
android:text="@string/no_group_participants"
android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/>
android:textStyle="italic"
android:visibility="gone" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/group_contacts_placeholder_2"
@ -35,7 +36,7 @@
android:padding="@dimen/activity_margin"
android:text="@string/add_contacts"
android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/>
android:visibility="gone" />
<com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/group_contacts_list"
@ -43,7 +44,7 @@
android:layout_height="match_parent"
android:clipToPadding="false"
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" />
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/group_contacts_fastscroller"
@ -53,7 +54,7 @@
android:layout_alignParentRight="true"
android:paddingStart="@dimen/normal_margin">
<include layout="@layout/fastscroller_handle_vertical"/>
<include layout="@layout/fastscroller_handle_vertical" />
</com.simplemobiletools.commons.views.FastScroller>
</RelativeLayout>
@ -64,6 +65,6 @@
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/activity_margin"
android:src="@drawable/ic_plus_vector"/>
android:src="@drawable/ic_plus_vector" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -31,7 +31,7 @@
android:layout_height="@dimen/normal_icon_size"
android:layout_centerVertical="true"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_new_contact_vector" />
android:src="@drawable/ic_add_person_vector" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/new_contact_name"

View File

@ -1,42 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/manage_blocked_numbers_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/manage_blocked_numbers_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:scrollbars="vertical"
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/manage_blocked_numbers_placeholder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:paddingStart="@dimen/big_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/big_margin"
android:text="@string/not_blocking_anyone"
android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/manage_blocked_numbers_placeholder_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/manage_blocked_numbers_placeholder"
android:layout_centerHorizontal="true"
android:background="?attr/selectableItemBackground"
android:gravity="center"
android:padding="@dimen/activity_margin"
android:text="@string/add_a_blocked_number"
android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/>
</RelativeLayout>

View File

@ -10,12 +10,14 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/activity_margin"
android:alpha="0.8"
android:gravity="center"
android:paddingStart="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/activity_margin"
android:text="@string/no_contacts_found"
android:textSize="@dimen/bigger_text_size"
android:textStyle="italic"
android:visibility="gone" />
<com.simplemobiletools.commons.views.MyTextView

View File

@ -288,7 +288,7 @@
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_group_vector"
android:src="@drawable/ic_people_vector"
android:visibility="gone" />
<ImageView

View File

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/notification_holder"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/notification_caller_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/md_grey_black"
android:textSize="@dimen/bigger_text_size"
android:textStyle="bold"
tools:text="Caller name" />
<TextView
android:id="@+id/notification_call_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/notification_caller_name"
android:alpha="0.8"
android:textColor="@color/md_grey_black"
tools:text="123 456 789" />
<ImageView
android:id="@+id/notification_thumbnail"
android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true" />
<LinearLayout
android:id="@+id/notification_actions_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/notification_call_status"
android:layout_marginTop="@dimen/activity_margin"
android:orientation="horizontal">
<ImageView
android:id="@+id/notification_decline_call"
android:layout_width="wrap_content"
android:layout_height="@dimen/call_notification_button_size"
android:layout_weight="1"
android:background="@drawable/ripple_background"
android:src="@drawable/ic_phone_down_red_vector" />
<ImageView
android:id="@+id/notification_accept_call"
android:layout_width="wrap_content"
android:layout_height="@dimen/call_notification_button_size"
android:layout_weight="1"
android:background="@drawable/ripple_background"
android:src="@drawable/ic_phone_green_vector" />
</LinearLayout>
</RelativeLayout>

View File

@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialog_holder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyEditText
android:id="@+id/add_blocked_number_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_margin"
android:layout_marginTop="@dimen/small_margin"
android:layout_marginEnd="@dimen/activity_margin"
android:hint="@string/number"
android:inputType="phone"
android:textCursorDrawable="@null"
android:textSize="@dimen/bigger_text_size"/>
</RelativeLayout>

View File

@ -0,0 +1,268 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/dialpad_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:focusableInTouchMode="true"
tools:ignore="HardcodedText">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_1"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_margin"
android:text="1"
app:layout_constraintBottom_toTopOf="@+id/dialpad_4"
app:layout_constraintEnd_toStartOf="@+id/dialpad_2"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_2"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="2"
app:layout_constraintBottom_toTopOf="@+id/dialpad_5"
app:layout_constraintEnd_toStartOf="@+id/dialpad_3"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_1" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_2_letters"
style="@style/DialpadLetterStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="ABC"
app:layout_constraintBottom_toTopOf="@+id/dialpad_5"
app:layout_constraintEnd_toStartOf="@+id/dialpad_3"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_1" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_3"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/activity_margin"
android:text="3"
app:layout_constraintBottom_toTopOf="@+id/dialpad_6"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_2" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_3_letters"
style="@style/DialpadLetterStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/activity_margin"
android:text="DEF"
app:layout_constraintBottom_toTopOf="@+id/dialpad_6"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_2" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_4"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_margin"
android:text="4"
app:layout_constraintBottom_toTopOf="@+id/dialpad_7"
app:layout_constraintEnd_toStartOf="@+id/dialpad_5"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_4_letters"
style="@style/DialpadLetterStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_margin"
android:text="GHI"
app:layout_constraintBottom_toTopOf="@+id/dialpad_7"
app:layout_constraintEnd_toStartOf="@+id/dialpad_5"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_5"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="5"
app:layout_constraintBottom_toTopOf="@+id/dialpad_8"
app:layout_constraintEnd_toStartOf="@+id/dialpad_6"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_4" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_5_letters"
style="@style/DialpadLetterStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="JKL"
app:layout_constraintBottom_toTopOf="@+id/dialpad_8"
app:layout_constraintEnd_toStartOf="@+id/dialpad_6"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_4" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_6"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/activity_margin"
android:text="6"
app:layout_constraintBottom_toTopOf="@+id/dialpad_9"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_5" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_6_letters"
style="@style/DialpadLetterStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/activity_margin"
android:text="MNO"
app:layout_constraintBottom_toTopOf="@+id/dialpad_9"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_5" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_7"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_margin"
android:text="7"
app:layout_constraintBottom_toTopOf="@+id/dialpad_asterisk"
app:layout_constraintEnd_toStartOf="@+id/dialpad_8"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_7_letters"
style="@style/DialpadLetterStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_margin"
android:text="PQRS"
app:layout_constraintBottom_toTopOf="@+id/dialpad_asterisk"
app:layout_constraintEnd_toStartOf="@+id/dialpad_8"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_8"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="8"
app:layout_constraintBottom_toTopOf="@+id/dialpad_0_holder"
app:layout_constraintEnd_toStartOf="@+id/dialpad_9"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_7" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_8_letters"
style="@style/DialpadLetterStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="TUV"
app:layout_constraintBottom_toTopOf="@+id/dialpad_0_holder"
app:layout_constraintEnd_toStartOf="@+id/dialpad_9"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_7" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_9"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/activity_margin"
android:text="9"
app:layout_constraintBottom_toTopOf="@+id/dialpad_hashtag"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_8" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_9_letters"
style="@style/DialpadLetterStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/activity_margin"
android:text="WXYZ"
app:layout_constraintBottom_toTopOf="@+id/dialpad_hashtag"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_8" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_asterisk"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_margin"
android:text="*"
app:layout_constraintEnd_toStartOf="@+id/dialpad_0_holder"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/dialpad_7" />
<RelativeLayout
android:id="@+id/dialpad_0_holder"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless"
app:layout_constraintEnd_toStartOf="@+id/dialpad_hashtag"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_asterisk"
app:layout_constraintTop_toTopOf="@+id/dialpad_asterisk">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_0"
style="@style/DialpadNumberStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="0" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_plus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/dialpad_0"
android:layout_alignBottom="@+id/dialpad_0"
android:layout_centerHorizontal="true"
android:layout_toEndOf="@+id/dialpad_0"
android:gravity="center"
android:paddingStart="@dimen/small_margin"
android:paddingTop="@dimen/small_margin"
android:text="+"
android:textSize="@dimen/actionbar_text_size" />
</RelativeLayout>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialpad_hashtag"
style="@style/DialpadNumberStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/activity_margin"
android:text="#"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/dialpad_0_holder"
app:layout_constraintTop_toTopOf="@+id/dialpad_0_holder" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<merge
xmlns:android="http://schemas.android.com/apk/res/android"
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<RelativeLayout
@ -13,13 +12,15 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/activity_margin"
android:alpha="0.8"
android:gravity="center"
android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingStart="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/activity_margin"
android:text="@string/no_contacts_found"
android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/>
android:textStyle="italic"
android:visibility="gone" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/fragment_placeholder_2"
@ -32,7 +33,7 @@
android:padding="@dimen/activity_margin"
android:text="@string/change_filter"
android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/>
android:visibility="gone" />
<com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/fragment_list"
@ -40,7 +41,7 @@
android:layout_height="match_parent"
android:clipToPadding="false"
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" />
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/fragment_fastscroller"
@ -49,7 +50,7 @@
android:layout_alignParentEnd="true"
android:paddingStart="@dimen/normal_margin">
<include layout="@layout/fastscroller_handle_vertical"/>
<include layout="@layout/fastscroller_handle_vertical" />
</com.simplemobiletools.commons.views.FastScroller>
</RelativeLayout>
@ -60,6 +61,6 @@
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/activity_margin"
android:src="@drawable/ic_plus_vector"/>
android:src="@drawable/ic_plus_vector" />
</merge>

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<merge
xmlns:android="http://schemas.android.com/apk/res/android"
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<RelativeLayout
@ -13,13 +12,15 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/activity_margin"
android:alpha="0.8"
android:gravity="center"
android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingStart="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/activity_margin"
android:text="@string/no_contacts_found"
android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/>
android:textStyle="italic"
android:visibility="gone" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/fragment_placeholder_2"
@ -32,7 +33,7 @@
android:padding="@dimen/activity_margin"
android:text="@string/change_filter"
android:textSize="@dimen/bigger_text_size"
android:visibility="gone"/>
android:visibility="gone" />
<com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/fragment_list"
@ -40,7 +41,7 @@
android:layout_height="match_parent"
android:clipToPadding="false"
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" />
<com.reddit.indicatorfastscroll.FastScrollerView
android:id="@+id/letter_fastscroller"
@ -67,6 +68,6 @@
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/activity_margin"
android:src="@drawable/ic_plus_vector"/>
android:src="@drawable/ic_plus_vector" />
</merge>

View File

@ -12,16 +12,19 @@
android:id="@+id/contact_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/medium_margin">
android:minHeight="@dimen/min_row_height"
android:paddingStart="@dimen/tiny_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/normal_margin">
<ImageView
android:id="@+id/contact_tmb"
android:layout_width="@dimen/normal_icon_size"
android:layout_height="@dimen/normal_icon_size"
android:layout_centerVertical="true"
android:padding="@dimen/medium_margin"
android:layout_marginStart="@dimen/small_margin"
android:padding="@dimen/tiny_margin"
android:src="@drawable/ic_person_vector" />
<TextView
@ -32,8 +35,8 @@
android:layout_toEndOf="@+id/contact_tmb"
android:ellipsize="end"
android:maxLines="1"
android:paddingStart="@dimen/small_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingEnd="@dimen/activity_margin"
android:textSize="@dimen/bigger_text_size"
tools:text="John Doe" />
@ -47,6 +50,9 @@
android:layout_toEndOf="@+id/contact_tmb"
android:alpha="0.6"
android:maxLines="1"
android:ellipsize="end"
android:paddingStart="@dimen/medium_margin"
android:paddingEnd="@dimen/activity_margin"
android:textSize="@dimen/bigger_text_size"
tools:text="0123 456 789" />

View File

@ -12,16 +12,19 @@
android:id="@+id/contact_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/tiny_margin"
android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/tiny_margin">
android:minHeight="@dimen/min_row_height"
android:paddingStart="@dimen/tiny_margin"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/medium_margin">
<ImageView
android:id="@+id/contact_tmb"
android:layout_width="@dimen/normal_icon_size"
android:layout_height="@dimen/normal_icon_size"
android:layout_centerVertical="true"
android:padding="@dimen/medium_margin"
android:layout_marginStart="@dimen/small_margin"
android:padding="@dimen/tiny_margin"
android:src="@drawable/ic_person_vector" />
<TextView
@ -34,6 +37,8 @@
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:paddingStart="@dimen/medium_margin"
android:paddingEnd="@dimen/activity_margin"
android:textSize="@dimen/big_text_size"
tools:text="John Doe" />

View File

@ -13,9 +13,11 @@
android:id="@+id/contact_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/medium_margin"
android:minHeight="@dimen/min_row_height"
android:paddingStart="@dimen/tiny_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/medium_margin">
android:paddingBottom="@dimen/normal_margin">
<ImageView
android:id="@+id/contact_tmb"
@ -23,7 +25,7 @@
android:layout_height="@dimen/normal_icon_size"
android:layout_centerVertical="true"
android:layout_marginStart="@dimen/small_margin"
android:padding="@dimen/medium_margin"
android:padding="@dimen/tiny_margin"
android:src="@drawable/ic_person_vector" />
<TextView
@ -33,6 +35,8 @@
android:layout_toEndOf="@+id/contact_tmb"
android:ellipsize="end"
android:maxLines="1"
android:paddingStart="@dimen/medium_margin"
android:paddingEnd="@dimen/activity_margin"
android:textSize="@dimen/big_text_size"
tools:text="John Doe" />
@ -44,7 +48,10 @@
android:layout_alignStart="@+id/contact_name"
android:layout_toEndOf="@+id/contact_tmb"
android:alpha="0.6"
android:ellipsize="end"
android:maxLines="1"
android:paddingStart="@dimen/medium_margin"
android:paddingEnd="@dimen/activity_margin"
android:textSize="@dimen/big_text_size"
tools:text="0123 456 789" />

View File

@ -13,9 +13,11 @@
android:id="@+id/contact_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/small_margin"
android:minHeight="@dimen/min_row_height"
android:paddingStart="@dimen/tiny_margin"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/small_margin">
android:paddingBottom="@dimen/medium_margin">
<ImageView
android:id="@+id/contact_tmb"
@ -23,7 +25,7 @@
android:layout_height="@dimen/normal_icon_size"
android:layout_centerVertical="true"
android:layout_marginStart="@dimen/small_margin"
android:padding="@dimen/medium_margin"
android:padding="@dimen/tiny_margin"
android:src="@drawable/ic_person_vector" />
<TextView
@ -35,6 +37,8 @@
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:paddingStart="@dimen/medium_margin"
android:paddingEnd="@dimen/activity_margin"
android:textSize="@dimen/big_text_size"
tools:text="John Doe" />

View File

@ -13,17 +13,20 @@
android:id="@+id/group_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/tiny_margin"
android:minHeight="@dimen/min_row_height"
android:paddingStart="@dimen/tiny_margin"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/tiny_margin">
android:paddingBottom="@dimen/medium_margin">
<ImageView
android:id="@+id/group_tmb"
android:layout_width="@dimen/normal_icon_size"
android:layout_height="@dimen/normal_icon_size"
android:layout_centerVertical="true"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_group_vector" />
android:layout_marginStart="@dimen/small_margin"
android:padding="@dimen/tiny_margin"
android:src="@drawable/ic_people_vector" />
<TextView
android:id="@+id/group_name"
@ -34,6 +37,8 @@
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:paddingStart="@dimen/medium_margin"
android:paddingEnd="@dimen/activity_margin"
android:textSize="@dimen/big_text_size"
tools:text="Family" />

View File

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/manage_blocked_number_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:foreground="@drawable/selector"
android:padding="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/manage_blocked_number_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginTop="@dimen/medium_margin"/>
</RelativeLayout>

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/add_blocked_number"
android:icon="@drawable/ic_plus_vector"
android:title="@string/add_a_blocked_number"
app:showAsAction="ifRoom"/>
</menu>

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">ارسال رسالة الى مجموعة</string>
<string name="send_email_to_group">ارسال بريد الكتروني الى مجموعة</string>
<string name="call_person">Call %s</string>
<string name="request_the_required_permissions">طلب الأذونات المطلوبة</string>
<string name="create_new_contact">إنشاء جهة إتصال</string>
<string name="add_to_existing_contact">إضافة إلى جهة موجودة</string>
<string name="must_make_default_dialer">عليك أن تجعل هذا التطبيق المتصل الإفتراضي للإستفادة من الأرقام المحظورة.</string>
<string name="set_as_default">ضبط الى الافتراضي</string>
<!-- Placeholders -->
<string name="no_contacts_found">لم يتم العثور على جهات اتصال.</string>
<string name="no_contacts_with_emails">لا توجد جهات اتصال بهذا البريد الالكتروني</string>
<string name="no_contacts_with_phone_numbers">لا توجد جهات اتصال بهذا الرقم</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">محاولة تصفية جهات الاتصال المكررة</string>
<string name="manage_shown_tabs">إدارة التابات المعروضة</string>
<string name="contacts">جهات الاتصال</string>
<string name="favorites">المفضلة</string>
<string name="show_call_confirmation_dialog">إظهار مربع حوار تأكيد الاتصال قبل بدء مكالمة</string>
<string name="show_only_contacts_with_numbers">إظهار جهات الإتصال التي لديها أرقام هواتف فقط</string>
<string name="show_dialpad_letters">عرض الحروف على لوحة الاتصال</string>
<!-- Emails -->
<string name="email">البريد الالكتروني</string>
<string name="home">المنزل</string>
<string name="work">العمل</string>
<string name="other">مختلف</string>
<!-- Phone numbers -->
<string name="number">رقم</string>
<string name="mobile">جوال</string>
<string name="main_number">رئيسي</string>
<string name="work_fax">فاكس العمل</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">يبدو أنك لم تضف أية جهة اتصال مفضلة حتى الآن.</string>
<string name="add_favorites">اضافة مفضلة</string>
<string name="add_to_favorites">اضافة الى المفضلة</string>
<string name="remove_from_favorites">ازالة من المفضلة</string>
<string name="must_be_at_edit">يجب أن تكون في شاشة التعديل لتعديل جهة اتصال</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">المتصل</string>
<string name="calling">اتصال</string>
<string name="incoming_call">مكالمة واردة</string>
<string name="incoming_call_from">مكالمة واردة من …</string>
<string name="ongoing_call">مكالمة جارية</string>
<string name="disconnected">انقطع الاتصال</string>
<string name="decline_call">رفض</string>
<string name="answer_call">اجابة</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">البريد الالكتروني</string>
<string name="addresses">العناوين</string>
<string name="events">الأحداث (أعياد الميلاد ، الذكرى السنوية)</string>
<string name="notes">ملاحظات</string>
<string name="organization">منظمة</string>
<string name="websites">المواقع الالكترونية</string>
<string name="groups">مجموعات</string>
<string name="contact_source">مصدر الاتصال</string>
<string name="instant_messaging">المراسلة الفورية (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">إدارة الأرقام المحظورة</string>
<string name="not_blocking_anyone">لم تحظر أي شخص.</string>
<string name="add_a_blocked_number">إضافة رقم محظور</string>
<string name="block_number">حظر رقم</string>
<string name="block_numbers">حظر أرقام</string>
<string name="blocked_numbers">أرقام محظورة</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Are you sure you want to delete %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">The contact will be removed from all contact sources.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -174,10 +155,32 @@
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">An app for managing your contacts without ads, respecting your privacy.</string>
<string name="app_long_description">
A simple app for creating or managing your contacts from any source. The contacts can be stored on your device only, but also synchronized via Google, or other accounts. You can display your favorite contacts on a separate list.
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.
<b>Check out the full suite of Simple Tools here:</b>

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Grupa SMS göndər</string>
<string name="send_email_to_group">Grupa e-poçt göndər</string>
<string name="call_person">%s şəxsinə zng et</string>
<string name="request_the_required_permissions">Lazım olan icazələri istə</string>
<string name="create_new_contact">Create new contact</string>
<string name="add_to_existing_contact">Add to an existing contact</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_as_default">Set as default</string>
<!-- Placeholders -->
<string name="no_contacts_found">No contacts found.</string>
<string name="no_contacts_with_emails">No contacts with emails have been found</string>
<string name="no_contacts_with_phone_numbers">No contacts with phone numbers have been found</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Təkrarlanmış kontaktları filtrləməyə çalış</string>
<string name="manage_shown_tabs">Göstərilən nişanları idarə et</string>
<string name="contacts">Kontaktlar</string>
<string name="favorites">Sevimlilər</string>
<string name="show_call_confirmation_dialog">Zəngə başlamazdan əvvəl zəng təsdiq pəncərəsi göstər</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<string name="show_dialpad_letters">Show letters on the dialpad</string>
<!-- Emails -->
<string name="email">E-poçt</string>
<string name="home">Ev</string>
<string name="work">İş</string>
<string name="other">Başqa</string>
<!-- Phone numbers -->
<string name="number">Nömrə</string>
<string name="mobile">Mobil</string>
<string name="main_number">Əsas</string>
<string name="work_fax">İş Faksı</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Görünür, hələlik heçbir sevimli kontakt əlavə etməmisiniz.</string>
<string name="add_favorites">Sevimlilər əlavə et</string>
<string name="add_to_favorites">Sevimlilərə əlavə et</string>
<string name="remove_from_favorites">Sevimlilərdən sil</string>
<string name="must_be_at_edit">Kontaktı dəyişmək üçün İdarə et ekranında olmalısınız</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Dialer</string>
<string name="calling">Calling</string>
<string name="incoming_call">Incoming call</string>
<string name="incoming_call_from">Incoming call from…</string>
<string name="ongoing_call">Ongoing call</string>
<string name="disconnected">Disconnected</string>
<string name="decline_call">Decline</string>
<string name="answer_call">Answer</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">E-poçtlar</string>
<string name="addresses">Ünvanlar</string>
<string name="events">Hadisələr (ad günləri, il dönümləri)</string>
<string name="notes">Qeydlər</string>
<string name="organization">Təşkilat</string>
<string name="websites">Vebsaytlar</string>
<string name="groups">Qruplar </string>
<string name="contact_source">Kontakt kökü</string>
<string name="instant_messaging">Instant messaging (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Manage blocked numbers</string>
<string name="not_blocking_anyone">You are not blocking anyone.</string>
<string name="add_a_blocked_number">Add a blocked number</string>
<string name="block_number">Block number</string>
<string name="block_numbers">Block numbers</string>
<string name="blocked_numbers">Blocked numbers</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Are you sure you want to delete %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">The contact will be removed from all contact sources.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -174,10 +155,32 @@
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">An app for managing your contacts without ads, respecting your privacy.</string>
<string name="app_long_description">
A simple app for creating or managing your contacts from any source. The contacts can be stored on your device only, but also synchronized via Google, or other accounts. You can display your favorite contacts on a separate list.
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.
<b>Check out the full suite of Simple Tools here:</b>

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Poslat skupině SMS</string>
<string name="send_email_to_group">Poslat skupině e-mail</string>
<string name="call_person">Zavolat %s</string>
<string name="request_the_required_permissions">Vyžádat potřebná oprávnění</string>
<string name="create_new_contact">Vytvořit nový kontakt</string>
<string name="add_to_existing_contact">Přidat k existujícímu kontaktu</string>
<string name="must_make_default_dialer">Pro použití blokování čísel musíte nastavit aplikaci jako výchozí pro správu hovorů.</string>
<string name="set_as_default">Nastavit jako výchozí</string>
<!-- Placeholders -->
<string name="no_contacts_found">Nenalezeny žádné kontakty.</string>
<string name="no_contacts_with_emails">Nenalezeny žádné kontakty s e-maily</string>
<string name="no_contacts_with_phone_numbers">Nenalezeny žádné kontakty s telefonními čísly</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Pokusit se vyfiltrovat duplicitní kontakty</string>
<string name="manage_shown_tabs">Spravovat zobrazené karty</string>
<string name="contacts">Kontakty</string>
<string name="favorites">Oblíbené</string>
<string name="show_call_confirmation_dialog">Před zahájením hovoru zobrazit potvrzovací dialog</string>
<string name="show_only_contacts_with_numbers">Zobrazit jen kontakty s telefonními čísly</string>
<string name="show_dialpad_letters">Zobrazit na číselníku písmena</string>
<!-- Emails -->
<string name="email">E-mail</string>
<string name="home">Domov</string>
<string name="work">Práce</string>
<string name="other">Jiné</string>
<!-- Phone numbers -->
<string name="number">Číslo</string>
<string name="mobile">Mobil</string>
<string name="main_number">Hlavní</string>
<string name="work_fax">Pracovní fax</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Vypadá to, že jste ještě nepřidali žádné oblíbené kontakty.</string>
<string name="add_favorites">Přidat oblíbené</string>
<string name="add_to_favorites">Přidat mezi oblíbené</string>
<string name="remove_from_favorites">Odebrat z oblíbených</string>
<string name="must_be_at_edit">Pro úpravu kontaktu musíte být v Editoru kontaktu</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Telefon</string>
<string name="calling">Vytáčí se</string>
<string name="incoming_call">Příchozí hovor</string>
<string name="incoming_call_from">Příchozí hovor od…</string>
<string name="ongoing_call">Probíhající hovor</string>
<string name="disconnected">Ukončený hovor</string>
<string name="decline_call">Odmítnout</string>
<string name="answer_call">Přijmout</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Rychlé vytáčení</string>
@ -134,23 +125,13 @@
<string name="emails">E-maily</string>
<string name="addresses">Adresy</string>
<string name="events">Události (narozeniny, výročí)</string>
<string name="notes">Poznámky</string>
<string name="organization">Firma</string>
<string name="websites">Webové stránky</string>
<string name="groups">Skupiny</string>
<string name="contact_source">Zdroje kontaktů</string>
<string name="instant_messaging">Rychlé zprávy (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Spravovat blokovaná čísla</string>
<string name="not_blocking_anyone">Neblokujete nikoho.</string>
<string name="add_a_blocked_number">Přidat blokované číslo</string>
<string name="block_number">Blokovat číslo</string>
<string name="block_numbers">Blokovat čísla</string>
<string name="blocked_numbers">Blokovaná čísla</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Opravdu chcete vymazat %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">Kontakt bude vymazán ze všech zdrojů kontaktů.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -174,11 +155,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Jednoduché kontakty Pro - Rychlá správa kontaktů</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Aplikace pro správu vašich kontaktů bez reklam, respektující vaše soukromí.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
Jednoduchá aplikace na vytváření nebo správu vašich kontaktů z různých zdrojů. Mohou být uloženy buď jen ve vašem zařízení, nebo je můžete i synchronizovat přes Google či jiný účet. Své oblíbené položky si můžete zobrazit ve vlastním seznamu.
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.
Můžete ji používat i na správu e-mailů a událostí kontaktů. Nabízí možnost řazení/filtrování pomocí různých parametrů, volitelné je zobrazování příjmení před jménem.
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.
Neobsahuje žádné reklamy, ani nepotřebná oprávnění. Má plně otevřený zdrojový kód a možnost změny barev.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Anfon SMS at grŵp</string>
<string name="send_email_to_group">Anfon ebost at grŵp</string>
<string name="call_person">Galw %s</string>
<string name="request_the_required_permissions">Gofyn am y caniatâd sydd ei angen</string>
<string name="create_new_contact">Creu cyswllt newydd</string>
<string name="add_to_existing_contact">Ychwanegu at gyswllt sy\'n bodoli</string>
<string name="must_make_default_dialer">Rhaid gwneud yr ap hwn yr ap deialu rhagosodedig er mwyn defnyddio rhifau wedi\'u rhwystro.</string>
<string name="set_as_default">Defnyddio fel y rhagosodedig</string>
<!-- Placeholders -->
<string name="no_contacts_found">Ni chanfuwyd unrhyw gysylltiadau.</string>
<string name="no_contacts_with_emails">Ni chanfuwyd unrhyw gysylltiadau gydag ebost</string>
<string name="no_contacts_with_phone_numbers">Ni chanfuwyd unrhyw gysylltiadau gyda rhifau ffôn</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Ceisio canfod a gwaredu cysylltiadau dyblyg</string>
<string name="manage_shown_tabs">Rheoli pa dabiau sy\'n cael eu dangos</string>
<string name="contacts">Cysylltiadau</string>
<string name="favorites">Ffefrynnau</string>
<string name="show_call_confirmation_dialog">Dangos deialog i gadarnhau cyn gwneud galwad</string>
<string name="show_only_contacts_with_numbers">Dangos dim ond cysylltiadau gyda rhifau ffôn</string>
<string name="show_dialpad_letters">Dangos llythrennau ar y pad deialu</string>
<!-- Emails -->
<string name="email">Ebost</string>
<string name="home">Cartref</string>
<string name="work">Gwaith</string>
<string name="other">Arall</string>
<!-- Phone numbers -->
<string name="number">Rhif</string>
<string name="mobile">Symudol</string>
<string name="main_number">Prif</string>
<string name="work_fax">Ffacs gwaith</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Ymddangosir nad wyt wedi ychwanegu unrhyw ffefrynnau eto.</string>
<string name="add_favorites">Ychwanegu ffefrynnau</string>
<string name="add_to_favorites">Ychwanegu i\'r ffefrynnau</string>
<string name="remove_from_favorites">Tynnu o\'r ffefrynnau</string>
<string name="must_be_at_edit">Rhaid bod ar y sgrin golygu er mwyn addasu cyswllt</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Deialydd</string>
<string name="calling">Yn galw</string>
<string name="incoming_call">Galwad i mewn</string>
<string name="incoming_call_from">Galwad i mewn oddi wrth…</string>
<string name="ongoing_call">Galwad ar y gweill</string>
<string name="disconnected">Datgysylltwyd</string>
<string name="decline_call">Gwrthod</string>
<string name="answer_call">Ateb</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">Cyfeiriadau ebost</string>
<string name="addresses">Cyfeiriadau</string>
<string name="events">Digwyddiadau (e.e. pen-blwyddi)</string>
<string name="notes">Nodiadau</string>
<string name="organization">Sefydliad</string>
<string name="websites">Gwefannau</string>
<string name="groups">Grwpiau</string>
<string name="contact_source">Ffynhonnell gyswllt</string>
<string name="instant_messaging">Negesu ar unwaith (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Rheoli rhifau wedi\'u rhwystro</string>
<string name="not_blocking_anyone">Nid wyt yn rhwystro unrhyw un.</string>
<string name="add_a_blocked_number">Ychwanegu rif i\'w rwystro</string>
<string name="block_number">Rhwystro rhif</string>
<string name="block_numbers">Rhwystro rhifau</string>
<string name="blocked_numbers">Rhifau wedi\'u rhwystro</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Are you sure you want to delete %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">The contact will be removed from all contact sources.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Manage your contacts easily</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Ap i reoli dy gysylltiadau, heb hysbysebion, gan barchu dy breifatrwydd.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
Ap syml i greu neu reoli dy gysylltiadau o unrhyw ffynhonnell. Caiff y cysylltiadau eu cadw ar dy ddyfais yn unig, ond mae hefyd yn bosib eu cysoni gyda Google neu gyfrifon eraill. Gellir golygu dy hoff gysylltiadau mewn rhestr ar wahân.
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.
Gellir ei ddefnyddio i reoli cyfeiriadau e-bost defnyddwyr a digwyddiadau hefyd. Mae ganddo\'r gallu i drefnu mewn gwahanol ffyrdd ac i ddangos enwau gyda\'r cyfenw gyntaf os yw\'n well gennyt.
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.
Does dim hysbysebion na dim angen arno unrhyw ganiatâd diangen. Mae\'n gwbl cod agored ac mae modd addasu lliwiau\'r ap.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Send SMS til gruppe</string>
<string name="send_email_to_group">Send email til gruppe</string>
<string name="call_person">Ring til %s</string>
<string name="request_the_required_permissions">Anmod om de krævede tilladelser</string>
<string name="create_new_contact">Opret ny kontakt</string>
<string name="add_to_existing_contact">Tilføj til en eksisterende kontakt</string>
<string name="must_make_default_dialer">Du skal gøre denne app til standardopkaldsappen for at gøre brug af blokerede numre.</string>
<string name="set_as_default">Gør til standard</string>
<!-- Placeholders -->
<string name="no_contacts_found">Ingen kontakter fundet.</string>
<string name="no_contacts_with_emails">Ingen kontakter med emails fundet</string>
<string name="no_contacts_with_phone_numbers">Ingen kontakter med telefonnumre fundet</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Prøv at filtrere dupletter</string>
<string name="manage_shown_tabs">Administrer viste faner</string>
<string name="contacts">Kontakter</string>
<string name="favorites">Favoritter</string>
<string name="show_call_confirmation_dialog">Vis en opkaldsbekræftelsesdialog før du starter et opkald</string>
<string name="show_only_contacts_with_numbers">Vis kun kontakter med telefonnumre</string>
<string name="show_dialpad_letters">Vis bogstaver på tastaturet</string>
<!-- Emails -->
<string name="email">Email</string>
<string name="home">Hjem</string>
<string name="work">Arbejde</string>
<string name="other">Andet</string>
<!-- Phone numbers -->
<string name="number">Nummer</string>
<string name="mobile">Mobil</string>
<string name="main_number">Hovednummer</string>
<string name="work_fax">Arbejdsfax</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Det ser ud til, at du ikke har tilføjet nogen favoritkontakter endnu.</string>
<string name="add_favorites">Tilføj favoritter</string>
<string name="add_to_favorites">Tilføj til favoritter</string>
<string name="remove_from_favorites">Fjern fra favoritter</string>
<string name="must_be_at_edit">Du skal være på skærmen Rediger for at ændre en kontakt</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Dialer</string>
<string name="calling">Ringer</string>
<string name="incoming_call">Indkommende opkald call</string>
<string name="incoming_call_from">Indkommende opkald fra…</string>
<string name="ongoing_call">Igangværende opkald</string>
<string name="disconnected">Afbrudt</string>
<string name="decline_call">Afvis</string>
<string name="answer_call">Besvar</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">Emails</string>
<string name="addresses">Adresser</string>
<string name="events">Begivenheder (fødselsdage, årsdage)</string>
<string name="notes">Noter</string>
<string name="organization">Organisation</string>
<string name="websites">Hjemmesider</string>
<string name="groups">Groupper</string>
<string name="contact_source">Kontaktkilde</string>
<string name="instant_messaging">Instant messaging (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Administrér blokerede numre</string>
<string name="not_blocking_anyone">Du blokerer ikke nogen</string>
<string name="add_a_blocked_number">Tilføj et blokeret nummer</string>
<string name="block_number">Blokér nummer</string>
<string name="block_numbers">Blokér numre</string>
<string name="blocked_numbers">Blokerede numre</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Are you sure you want to delete %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">The contact will be removed from all contact sources.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Manage your contacts easily</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">En app til dine kontakter, uden annoncer og med respekt for dit privatliv.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
En simpel app til at oprette eller administrere dine kontakter fra enhver kilde. Kontakterne kan gemmes kun på din enhed, eller synkroniseres via Google eller andre konti. Du kan vise dine foretrukne kontakter på en separat liste.
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.
Du kan også bruge den til at styre bruger-emails og begivenheder. Den har muligheden for at sortere / filtrere efter flere parametre, og vise efternavn eller fornavn først.
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.
Indeholder ingen annoncer eller unødvendige tilladelser. Det er fuldstændigt opensource. Appens farver kan tilpasses.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">SMS an Gruppe senden</string>
<string name="send_email_to_group">E-Mail an Gruppe senden</string>
<string name="call_person">%s anrufen</string>
<string name="request_the_required_permissions">Benötigte Berechtigungen anfordern</string>
<string name="create_new_contact">Neuen Kontakt erstellen</string>
<string name="add_to_existing_contact">Zu einem existierenden Kontakt hinzufügen</string>
<string name="must_make_default_dialer">Du musst diese App als Standardtelefonie-App einstellen, um Nummern blockieren zu können.</string>
<string name="set_as_default">Als Standard auswählen</string>
<!-- Placeholders -->
<string name="no_contacts_found">Keine Kontakte gefunden.</string>
<string name="no_contacts_with_emails">Keine Kontakte mit E-Mailadressen gefunden</string>
<string name="no_contacts_with_phone_numbers">Keine Kontakte mit Telefonnummern gefunden</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Versucht Kontaktduplikate herauszufiltern</string>
<string name="manage_shown_tabs">Anzuzeigende Tabs festlegen</string>
<string name="contacts">Kontakte</string>
<string name="favorites">Favoriten</string>
<string name="show_call_confirmation_dialog">Bestätigungsdialog zeigen, bevor ein Anruf durchgeführt wird</string>
<string name="show_only_contacts_with_numbers">Nur Kontakte mit Telefonnummern anzeigen</string>
<string name="show_dialpad_letters">Buchstaben im Wahlfeld anzeigen</string>
<!-- Emails -->
<string name="email">E-Mail</string>
<string name="home">Privat</string>
<string name="work">Arbeit</string>
<string name="other">Sonstiges</string>
<!-- Phone numbers -->
<string name="number">Nummer</string>
<string name="mobile">Mobil</string>
<string name="main_number">Festnetz</string>
<string name="work_fax">Arbeit Fax</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Anscheinend haben Sie bisher keine Kontakte zu den Favoriten hinzugefügt.</string>
<string name="add_favorites">Favoriten hinzufügen</string>
<string name="add_to_favorites">Zu Favoriten hinzufügen</string>
<string name="remove_from_favorites">Aus Favoriten entfernen</string>
<string name="must_be_at_edit">Sie müssen sich im Bearbeitungsmodus befinden, um einen Kontakt zu bearbeiten.</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Dialer</string>
<string name="calling">Anrufaufbau</string>
<string name="incoming_call">Eingehender Anruf</string>
<string name="incoming_call_from">Eingehender Anruf von…</string>
<string name="ongoing_call">Laufender Anruf</string>
<string name="disconnected">Getrennt</string>
<string name="decline_call">Ablehnen</string>
<string name="answer_call">Antworten</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">E-Mails</string>
<string name="addresses">Adressen</string>
<string name="events">Termine (Geburtstage, Jahrestage)</string>
<string name="notes">Notizen</string>
<string name="organization">Organisation</string>
<string name="websites">Webseiten</string>
<string name="groups">Gruppen</string>
<string name="contact_source">Kontaktquelle</string>
<string name="instant_messaging">Instant messaging (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Blockierte Nummern verwalten</string>
<string name="not_blocking_anyone">Du blockierst niemanden.</string>
<string name="add_a_blocked_number">Eine blockierte Nummer hinzufügen</string>
<string name="block_number">Nummer blockieren</string>
<string name="block_numbers">Nummern blockieren</string>
<string name="blocked_numbers">Blockierte Nummern</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Sind Sie sicher, dass Sie %s löschen wollen?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">Der Kontakt wird von allen Kontaktquellen entfernt.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Schlichte Kontakte Pro - Mühlose Kontaktverwaltung</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Verwaltet Ihre Kontakte ohne Werbeanzeigen und respektiert Ihre Privatsphäre.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
Eine einfache App, mit der Sie Kontakte erstellen oder von jeder Quelle verwalten können. Die Kontakte können entweder nur auf Ihrem Gerät gespeichert, oder mittels Google oder anderer Konten synchronisiert werden. Sie können Ihre Lieblingskontake in einer separaten Liste anzeigen.
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.
Sie können es auch zur Verwaltung von Nutzer-E-Mails und Ereignisse nutzen. Es kann nach mehreren Parametern sortieren oder filtern, oder optional den Nachnamen zuerst anzeigen.
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.
Enthält keine Werbung oder unnötige Berechtigungen. Vollständig quelloffen. Die Farben sind anpassbar.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Αποστολή SMS σε ομάδες</string>
<string name="send_email_to_group">Αποστολή email σε ομάδες</string>
<string name="call_person">Κλήση %s</string>
<string name="request_the_required_permissions">Ζητούνται τα απαιτούμενα δικαιώματα</string>
<string name="create_new_contact">Δημιουργία νέας Επαφής</string>
<string name="add_to_existing_contact">Προσθήκη σε μια υπάρχουσα Επαφή</string>
<string name="must_make_default_dialer">Θα πρέπει να οριστεί προεπιλεγμένη εφαρμογή για χρησιμοποίηση αποκλεισμένων αριθμών.</string>
<string name="set_as_default">Ορισμός ως προεπιλογής</string>
<!-- Placeholders -->
<string name="no_contacts_found">Δεν βρέθηκαν Επαφές.</string>
<string name="no_contacts_with_emails">Δεν βρέθηκαν Επαφές με emails</string>
<string name="no_contacts_with_phone_numbers">Δεν βρέθηκαν Επαφές με αριθμό τηλεφώνου</string>
@ -38,7 +34,7 @@
<string name="no_groups">Δεν υπάρχουν ομάδες</string>
<string name="create_new_group">Δημιουργία νέας ομάδας</string>
<string name="remove_from_group">Αφαίρεση από ομάδα</string>
<string name="no_group_participants">Η ομάδα είναι άδεια</string>
<string name="no_group_participants">Η ομάδα είναι κενή</string>
<string name="add_contacts">Προσθήκη επαφών</string>
<string name="no_group_created">Δεν υπάρχουν ομάδες επαφών στη συσκευή</string>
<string name="create_group">Δημιουργία ομάδας</string>
@ -59,22 +55,19 @@
<string name="call_contact">Κλήση επαφής</string>
<string name="view_contact">Εμφάνιση λεπτομερειών επαφής</string>
<string name="manage_shown_contact_fields">Διαχείριση εμφανιζόμενων πεδίων επαφής</string>
<string name="filter_duplicates">Δοκιμάστε το φιλτράρισμα διπλών επαφών</string>
<string name="filter_duplicates">Δοκιμάστε το φιλτράρισμα διπλότυπων επαφών</string>
<string name="manage_shown_tabs">Διαχείριση εμφανιζόμενων καρτελών</string>
<string name="contacts">Επαφές</string>
<string name="favorites">Αγαπημένες</string>
<string name="show_call_confirmation_dialog">Εμφάνιση διαλόγου επιβεβαίωσης πριν από την έναρξη μιας κλήσης</string>
<string name="show_only_contacts_with_numbers">Προβολή όλων των Επαφών με αριθμούς τηλεφώνου</string>
<string name="show_dialpad_letters">Εμφάνιση γραμμάτων στην πληκτρολόγιο</string>
<!-- Emails -->
<string name="email">Email</string>
<string name="home">Οικία</string>
<string name="work">Εργασία</string>
<string name="other">Άλλο</string>
<!-- Phone numbers -->
<string name="number">Αριθμός</string>
<string name="mobile">Κινητό</string>
<string name="main_number">Κύριο</string>
<string name="work_fax">Φαξ Εργασίας</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Φαίνεται ότι δεν έχετε προσθέσει αγαπημένες επαφές ακόμη.</string>
<string name="add_favorites">Προσθήκη αγαπημένων</string>
<string name="add_to_favorites">Προσθήκη στις αγαπημένες</string>
<string name="remove_from_favorites">Αφαίρεση από τα αγαπημένα</string>
<string name="must_be_at_edit">Πρέπει να είστε στην οθόνη "Επεξεργασία" για να τροποποιήσετε μια επαφή</string>
<!-- Search -->
@ -103,7 +93,7 @@
<string name="export_contacts">Εξαγωγή επαφών</string>
<string name="import_contacts_from_vcf">Εισαγωγή επαφών από .vcf αρχείο</string>
<string name="export_contacts_to_vcf">Εξαγωγή επαφών σε .vcf αρχείο</string>
<string name="target_contact_source">Πηγή επαφής προορισμού</string>
<string name="target_contact_source">Προορισμός πηγής επαφής</string>
<string name="include_contact_sources">Συμπερίληψη πηγών επαφών</string>
<string name="filename_without_vcf">Όνομα αρχείου (χωρίς .vcf)</string>
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Πληκτρολόγιο</string>
<string name="calling">Κλήση</string>
<string name="incoming_call">Εισερχόμενη κλήση</string>
<string name="incoming_call_from">Εισερχόμενη κλήση απο…</string>
<string name="ongoing_call">Εξερχόμενη κλήση</string>
<string name="disconnected">Αποσύνδεση</string>
<string name="decline_call">Άρνηση</string>
<string name="answer_call">Απάντηση</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Ταχεία Κλήση</string>
@ -134,23 +125,13 @@
<string name="emails">Emails</string>
<string name="addresses">Διευθύνσεις</string>
<string name="events">Εκδηλώσεις (γενέθλια, επετείους)</string>
<string name="notes">Σημειώσεις</string>
<string name="organization">Εταιρεία</string>
<string name="websites">Ιστοσελίδα</string>
<string name="groups">Ομάδες</string>
<string name="contact_source">Προέλευση επαφής</string>
<string name="instant_messaging">Αμεσο μήνυμα (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Διαχείρηση αποκλεισμένων αριθμών</string>
<string name="not_blocking_anyone">Χωρίς αποκλεισμο κανενός.</string>
<string name="add_a_blocked_number">Προσθήκη ένος αποκλεισμένου αριθμού</string>
<string name="block_number">Αποκλεισμό αριθμού</string>
<string name="block_numbers">Αποκλεισμό αριθμών</string>
<string name="blocked_numbers">Αποκλεισμένοι αριθμοί</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Θέλετε σίγουρα να διαγράψετε %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">Η επαφή θα καταργηθεί από όλες τις πηγές επαφών.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Απλές Επαφές Pro - Εύκολη διαχείριση Επαφών</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Μια εφαρμογή για τις Επαφές σας χωρίς διαφημίσεις, σεβόμενη το απόρρητό σας.</string>
<string name="app_short_description">Εύκολη και γρήγορη διαχείριση ομάδων &amp; αγαπημένων επαφών χωρίς διαφημίσεις.</string>
<string name="app_long_description">
Μια απλή εφαρμογή για δημιουργία και διαχείριση των επαφών σου από κάθε πηγή. Οι επαφές μπορεί να είναι αποθηκευμένες μόνο στη συσκευή σου, αλλά μπορούν να συγχρονίζονται στο Google, ή σε κάποιο άλλο λογαριασμό. Μπορείς να εμφανίσεις τις αγαπημένες σου επαφές σε ξεχωριστή λίστα.
Μια ελαφριά εφαρμογή διαχείρισης των επαφών σας που αγαπήθηκε από εκατομμύρια χρήστες. Οι επαφές μπορούν να αποθηκευτούν μόνο στη συσκευή σας, αλλά και να συγχρονιστούν μέσω της Google ή άλλων λογαριασμών.
Μπορείτε να τη χρησιμοποιήσετε για τη διαχείριση των email και εκδηλώσεων επίσης. Έχει τη δυνατότητα ταξινόμησης/φιλτραρίσματος με διάφορες παραμέτρους, προαιρετικά να εμφανίζεται το επώνυμο πρώτα ή το όνομα.
Μπορείτε να την χρησιμοποιήσετε και για τη διαχείριση email και συμβάντων χρήστη. Έχει τη δυνατότητα ταξινόμισης/φιλτραρίσματος με πολλές παραμέτρους, προαιρετικά εμφανίζει το επώνυμο ως πρώτο όνομα.
Μπορείτε να εμφανίσετε τις αγαπημένες σας επαφές ή ομάδες σε ξεχωριστή λίστα. Οι ομάδες μπορούν να χρησιμοποιηθούν για την αποστολή ομαδικών μηνυμάτων email ή SMS, για να εξοικονομήσετε χρόνο, καθώς &amp; για εύκολη μετονομασία.
Περιέχει εύχρηστα πλήκτρα στις κλήσεις ή προς αποστολή μηνυμάτων στις επαφές σας. Όλα τα ορατά πεδία μπορούν να προσαρμοστούν όπως επιθυμείτε, μπορείτε εύκολα να αποκρύψετε τα μη χρησιμοποιούμενα. Η λειτουργία Αναζήτηση θα βρεί την συμβολοσειρά σε κάθε ορατό πεδίο επαφής για να σας βοηθήσει στον εύκολο εντοπισμό της επιθυμητής επαφής.
Υπάρχει και ένα ελαφρύ πληκτρολόγιο κλήσης στην διάθεσή σας, με προτάσεις έξυπνων επαφών.
Υποστηρίζει την εξαγωγή/εισαγωγή επαφών σε μορφή vCard σε αρχεία .vcf, για εύκολη μεταφορά ή δημιουργία αντιγράφων ασφαλείας των δεδομένων σας.
Με αυτόν τον σύγχρονο &amp; σταθερό διαχειριστή επαφών μπορείτε να προστατέψετε τις επαφές σας χωρίς να τις μοιραστείτε με άλλες εφαρμογές, ώστε να διατηρήσετε τις επαφές σας ιδιωτικές.
Όπως και στη πηγή επαφών, μπορείτε επίσης να αλλάξετε εύκολα το όνομα της επαφής, το email, τον αριθμό τηλεφώνου, τη διεύθυνση, τον οργανισμό, τις ομάδες και πολλά άλλα προσαρμόσιμα πεδία. Μπορείτε να την χρησιμοποιήσετε και για την αποθήκευση συμβάντων επαφής, όπως γενέθλια, επετείους ή άλλα προσαρμόσιμα.
Αυτό το απλό πρόγραμμα επεξεργασίας επαφών έχει πολλές εύχρηστες ρυθμίσεις, όπως εμφάνιση αριθμών τηλεφώνου στην κύρια οθόνη, εναλλαγή προβολής μικρογραφιών επαφών, εμφάνιση μόνο επαφών με αριθμούς τηλεφώνου, εμφάνιση διαλόγου επιβεβαίωσης κλήσης πριν την εκκίνηση μιας κλήσης. Έρχεται επίσης με Ταχεία κλήση χρησιμοποιώντας γράμματα.
Για περαιτέρω βελτίωση της εμπειρίας χρήστη, μπορείτε να προσαρμόσετε τις ενέργειες που θα γίνονται κάνοντας κλικ σε μια επαφή. Μπορείτε είτε να ξεκινήσετε μια κλήση, να μεταβείτε στην οθόνη, Προβολή λεπτομερειών, ή να επεξεργαστείτε την επιλεγμένη επαφή.
Μπορείτε εύκολα να αποκλείσετε αριθμούς τηλεφώνου για να αποφύγετε ανεπιθύμητες εισερχόμενες κλήσεις.
Για αποφυγή προβολής πιθανών ανεπιθύμητων επαφών, διαθέτει μια ισχυρή ενσωματωμένη συγχώνευση διπλότυπων επαφών.
Διατίθεται με σχεδίαση υλικού με σκούρο θέμα από προεπιλογή, παρέχει εξαιρετική εμπειρία χρήστη για εύκολη χρήση. Η έλλειψη πρόσβασης στο διαδίκτυο σας παρέχει περισσότερο απόρρητο, ασφάλεια και σταθερότητα από ότι άλλες εφαρμογές.
Δεν περιέχει διαφημίσεις ή περιττές άδειες. Έιναι όλη ανοιχτού κώδικα και παρέχει προσαρμόσιμα χρώματα για την εφαρμογή.

View File

@ -2,8 +2,8 @@
<string name="app_name">Simple Contacts</string>
<string name="app_launcher_name">Contactos</string>
<string name="address">Dirección</string>
<string name="inserting">Insertando...</string>
<string name="updating">Actualizando...</string>
<string name="inserting">Insertando</string>
<string name="updating">Actualizando</string>
<string name="phone_storage">Almacenamiento del teléfono</string>
<string name="phone_storage_hidden">Almacenamiento del teléfono (No visible para otras aplicaciones)</string>
<string name="company">Compañía</string>
@ -14,14 +14,10 @@
<string name="send_sms_to_group">Enviar SMS a grupo</string>
<string name="send_email_to_group">Enviar correo electrónico a grupo</string>
<string name="call_person">Llamar a %s</string>
<string name="request_the_required_permissions">Solicitar los permisos requeridos</string>
<string name="create_new_contact">Crear nuevo contacto</string>
<string name="add_to_existing_contact">Añadir a un contacto existente</string>
<string name="must_make_default_dialer">Tienes que hacer esta aplicación la aplicación de marcación por defecto para hacer uso de los números bloqueados.</string>
<string name="set_as_default">Establecer como por defecto</string>
<!-- Placeholders -->
<string name="no_contacts_found">No se encontraron contactos.</string>
<string name="no_contacts_with_emails">No se encontraron contactos con correo electrónico</string>
<string name="no_contacts_with_phone_numbers">No se encontraron contactos con número de teléfono</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Intentar foltrar contactos duplicados</string>
<string name="manage_shown_tabs">Administrar pestañas mostradas</string>
<string name="contacts">Contactos</string>
<string name="favorites">Favoritos</string>
<string name="show_call_confirmation_dialog">Mostrar un cuadro de confirmación antes de iniciar una llamada</string>
<string name="show_only_contacts_with_numbers">Solo mostrar contactos con números telefónicos</string>
<string name="show_dialpad_letters">Mostrar letras en el teclado de marcación</string>
<!-- Emails -->
<string name="email">Correo electrónico</string>
<string name="home">Casa</string>
<string name="work">Trabajo</string>
<string name="other">Otros</string>
<!-- Phone numbers -->
<string name="number">Número</string>
<string name="mobile">Celular</string>
<string name="main_number">Principal</string>
<string name="work_fax">Fax de trabajo</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Parece que aún no has añadido ningún contacto favorito.</string>
<string name="add_favorites">Añadir favoritos</string>
<string name="add_to_favorites">Añadir a favoritos</string>
<string name="remove_from_favorites">Eliminar de favoritos</string>
<string name="must_be_at_edit">Debes estar en la Pantalla de Edición para modificar un contacto</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Marcador</string>
<string name="calling">Llamando</string>
<string name="incoming_call">Llamada entrante</string>
<string name="incoming_call_from">Llamada entrante desde…</string>
<string name="ongoing_call">Llamada en curso</string>
<string name="disconnected">Desconectado</string>
<string name="decline_call">Rechazar</string>
<string name="answer_call">Contestar</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">Correos electrónicos</string>
<string name="addresses">Direcciones</string>
<string name="events">Eventos (Cumpleaños, aniversarios)</string>
<string name="notes">Notas</string>
<string name="organization">Organización</string>
<string name="websites">Sitios web</string>
<string name="groups">Grupos</string>
<string name="contact_source">Orígenes de contacto</string>
<string name="instant_messaging">Mensaje instantáneo (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Administrar números bloqueados</string>
<string name="not_blocking_anyone">Aún no has bloqueado a nadie.</string>
<string name="add_a_blocked_number">Añadir un número bloqueado</string>
<string name="block_number">Bloquear número</string>
<string name="block_numbers">Bloquear números</string>
<string name="blocked_numbers">Números bloqueados</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">¿Estás seguro que quieres eliminar %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">El contacto será eliminado de todos los orígenes de contactos.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Administra tus contactos</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Una app para administrar tus contactos sin anuncios, respetando tu privacidad.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
Una aplicación simple para crear o administrar tus contactos desde cualquier origen. Los contactos pueden ser almacenados solo en tu dispositivo, o también sincronizarlos vía Google u otras cuentas.Puedes mostrar tus contactos favoritos en una lista separada.
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.
Puedes usarla para administrar correos electrónicos y eventos. Tiene la capacidad de ordenar/filtrar por multiples parámetros, opcionalmente, mostrar apellido como el primer nombre.
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.
No contiene anuncios o permisos innecesarios. Es complétamente de código abierto, provee colores personalziables.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Bidali SMSa taldera</string>
<string name="send_email_to_group">Bidali emaila taldeari</string>
<string name="call_person">%s deitu</string>
<string name="request_the_required_permissions">Eskatu beharrezko baimenak</string>
<string name="create_new_contact">Create new contact</string>
<string name="add_to_existing_contact">Add to an existing contact</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_as_default">Set as default</string>
<!-- Placeholders -->
<string name="no_contacts_found">No contacts found.</string>
<string name="no_contacts_with_emails">No contacts with emails have been found</string>
<string name="no_contacts_with_phone_numbers">No contacts with phone numbers have been found</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Saiatu bikoiztutako kontaktuak iragazten</string>
<string name="manage_shown_tabs">Kudeatu erakutsitako fitxak</string>
<string name="contacts">Kontaktuak</string>
<string name="favorites">Gogokoak</string>
<string name="show_call_confirmation_dialog">Erakutsi egiaztatze mezua dei bat hasi baino lehen</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<string name="show_dialpad_letters">Show letters on the dialpad</string>
<!-- Emails -->
<string name="email">Emaila</string>
<string name="home">Etxea</string>
<string name="work">Lana</string>
<string name="other">Besterik</string>
<!-- Phone numbers -->
<string name="number">Zenbakia</string>
<string name="mobile">Mugikorra</string>
<string name="main_number">Nagusia</string>
<string name="work_fax">Laneko faxa</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Ez duzu oraindik gogokorik gehitu.</string>
<string name="add_favorites">Gehitu gogokoak</string>
<string name="add_to_favorites">Gehitu gogokoen zerrendara</string>
<string name="remove_from_favorites">Kendu gogokoenetik</string>
<string name="must_be_at_edit">Kontaktu bat aldatzeko edizio pantailan egon behar zara</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Dialer</string>
<string name="calling">Calling</string>
<string name="incoming_call">Incoming call</string>
<string name="incoming_call_from">Incoming call from…</string>
<string name="ongoing_call">Ongoing call</string>
<string name="disconnected">Disconnected</string>
<string name="decline_call">Decline</string>
<string name="answer_call">Answer</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">Emailak</string>
<string name="addresses">Helbideak</string>
<string name="events">Ekitaldiak (urtebetetzeak, urteurrenak)</string>
<string name="notes">Oharrak</string>
<string name="organization">Erakundea</string>
<string name="websites">Webguneak</string>
<string name="groups">Taldeak</string>
<string name="contact_source">Kontaktu jatorria</string>
<string name="instant_messaging">Instant messaging (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Manage blocked numbers</string>
<string name="not_blocking_anyone">You are not blocking anyone.</string>
<string name="add_a_blocked_number">Add a blocked number</string>
<string name="block_number">Block number</string>
<string name="block_numbers">Block numbers</string>
<string name="blocked_numbers">Blocked numbers</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Are you sure you want to delete %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">The contact will be removed from all contact sources.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -174,9 +155,31 @@
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">An app for managing your contacts without ads, respecting your privacy.</string>
<string name="app_long_description">
Aplikazio sinplea kontaktuak sortu eta kudeatzeko. Kontaktuak zure gailuan baino esin dira gorde, baina sinkronizagarriak dira Google-n edo beste kontuen bitartez. Zure kontaktu gogokoenak zerrenda banandu batean erakutsi ditzakezu.
Erabiltzaileen emailak eta ekitaldiak kudeatzeko erabili dezakezu ere. Aukera duzu parametro askoren arabera sailkatzeko, tartean abizena izen gisa erakustea.
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.
Ez ditu iragarkirik ezta beharrezkoak ez diren baimenak. Guztiz kode irekikoa da eta koloreak pertsonalizagarriak dira. Aplikazio hau sorta handiago bateko zati bat baino ez da.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Lähetä tekstiviesti ryhmälle</string>
<string name="send_email_to_group">Lähetä sähköposti ryhmälle</string>
<string name="call_person">Soita</string>
<string name="request_the_required_permissions">Pyydä tarvittavia oikeuksia</string>
<string name="create_new_contact">Luo uusi kontakti</string>
<string name="add_to_existing_contact">Lisää olemassa olevaan kontaktiin</string>
<string name="must_make_default_dialer">Soittajan täytyy olla oletus</string>
<string name="set_as_default">Aseta oletukseksi</string>
<!-- Placeholders -->
<string name="no_contacts_found">Kontakteja ei löytynyt.</string>
<string name="no_contacts_with_emails">Sähköpostillisia kontakteja ei löytynyt</string>
<string name="no_contacts_with_phone_numbers">Puhelinnumerollisia kontakteja ei löytynyt</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Suodata kaksoiskappaleet</string>
<string name="manage_shown_tabs">Muuta näytettyjä palkkeja</string>
<string name="contacts">Kontaktit</string>
<string name="favorites">Suosikit</string>
<string name="show_call_confirmation_dialog">Näytä puhelun vahvistusruutu</string>
<string name="show_only_contacts_with_numbers">Näytä ainoastaan numerolliset kontaktit</string>
<string name="show_dialpad_letters">Näytä kirjaimet puhelimessa</string>
<!-- Emails -->
<string name="email">Sähköposti</string>
<string name="home">Koti</string>
<string name="work">Työ</string>
<string name="other">Muu</string>
<!-- Phone numbers -->
<string name="number">Numero</string>
<string name="mobile">Mobiili</string>
<string name="main_number">Päänumero</string>
<string name="work_fax">Työ faxi</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Ei suosikkeja</string>
<string name="add_favorites">Lisää suosikkeja</string>
<string name="add_to_favorites">Lisää suosikkeihin</string>
<string name="remove_from_favorites">Poista suosikeista</string>
<string name="must_be_at_edit">Täytyy olla muokkauksessa</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Vastaaja</string>
<string name="calling">Soitaa</string>
<string name="incoming_call">Tuleva puhelu</string>
<string name="incoming_call_from">Tuleva puhelu: </string>
<string name="ongoing_call">Puhelu kesken</string>
<string name="disconnected">Katkaistu</string>
<string name="decline_call">Hylkää puhelu</string>
<string name="answer_call">Vastaa puheluun</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">Sähköpostit</string>
<string name="addresses">Osoitteet</string>
<string name="events">Tapahtumat</string>
<string name="notes">Muistiinpanot</string>
<string name="organization">Järjestö</string>
<string name="websites">Internetsivut</string>
<string name="groups">Ryhmät</string>
<string name="contact_source">Kontaktin lähde</string>
<string name="instant_messaging">Pikaviestin</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Muuta estettyjä numeroita</string>
<string name="not_blocking_anyone">Et estä ketään.</string>
<string name="add_a_blocked_number">Lisää estetty numero</string>
<string name="block_number">Estä numero</string>
<string name="block_numbers">Estä numeroja</string>
<string name="blocked_numbers">Estetyt numerot</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Are you sure you want to delete %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">The contact will be removed from all contact sources.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,12 +153,34 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Manage your contacts easily</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">An app for managing your contacts without ads, respecting your privacy.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
A simple app for creating or managing your contacts from any source. The contacts can be stored on your device only, but also synchronized via Google, or other accounts. You can display your favorite contacts on a separate list.
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.
<b>Check out the full suite of Simple Tools here:</b>

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Envoyer un SMS au groupe</string>
<string name="send_email_to_group">Envoyer un courriel au groupe</string>
<string name="call_person">Appeler %s</string>
<string name="request_the_required_permissions">Demander les autorisations nécessaires</string>
<string name="create_new_contact">Créer un nouveau contact</string>
<string name="add_to_existing_contact">Ajouter à un contact existant</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_as_default">Set as default</string>
<!-- Placeholders -->
<string name="no_contacts_found">Aucun contact n\'a été trouvé.</string>
<string name="no_contacts_with_emails">Aucun contact avec une adresse de courriel n\'a été trouvé</string>
<string name="no_contacts_with_phone_numbers">Aucun contact avec un numéro de téléphone n\'a été trouvé</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Essayez de filtrer les contacts en double</string>
<string name="manage_shown_tabs">Gérer les onglets affichés</string>
<string name="contacts">Contacts</string>
<string name="favorites">Favoris</string>
<string name="show_call_confirmation_dialog">Afficher une demande de confirmation avant de démarrer un appel</string>
<string name="show_only_contacts_with_numbers">Afficher uniquement les contacts avec un numéro de téléphone</string>
<string name="show_dialpad_letters">Show letters on the dialpad</string>
<!-- Emails -->
<string name="email">Adresse de courriel</string>
<string name="home">Maison</string>
<string name="work">Travail</string>
<string name="other">Autre</string>
<!-- Phone numbers -->
<string name="number">Numéro</string>
<string name="mobile">Mobile</string>
<string name="main_number">Principal</string>
<string name="work_fax">Fax travail</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Aucun contact favori n\'a été trouvé</string>
<string name="add_favorites">Ajouter des favoris</string>
<string name="add_to_favorites">Ajouter aux favoris</string>
<string name="remove_from_favorites">Supprimer des favoris</string>
<string name="must_be_at_edit">Vous devez être sur l\'écran \"Modifier\" pour modifier un contact</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Numéroteur</string>
<string name="calling">Appel en cours</string>
<string name="incoming_call">Appel entrant</string>
<string name="incoming_call_from">Appel entrant de…</string>
<string name="ongoing_call">Appel en cours</string>
<string name="disconnected">Interrompu</string>
<string name="decline_call">Refuser</string>
<string name="answer_call">Répondre</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">Adresse de courriels</string>
<string name="addresses">Adresses</string>
<string name="events">Évènements (naissances, anniversaires)</string>
<string name="notes">Notes</string>
<string name="organization">Organisation</string>
<string name="websites">Sites Internet</string>
<string name="groups">Groupe</string>
<string name="contact_source">Compte pour le contact</string>
<string name="instant_messaging">Messagerie instantanée (MI)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Manage blocked numbers</string>
<string name="not_blocking_anyone">You are not blocking anyone.</string>
<string name="add_a_blocked_number">Ajouter un numéro bloqué</string>
<string name="block_number">Numéro bloquer</string>
<string name="block_numbers">Numéros bloquer</string>
<string name="blocked_numbers">Numéros bloquer</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Are you sure you want to delete %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">The contact will be removed from all contact sources.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Manage your contacts easily</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">An app for managing your contacts without ads, respecting your privacy.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
Un outil simple pour créer et gérer vos contacts depuis n\'importe quelle source. Les contacts peuvent être stockés sur votre appareil mais aussi synchronisés via votre compte Google ou d\'autres comptes. Vous pouvez afficher vos contacts favoris dans une liste séparée.
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.
Vous pouvez l\'utiliser pour gérer les adresses de courriels et les événements de vos contacts. Cet outil permet de trier/filtrer à l\'aide de multiples paramètres, par exemple : afficher le surnom en premier.
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.
L\'application ne contient ni publicité, ni autorisation inutile. Elle est totalement opensource et est également fournie avec des couleurs personnalisables.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Pošalji SMS grupi</string>
<string name="send_email_to_group">Pošalji e-poštu grupi</string>
<string name="call_person">Nazovi %s</string>
<string name="request_the_required_permissions">Zatraži potrebna dopuštenja</string>
<string name="create_new_contact">Stvori novi kontakt</string>
<string name="add_to_existing_contact">Dodaj postojećem kontaktu</string>
<string name="must_make_default_dialer">Morate napraviti ovu aplikaciju zadanom aplikacijom za biranje da biste bili u mogućnosti koristiti blokirane brojeve.</string>
<string name="set_as_default">Postavi na zadano</string>
<!-- Placeholders -->
<string name="no_contacts_found">Nisu pronađeni kontakti.</string>
<string name="no_contacts_with_emails">Nije pronađen nijedan kontakt s e-poštom</string>
<string name="no_contacts_with_phone_numbers">Nisu pronađeni kontakti s telefonskim brojevima</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Pokušaj filtrirati duple kontakte</string>
<string name="manage_shown_tabs">Upravljaj prikazanim karticama</string>
<string name="contacts">Kontakti</string>
<string name="favorites">Favoriti</string>
<string name="show_call_confirmation_dialog">Pokažite dijaloški okvir za potvrdu poziva prije pokretanja poziva</string>
<string name="show_only_contacts_with_numbers">Prikaži samo kontakte s telefonskim brojevima</string>
<string name="show_dialpad_letters">Prikaži slova na telefonskoj tipkovnici</string>
<!-- Emails -->
<string name="email">E-pošta</string>
<string name="home">Kućni</string>
<string name="work">Posao</string>
<string name="other">Ostalo</string>
<!-- Phone numbers -->
<string name="number">Broj</string>
<string name="mobile">Mobilni</string>
<string name="main_number">Glavni</string>
<string name="work_fax">Poslovni fax</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Čini se da još niste dodali nijedan kontakt u favorite.</string>
<string name="add_favorites">Dodaj favorite</string>
<string name="add_to_favorites">Dodaj u favorite</string>
<string name="remove_from_favorites">Ukloni iz favorita</string>
<string name="must_be_at_edit">Morate biti na zaslonu Uređivanje da biste izmijenili kontakt</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Birač broja</string>
<string name="calling">Pozivanje</string>
<string name="incoming_call">Dolazni poziv</string>
<string name="incoming_call_from">Dolazni poziv od…</string>
<string name="ongoing_call">Poziv u tijeku</string>
<string name="disconnected">Prekinuto</string>
<string name="decline_call">Odbij</string>
<string name="answer_call">Odgovori</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">E-pošte</string>
<string name="addresses">Adrese</string>
<string name="events">Događaji (rođendani, godišnjice)</string>
<string name="notes">Bilješke</string>
<string name="organization">Organizacije</string>
<string name="websites">Web stranice</string>
<string name="groups">Grupe</string>
<string name="contact_source">Izvori kontakata</string>
<string name="instant_messaging">Brzo slanje poruka (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Upravljanje blokiranim brojevima</string>
<string name="not_blocking_anyone">Ne blokirate nikoga.</string>
<string name="add_a_blocked_number">Dodaj blokirani broj</string>
<string name="block_number">Blokiraj broj</string>
<string name="block_numbers">Blokiraj brojeve</string>
<string name="blocked_numbers">Blokirani brojevi</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Are you sure you want to delete %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">The contact will be removed from all contact sources.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Manage your contacts easily</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Aplikacija za upravljanje kontaktima, bez oglasa, poštujući Vašu privatnost.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
Jednostavna aplikacija za izradu ili upravljanje kontaktima iz bilo kojeg izvora. Kontakti mogu biti pohranjeni samo na Vašem uređaju, ali i sinkronizirani putem Googlea ili drugih računa. Možete prikazati svoje omiljene kontakte na zasebnom popisu.
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.
Možete ju koristiti za upravljanje e-poštom i događajima. Ima mogućnost sortirati/filtrirati višestrukim parametrima, po želji može prikazati prezime prvo, zatim ime.
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.
Ne sadrži oglase ili nepotrebne dozvole. Aplikacije je otvorenog koda, pruža prilagodljive boje.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">SMS küldése csoportnak</string>
<string name="send_email_to_group">Email küldése csoportnak</string>
<string name="call_person">%s hívása</string>
<string name="request_the_required_permissions">A kívánt jogosultságok igénylése</string>
<string name="create_new_contact">Új névjegy hozzáadása</string>
<string name="add_to_existing_contact">Hozzáadás meglévő névjegyhez</string>
<string name="must_make_default_dialer">A zárolt telefonszámok használatához be kell állítani, hogy ez az app legyen az alapértelmezett tárcsázó.</string>
<string name="set_as_default">Alapértelmezés beállítása</string>
<!-- Placeholders -->
<string name="no_contacts_found">Nincs ilyen névjegy.</string>
<string name="no_contacts_with_emails">Nincs emailt tartalmazó névjegy.</string>
<string name="no_contacts_with_phone_numbers">Nincs telefonszámot tartalmazó névjegy.</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Többszörösen felvett névjegyek kiszűrése</string>
<string name="manage_shown_tabs">A megjelenő fülek kiválasztása</string>
<string name="contacts">Névjegyek</string>
<string name="favorites">Kedvencek</string>
<string name="show_call_confirmation_dialog">Jóváhagyás kérése telefonhívás indítása előtt</string>
<string name="show_only_contacts_with_numbers">Csak telefonszámot tartalmazó névjegyek kijelzése</string>
<string name="show_dialpad_letters">Betűk kijelzése a tárcsázón</string>
<!-- Emails -->
<string name="email">Email</string>
<string name="home">Otthon</string>
<string name="work">Munkahely</string>
<string name="other">Egyéb</string>
<!-- Phone numbers -->
<string name="number">Telefonszám</string>
<string name="mobile">Mobil</string>
<string name="main_number">Elsődleges telefonszám</string>
<string name="work_fax">Munkahelyi fax</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Úgy tűnik, hogy még nincsenek kedvencek felvéve.</string>
<string name="add_favorites">Kedvencek felvétele</string>
<string name="add_to_favorites">Hozzáadás a kedvencekhez</string>
<string name="remove_from_favorites">Törlés a kedvencek közül</string>
<string name="must_be_at_edit">Névjegyet csak a szerkesztő képernyőn lehet módosítani.</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Tárcsázó</string>
<string name="calling">Hívás</string>
<string name="incoming_call">Bejövő hívás</string>
<string name="incoming_call_from">Bejövő hívás innen…</string>
<string name="ongoing_call">Hívás folyamatban</string>
<string name="disconnected">Szétkapcsolt</string>
<string name="decline_call">Elutasítva</string>
<string name="answer_call">Hívásfogadás</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">Emailek</string>
<string name="addresses">Címek</string>
<string name="events">Események (születésnapok, évfordulók)</string>
<string name="notes">Jegyzetek</string>
<string name="organization">Szervezet</string>
<string name="websites">Weboldalak</string>
<string name="groups">Csoportok</string>
<string name="contact_source">Névjegy account</string>
<string name="instant_messaging">Instant messaging (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Zárolt telefonszámok kezelése</string>
<string name="not_blocking_anyone">Nincs még zárolt szám.</string>
<string name="add_a_blocked_number">Zárolt telefonszám hozzáadása</string>
<string name="block_number">Telefonszám zárolása</string>
<string name="block_numbers">Telefonszámok zárolása</string>
<string name="blocked_numbers">Zárolt telefonszámok</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Are you sure you want to delete %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">The contact will be removed from all contact sources.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Manage your contacts easily</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Egy reklámmentes app névjegyek kezelésére, amelyik óvja a magánszférádat.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
Egy egyszerű app, amelyik az összes accountod névjegyeit képes kezelni. Bár a névjegyeket csak az eszközön tárolja, de szinkronizálható Google, vagy más accountokkal is. A kedvenceidet külön listán is kezelheted.
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.
Kezelhetsz vele email-címeket és eseményeket. Képes a névjegyeket többféle paraméter rendezni és szűrni. A megjelenítést beállíthatod vezetéknév, keresztnév sorrendben is. A színeket testreszabhtod.
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.
Nem kér szükségtelen jogosultságokat és nincs benne reklám. Teljes egészében nyílt forráskódú szoftver.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Kirim SMS ke grup</string>
<string name="send_email_to_group">Kirim surel ke grup</string>
<string name="call_person">Panggil %s</string>
<string name="request_the_required_permissions">Meminta izin yang diperlukan</string>
<string name="create_new_contact">Buat kontak baru</string>
<string name="add_to_existing_contact">Tambah ke kontak yang ada</string>
<string name="must_make_default_dialer">Anda harus mengatur aplikasi ini sebagai aplikasi dialer default untuk menggunakan fitur pemblokir nomor.</string>
<string name="set_as_default">Tetapkan sebagai default</string>
<!-- Placeholders -->
<string name="no_contacts_found">Tidak ada kontak yang ditemukan.</string>
<string name="no_contacts_with_emails">Tidak ada kontak dengan alamat surel yang ditemukan</string>
<string name="no_contacts_with_phone_numbers">Tidak ada kontak dengan nomor telepon yang ditemukan</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Coba sembunyikan duplikat kontak</string>
<string name="manage_shown_tabs">Kelola tab yang ditampilkan</string>
<string name="contacts">Kontak</string>
<string name="favorites">Favorit</string>
<string name="show_call_confirmation_dialog">Tampilkan dialog konfirmasi panggilan sebelum melakukan panggilan</string>
<string name="show_only_contacts_with_numbers">Hanya tampilkan kontak dengan nomor telepon</string>
<string name="show_dialpad_letters">Tampilkan huruf pada tombol dial</string>
<!-- Emails -->
<string name="email">Surel</string>
<string name="home">Rumah</string>
<string name="work">Kerja</string>
<string name="other">Lainnya</string>
<!-- Phone numbers -->
<string name="number">Nomor</string>
<string name="mobile">Ponsel</string>
<string name="main_number">Utama</string>
<string name="work_fax">Faks Kerja</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Sepertinya anda belum menambahkan kontak favorit.</string>
<string name="add_favorites">Tambah favorit</string>
<string name="add_to_favorites">Tambah ke favorit</string>
<string name="remove_from_favorites">Buang dari favorit</string>
<string name="must_be_at_edit">Anda harus berada di layar Sunting untuk mengubah kontak</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Telepon</string>
<string name="calling">Memanggil</string>
<string name="incoming_call">Panggilan masuk</string>
<string name="incoming_call_from">Panggilan masuk dari…</string>
<string name="ongoing_call">Panggilan keluar</string>
<string name="disconnected">Terputus</string>
<string name="decline_call">Tolak</string>
<string name="answer_call">Jawab</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">Surel</string>
<string name="addresses">Alamat</string>
<string name="events">Acara (ulang tahun, hari jadi)</string>
<string name="notes">Catatan</string>
<string name="organization">Organisasi</string>
<string name="websites">Situs web</string>
<string name="groups">Grup</string>
<string name="contact_source">Sumber kontak</string>
<string name="instant_messaging">Pesan singkat (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Kelola nomor yang diblokir</string>
<string name="not_blocking_anyone">Anda tidak memblokir siapapun.</string>
<string name="add_a_blocked_number">Tambahkan nomor yang diblokir</string>
<string name="block_number">Blokir nomor</string>
<string name="block_numbers">Blokir nomor</string>
<string name="blocked_numbers">Nomor yang diblokir</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Apakah anda yakin ingin menghapus %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">Kontak akan dihapus dari semua sumber kontak.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Manage your contacts easily</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Aplikasi untuk mengelola kontak tanpa iklan, menghargai privasi anda.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
Aplikasi sederhana untuk membuat dan mengelola kontak anda dari berbagai sumber. Kontak bisa disimpan hanya pada perangkat anda, tetapi juga disinkronisasikan melalui Google, atau akun lainnya. Anda bisa menampilkan kontak favorit anda pada daftar terpisah.
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.
Anda juga bisa menggunakannya untuk mengelola surel dan acara. Memiliki kemampuan untuk mengurutkan/menyaring menggunakan banyak parameter, dan secara opsional menampilkan nama belakang sebagai awalan nama.
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.
Tanpa iklan dan perizinan yang tidak perlu. Sepenuhnya sumber terbuka, dengan warna yang bisa disesuaikan.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Kirim SMS ke grup</string>
<string name="send_email_to_group">Kirim surel ke grup</string>
<string name="call_person">Panggil %s</string>
<string name="request_the_required_permissions">Meminta izin yang diperlukan</string>
<string name="create_new_contact">Buat kontak baru</string>
<string name="add_to_existing_contact">Tambah ke kontak yang ada</string>
<string name="must_make_default_dialer">Anda harus mengatur aplikasi ini sebagai aplikasi dialer default untuk menggunakan fitur pemblokir nomor.</string>
<string name="set_as_default">Tetapkan sebagai default</string>
<!-- Placeholders -->
<string name="no_contacts_found">Tidak ada kontak yang ditemukan.</string>
<string name="no_contacts_with_emails">Tidak ada kontak dengan alamat surel yang ditemukan</string>
<string name="no_contacts_with_phone_numbers">Tidak ada kontak dengan nomor telepon yang ditemukan</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Coba sembunyikan duplikat kontak</string>
<string name="manage_shown_tabs">Kelola tab yang ditampilkan</string>
<string name="contacts">Kontak</string>
<string name="favorites">Favorit</string>
<string name="show_call_confirmation_dialog">Tampilkan dialog konfirmasi panggilan sebelum melakukan panggilan</string>
<string name="show_only_contacts_with_numbers">Hanya tampilkan kontak dengan nomor telepon</string>
<string name="show_dialpad_letters">Tampilkan huruf pada tombol dial</string>
<!-- Emails -->
<string name="email">Surel</string>
<string name="home">Rumah</string>
<string name="work">Kerja</string>
<string name="other">Lainnya</string>
<!-- Phone numbers -->
<string name="number">Nomor</string>
<string name="mobile">Ponsel</string>
<string name="main_number">Utama</string>
<string name="work_fax">Faks Kerja</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Sepertinya anda belum menambahkan kontak favorit.</string>
<string name="add_favorites">Tambah favorit</string>
<string name="add_to_favorites">Tambah ke favorit</string>
<string name="remove_from_favorites">Buang dari favorit</string>
<string name="must_be_at_edit">Anda harus berada di layar Sunting untuk mengubah kontak</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Telepon</string>
<string name="calling">Memanggil</string>
<string name="incoming_call">Panggilan masuk</string>
<string name="incoming_call_from">Panggilan masuk dari…</string>
<string name="ongoing_call">Panggilan keluar</string>
<string name="disconnected">Terputus</string>
<string name="decline_call">Tolak</string>
<string name="answer_call">Jawab</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">Surel</string>
<string name="addresses">Alamat</string>
<string name="events">Acara (ulang tahun, hari jadi)</string>
<string name="notes">Catatan</string>
<string name="organization">Organisasi</string>
<string name="websites">Situs web</string>
<string name="groups">Grup</string>
<string name="contact_source">Sumber kontak</string>
<string name="instant_messaging">Pesan singkat (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Kelola nomor yang diblokir</string>
<string name="not_blocking_anyone">Anda tidak memblokir siapapun.</string>
<string name="add_a_blocked_number">Tambahkan nomor yang diblokir</string>
<string name="block_number">Blokir nomor</string>
<string name="block_numbers">Blokir nomor</string>
<string name="blocked_numbers">Nomor yang diblokir</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Apakah anda yakin ingin menghapus %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">Kontak akan dihapus dari semua sumber kontak.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Manage your contacts easily</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Aplikasi untuk mengelola kontak tanpa iklan, menghargai privasi anda.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
Aplikasi sederhana untuk membuat dan mengelola kontak anda dari berbagai sumber. Kontak bisa disimpan hanya pada perangkat anda, tetapi juga disinkronisasikan melalui Google, atau akun lainnya. Anda bisa menampilkan kontak favorit anda pada daftar terpisah.
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.
Anda juga bisa menggunakannya untuk mengelola surel dan acara. Memiliki kemampuan untuk mengurutkan/menyaring menggunakan banyak parameter, dan secara opsional menampilkan nama belakang sebagai awalan nama.
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.
Tanpa iklan dan perizinan yang tidak perlu. Sepenuhnya sumber terbuka, dengan warna yang bisa disesuaikan.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Invia un SMS al gruppo</string>
<string name="send_email_to_group">Invia un\'email al gruppo</string>
<string name="call_person">Chiama %s</string>
<string name="request_the_required_permissions">Richiedi le permissioni necessarie</string>
<string name="create_new_contact">Crea un nuovo contatto</string>
<string name="add_to_existing_contact">Aggiungi a un contatto esistente</string>
<string name="must_make_default_dialer">È necessario impostare quest\'app come predefinita per utilizzare i numeri bloccati.</string>
<string name="set_as_default">Imposta come predefinita</string>
<!-- Placeholders -->
<string name="no_contacts_found">Nessun contatto trovato.</string>
<string name="no_contacts_with_emails">Nessun contatto trovato con un\'email</string>
<string name="no_contacts_with_phone_numbers">Nessun contatto trovato con un numero di telefono</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Unisci i contatti duplicati</string>
<string name="manage_shown_tabs">Gestisci le schede mostrate</string>
<string name="contacts">Contatti</string>
<string name="favorites">Preferiti</string>
<string name="show_call_confirmation_dialog">Mostra un messaggio di conferma prima di iniziare una chiamata</string>
<string name="show_only_contacts_with_numbers">Mostra solamente i contatti con almeno un numero telefonico</string>
<string name="show_dialpad_letters">Mostra lettere nel compositore</string>
<!-- Emails -->
<string name="email">Email</string>
<string name="home">Casa</string>
<string name="work">Lavoro</string>
<string name="other">Altro</string>
<!-- Phone numbers -->
<string name="number">Numero</string>
<string name="mobile">Cellulare</string>
<string name="main_number">Principale</string>
<string name="work_fax">Fax di lavoro</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Non si ha ancora nessun contatto preferito.</string>
<string name="add_favorites">Aggiungi preferito</string>
<string name="add_to_favorites">Aggiungi ai preferiti</string>
<string name="remove_from_favorites">Rimuovi dai preferiti</string>
<string name="must_be_at_edit">Si deve stare nella schermata di modifica per modificare un contatto</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Compositore</string>
<string name="calling">Chiamata in corso</string>
<string name="incoming_call">Chiamata in arrivo</string>
<string name="incoming_call_from">Chiamata in arrivo da…</string>
<string name="ongoing_call">Chiamata in corso</string>
<string name="disconnected">Disconnesso</string>
<string name="decline_call">Rifiuta</string>
<string name="answer_call">Rispondi</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">Email</string>
<string name="addresses">Indirizzi</string>
<string name="events">Eventi (compleanni, anniversari)</string>
<string name="notes">Note</string>
<string name="organization">Organizazione</string>
<string name="websites">Siti web</string>
<string name="groups">Gruppi</string>
<string name="contact_source">Provenienza del contatto</string>
<string name="instant_messaging">Messaggistica istantanea (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Gestisci i numeri bloccati</string>
<string name="not_blocking_anyone">Nessun numero bloccato.</string>
<string name="add_a_blocked_number">Aggiungi un numero da bloccare</string>
<string name="block_number">Blocca numero</string>
<string name="block_numbers">Blocca numeri</string>
<string name="blocked_numbers">Numeri bloccati</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Are you sure you want to delete %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">The contact will be removed from all contact sources.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Manage your contacts easily</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Un\'app per gestire i propri contatti senza pubblicità, che rispetta la privacy.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
Una semplice applicazione per creare o gestire i propri contatti di qualsiasi tipo. I contatti saranno salvati nel dispositivo, ma possono essere eventualmente sincronizzati con Google o con altri servizi. Si possono visualizzare i contatti preferiti in una lista separata.
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.
Si può utilizzare l\'applicazione anche per gestire l\'email e gli eventi. Si possono ordinare e filtrare per diversi criteri, opzionalmente si può visualizzare il cognome come nome.
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.
L\'applicazione non contiene pubblicità o permessi non necessari; è completamente opensource e la si può personalizzare con i propri colori preferiti.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">グループにSMSを送信</string>
<string name="send_email_to_group">グループにメールを送信</string>
<string name="call_person">Call %s</string>
<string name="request_the_required_permissions">Request the required permissions</string>
<string name="create_new_contact">新しい連絡先を作成</string>
<string name="add_to_existing_contact">既存の連絡先に追加</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_as_default">Set as default</string>
<!-- Placeholders -->
<string name="no_contacts_found">連絡先が見つかりません.</string>
<string name="no_contacts_with_emails">メールアドレスが登録された連絡先が見つかりません</string>
<string name="no_contacts_with_phone_numbers">電話番号が登録された連絡先が見つかりません</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">重複した連絡先を除外する</string>
<string name="manage_shown_tabs">表示するタブを管理</string>
<string name="contacts">連絡先</string>
<string name="favorites">お気に入り</string>
<string name="show_call_confirmation_dialog">発信する前に確認ダイアログを表示する</string>
<string name="show_only_contacts_with_numbers">電話番号が登録された連絡先のみ表示する</string>
<string name="show_dialpad_letters">Show letters on the dialpad</string>
<!-- Emails -->
<string name="email">メール</string>
<string name="home">自宅</string>
<string name="work">職場</string>
<string name="other">その他</string>
<!-- Phone numbers -->
<string name="number">番号</string>
<string name="mobile">携帯</string>
<string name="main_number">Main</string>
<string name="work_fax">職場FAX</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">お気に入りの連絡先はまだありません</string>
<string name="add_favorites">お気に入りを追加</string>
<string name="add_to_favorites">お気に入りに追加</string>
<string name="remove_from_favorites">お気に入りから削除</string>
<string name="must_be_at_edit">連絡先を編集するには編集画面に切り替えてください</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">電話</string>
<string name="calling">発信中</string>
<string name="incoming_call">着信中</string>
<string name="incoming_call_from">着信中…</string>
<string name="ongoing_call">通話中</string>
<string name="disconnected">切断されました</string>
<string name="decline_call">拒否</string>
<string name="answer_call">応答</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">メール</string>
<string name="addresses">住所</string>
<string name="events">予定 (誕生日、記念日)</string>
<string name="notes">メモ</string>
<string name="organization">所属</string>
<string name="websites">ウェブサイト</string>
<string name="groups">グループ</string>
<string name="contact_source">インポート元</string>
<string name="instant_messaging">Instant messaging (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">ブロックした番号を管理</string>
<string name="not_blocking_anyone">まだ誰もブロックしていません.</string>
<string name="add_a_blocked_number">ブロックする番号を追加</string>
<string name="block_number">Block number</string>
<string name="block_numbers">Block numbers</string>
<string name="blocked_numbers">Blocked numbers</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Are you sure you want to delete %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">The contact will be removed from all contact sources.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Manage your contacts easily</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">An app for managing your contacts without ads, respecting your privacy.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
連絡先を作成または管理するためのシンプルなアプリです。連絡先はお使いの端末上にのみ保存されますが、Googleや他のアカウントと同期することもできます。お気に入りの連絡先を別のリストとして表示することができます。
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.
広告や不要なアクセス許可は含まれていません。完全にオープンソースで、色のカスタマイズも可能です。

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Send SMS to group</string>
<string name="send_email_to_group">Send email to group</string>
<string name="call_person">Call %s</string>
<string name="request_the_required_permissions">Request the required permissions</string>
<string name="create_new_contact">Create new contact</string>
<string name="add_to_existing_contact">Add to an existing contact</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_as_default">Set as default</string>
<!-- Placeholders -->
<string name="no_contacts_found">No contacts found.</string>
<string name="no_contacts_with_emails">No contacts with emails have been found</string>
<string name="no_contacts_with_phone_numbers">No contacts with phone numbers have been found</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Try filtering out duplicate contacts</string>
<string name="manage_shown_tabs">Manage shown tabs</string>
<string name="contacts">Contacts</string>
<string name="favorites">Favorites</string>
<string name="show_call_confirmation_dialog">Show a call confirmation dialog before initiating a call</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<string name="show_dialpad_letters">Show letters on the dialpad</string>
<!-- Emails -->
<string name="email">이메일</string>
<string name="home"></string>
<string name="work">회사</string>
<string name="other">미분류</string>
<!-- Phone numbers -->
<string name="number">연락처</string>
<string name="mobile">핸드폰</string>
<string name="main_number">Main</string>
<string name="work_fax">회사 팩스</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">자주 사용하는 연락처가 아직 등록되지 않았습니다.</string>
<string name="add_favorites">자주쓰는 연락처 등록</string>
<string name="add_to_favorites">자주쓰는 연락처에 추가</string>
<string name="remove_from_favorites">자주쓰는 연락처에서 제거</string>
<string name="must_be_at_edit">You must be at the Edit screen to modify a contact</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Dialer</string>
<string name="calling">Calling</string>
<string name="incoming_call">Incoming call</string>
<string name="incoming_call_from">Incoming call from…</string>
<string name="ongoing_call">Ongoing call</string>
<string name="disconnected">Disconnected</string>
<string name="decline_call">Decline</string>
<string name="answer_call">Answer</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">Emails</string>
<string name="addresses">Addresses</string>
<string name="events">Events (birthdays, anniversaries)</string>
<string name="notes">Notes</string>
<string name="organization">Organization</string>
<string name="websites">Websites</string>
<string name="groups">Groups</string>
<string name="contact_source">Contact source</string>
<string name="instant_messaging">Instant messaging (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Manage blocked numbers</string>
<string name="not_blocking_anyone">You are not blocking anyone.</string>
<string name="add_a_blocked_number">Add a blocked number</string>
<string name="block_number">Block number</string>
<string name="block_numbers">Block numbers</string>
<string name="blocked_numbers">Blocked numbers</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Are you sure you want to delete %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">The contact will be removed from all contact sources.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Manage your contacts easily</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">An app for managing your contacts without ads, respecting your privacy.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
연락처를 생성하고 관리하는 간단한 앱입니다. 연락처는 기본적으로 기기에만 저장되며 Google 또는 다른 계정을 통해 동기화 할 수도 있습니다. 즐겨 찾는 연락처는 별도의 목록에 표시 할 수 있습니다.
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.
광고가 포함되어 있거나, 불필요한 권한을 요청하지 않습니다. 이 앱의 모든 소스는 오픈소스이며, 사용자가 직접 애플리케이션의 컬러를 설정 할 수 있습니다.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Send SMS to group</string>
<string name="send_email_to_group">Send email to group</string>
<string name="call_person">Call %s</string>
<string name="request_the_required_permissions">Request the required permissions</string>
<string name="create_new_contact">Create new contact</string>
<string name="add_to_existing_contact">Add to an existing contact</string>
<string name="must_make_default_dialer">You have to make this app the default dialer app to make use of blocked numbers.</string>
<string name="set_as_default">Set as default</string>
<!-- Placeholders -->
<string name="no_contacts_found">No contacts found.</string>
<string name="no_contacts_with_emails">No contacts with emails have been found</string>
<string name="no_contacts_with_phone_numbers">No contacts with phone numbers have been found</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Try filtering out duplicate contacts</string>
<string name="manage_shown_tabs">Manage shown tabs</string>
<string name="contacts">Contacts</string>
<string name="favorites">Favorites</string>
<string name="show_call_confirmation_dialog">Show a call confirmation dialog before initiating a call</string>
<string name="show_only_contacts_with_numbers">Show only contacts with phone numbers</string>
<string name="show_dialpad_letters">Show letters on the dialpad</string>
<!-- Emails -->
<string name="email">Elektroninis paštas</string>
<string name="home">Namų</string>
<string name="work">Darbo</string>
<string name="other">Kitas</string>
<!-- Phone numbers -->
<string name="number">Numeris</string>
<string name="mobile">Mobilus</string>
<string name="main_number">Pagrindinis</string>
<string name="work_fax">Darbo faksas</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Atrodo jog Jūs dar neįvedėte nė vieno mėgiamiausiojo kontakto.</string>
<string name="add_favorites">Pridėti mėgiamiausiuosius</string>
<string name="add_to_favorites">Pridėti į mėgiamiausiuosius</string>
<string name="remove_from_favorites">Pašalinti iš mėgiamiausiųjų</string>
<string name="must_be_at_edit">You must be at the Edit screen to modify a contact</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Dialer</string>
<string name="calling">Calling</string>
<string name="incoming_call">Incoming call</string>
<string name="incoming_call_from">Incoming call from…</string>
<string name="ongoing_call">Ongoing call</string>
<string name="disconnected">Disconnected</string>
<string name="decline_call">Decline</string>
<string name="answer_call">Answer</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">Elektroniniaipaštai</string>
<string name="addresses">Adresai</string>
<string name="events">Įvykiai (gimtadieniai, sukaktys)</string>
<string name="notes">Užrašai</string>
<string name="organization">Organizacija</string>
<string name="websites">Interneto puslapiai</string>
<string name="groups">Grupės</string>
<string name="contact_source">Kontakto šaltinis</string>
<string name="instant_messaging">Instant messaging (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Manage blocked numbers</string>
<string name="not_blocking_anyone">You are not blocking anyone.</string>
<string name="add_a_blocked_number">Add a blocked number</string>
<string name="block_number">Block number</string>
<string name="block_numbers">Block numbers</string>
<string name="blocked_numbers">Blocked numbers</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Are you sure you want to delete %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">The contact will be removed from all contact sources.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Manage your contacts easily</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">An app for managing your contacts without ads, respecting your privacy.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
Paprasta programėlė įrenginio kontaktų kūrimui ir tvarkymui iš įvairių šaltinių. Kontaktai gali būti saugomi Jūsų įrenginyje, taip pat sinchronizuojami per Google, ar kitas paskyras. Jūs galite matyti mėgiamiausiuosius kontaktus atskirame sąraše.
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.
Jūs taip pat galite naudoti programėlę elektroninių paštų adresų tvarkymui. Programėlė turi galimybę rikiuoti/filtruoti pagal įvairius parametrus, taip pat rodyti pavardę pirma vardo.
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.
Neturi reklamų ar nereikalingų leidimų. Programėlė visiškai atviro kodo, yra galimybė keisti spalvas.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">SMS naar groep sturen</string>
<string name="send_email_to_group">E-mail naar groep sturen</string>
<string name="call_person">%s bellen</string>
<string name="request_the_required_permissions">Om benodigde machtigingen vragen</string>
<string name="create_new_contact">Nieuw contact</string>
<string name="add_to_existing_contact">Aan bestaand contact toevoegen</string>
<string name="must_make_default_dialer">Maak van deze app de standaardapp voor bellen om nummers te kunnen blokkeren.</string>
<string name="set_as_default">Als standaard instellen</string>
<!-- Placeholders -->
<string name="no_contacts_found">Geen contacten gevonden.</string>
<string name="no_contacts_with_emails">Geen contacten met e-mailadressen gevonden</string>
<string name="no_contacts_with_phone_numbers">Geen contacten met telefoonnummers gevonden</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Probeer dubbele contacten weg te filteren</string>
<string name="manage_shown_tabs">Tabs tonen/verbergen</string>
<string name="contacts">Contacten</string>
<string name="favorites">Favorieten</string>
<string name="show_call_confirmation_dialog">Om bevestiging vragen voor het bellen</string>
<string name="show_only_contacts_with_numbers">Alleen contacten met telefoonnummers tonen</string>
<string name="show_dialpad_letters">Letters op het toetsenblok tonen</string>
<!-- Emails -->
<string name="email">E-mail</string>
<string name="home">Thuis</string>
<string name="work">Werk</string>
<string name="other">Overig</string>
<!-- Phone numbers -->
<string name="number">Nummer</string>
<string name="mobile">Mobiel</string>
<string name="main_number">Standaard</string>
<string name="work_fax">Fax Werk</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Er zijn nog geen favorieten toegevoegd.</string>
<string name="add_favorites">Favorieten toevoegen</string>
<string name="add_to_favorites">Aan favorieten toevoegen</string>
<string name="remove_from_favorites">Uit favorieten verwijderen</string>
<string name="must_be_at_edit">Ga naar Contact bewerken om gegevens aan te passen</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Bellen</string>
<string name="calling">Bellen</string>
<string name="incoming_call">Inkomend gesprek</string>
<string name="incoming_call_from">Inkomend gesprek van…</string>
<string name="ongoing_call">Lopend gesprek</string>
<string name="disconnected">Verbinding verbroken</string>
<string name="decline_call">Afwijzen</string>
<string name="answer_call">Opnemen</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Snelkiezer</string>
@ -134,23 +125,13 @@
<string name="emails">E-mailadressen</string>
<string name="addresses">Adressen</string>
<string name="events">Datums (verjaardagen, jubileums)</string>
<string name="notes">Notities</string>
<string name="organization">Organisatie</string>
<string name="websites">Websites</string>
<string name="groups">Groepen</string>
<string name="contact_source">Account</string>
<string name="instant_messaging">Instant messaging (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Geblokkeerde nummers beheren</string>
<string name="not_blocking_anyone">Geen geblokkeerde nummers.</string>
<string name="add_a_blocked_number">Geblokkeerd nummer toevoegen</string>
<string name="block_number">Nummer blokkeren</string>
<string name="block_numbers">Nummers blokkeren</string>
<string name="blocked_numbers">Geblokkeerde nummers</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">%s verwijderen?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">De contactpersoon zal worden verwijderd uit alle accounts.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,18 +153,40 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Eenvoudig Adresboek Pro - Snel contacten beheren</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Een privacyvriendelijke advertentievrije app om uw contacten te beheren.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
Een eenvoudige app om contacten aan te maken en te beheren. Contacten kunnen lokaal opgeslagen worden, of gesynchroniseerd via Google en andere accounts. Favoriete contacten kunnen in een aparte lijst worden getoond.
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.
De app is ook te gebruiken voor het beheren van e-mailadressen en gebeurtenissen gekoppeld aan contacten. Sorteren en filteren is mogelijk op basis van verschillende parameters en zowel voor- als achternaam kan als eerste worden getoond.
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.
Bevat geen advertenties of onnodige machtigingen. Volledig open-source. Kleuren van de app kunnen worden aangepast.
<b>Check out the full suite of Simple Tools here:</b>
<b>Probeer ook eens de andere apps van Simple Tools:</b>
https://www.simplemobiletools.com
<b>Standalone website of Simple Contacts Pro:</b>
<b>Website voor Eenvoudig Adresboek Pro:</b>
https://www.simplemobiletools.com/contacts
<b>Facebook:</b>

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Wyślij SMS-a do grupy</string>
<string name="send_email_to_group">Wyślij e-maila do grupy</string>
<string name="call_person">Zadzwoń do: %s</string>
<string name="request_the_required_permissions">Wymagaj koniecznych uprawnień</string>
<string name="create_new_contact">Utwórz nowy kontakt</string>
<string name="add_to_existing_contact">Dodaj do istniejącego kontaktu</string>
<string name="must_make_default_dialer">Musisz ustawić tę aplikację jako domyślną aplikację telefoniczną, aby móc korzystać z funkcji blokowania numerów.</string>
<string name="set_as_default">Ustaw jako domyślną</string>
<!-- Placeholders -->
<string name="no_contacts_found">Nie znaleziono kontaktów.</string>
<string name="no_contacts_with_emails">Nie znaleziono kontaktów z adresami e-mail</string>
<string name="no_contacts_with_phone_numbers">Nie znaleziono kontaktów z numerami telefonów</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Spróbuj odfiltrować zduplikowane kontakty</string>
<string name="manage_shown_tabs">Zarządzaj pokazywanymi sekcjami</string>
<string name="contacts">Kontakty</string>
<string name="favorites">Ulubione</string>
<string name="show_call_confirmation_dialog">Pokazuj okno potwierdzenia zadzwonienia przed zainicjonowaniem połączenia</string>
<string name="show_only_contacts_with_numbers">Pokazuj wyłącznie kontakty z numerami telefonów</string>
<string name="show_dialpad_letters">Pokazuj litery na panelu wybierania</string>
<!-- Emails -->
<string name="email">E-mail</string>
<string name="home">Dom</string>
<string name="work">Praca</string>
<string name="other">Inny</string>
<!-- Phone numbers -->
<string name="number">Numer</string>
<string name="mobile">Komórkowy</string>
<string name="main_number">Główny</string>
<string name="work_fax">Służbowy faks</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Wygląda na to, że nie dodałeś jeszcze żadnego ulubionego kontaktu.</string>
<string name="add_favorites">Dodaj ulubione</string>
<string name="add_to_favorites">Dodaj do ulubionych</string>
<string name="remove_from_favorites">Usuń z ulubionych</string>
<string name="must_be_at_edit">Musisz wejść do ekranu edycji, aby zmodyfikować kontakt</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Dialer</string>
<string name="calling">Dzwonienie</string>
<string name="incoming_call">Połączenie przychodzące</string>
<string name="incoming_call_from">Połączenie przychodzące od…</string>
<string name="ongoing_call">Połączenie wychodzące</string>
<string name="disconnected">Rozłączony</string>
<string name="decline_call">Odrzuć</string>
<string name="answer_call">Odpowiedz</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">E-maile</string>
<string name="addresses">Adresy</string>
<string name="events">Wydarzenia (urodziny, rocznice)</string>
<string name="notes">Notatki</string>
<string name="organization">Organizacja</string>
<string name="websites">Strony internetowe</string>
<string name="groups">Grupy</string>
<string name="contact_source">Miejsce przechowywania kontaktu</string>
<string name="instant_messaging">Komunikator</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Zarządzaj zablokowanymi numerami</string>
<string name="not_blocking_anyone">Nie blokujesz nikogo.</string>
<string name="add_a_blocked_number">Dodaj numer do blokowania</string>
<string name="block_number">Zablokuj numer</string>
<string name="block_numbers">Zablokuj numery</string>
<string name="blocked_numbers">Zablokowane numery</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Are you sure you want to delete %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">The contact will be removed from all contact sources.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Manage your contacts easily</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Aplikacja do zarządzania Twoimi kontaktami, bez reklam, szanująca prywatność.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
Prosta aplikacja do tworzenia lub zarządzania Twoimi kontaktami przechowywanymi w różnych miejscach. Kontakty mogą być przechowywane tylko na Twoim urządzeniu, ale również synchronizowane przez konto Google lub inne konta. Możesz wyświetlać Twoje ulubione kontakty na oddzielnej liście.
Możesz użyć jej także do zarządzania e-mailami użytkowników i wydarzeniami. Jest zdolna do sortowania/filtrowania według wielu parametrów, opcjonalnie do wyświetlania nazwiska jako imienia.
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.
Nie zawiera reklam oraz niekoniecznych uprawnień. Jest w pełni otwartoźródłowa i w pełni podatna na kolorowanie.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Enviar SMS ao grupo</string>
<string name="send_email_to_group">Enviar e-mail ao grupo</string>
<string name="call_person">Ligar para %s</string>
<string name="request_the_required_permissions">Pedir as permissões necessárias</string>
<string name="create_new_contact">Criar novo contato</string>
<string name="add_to_existing_contact">Adicionar um contato existente</string>
<string name="must_make_default_dialer">Você precisa tornar este aplicativo padrão para poder bloquear números.</string>
<string name="set_as_default">Definir como padrão</string>
<!-- Placeholders -->
<string name="no_contacts_found">Nenhum contato encontrado.</string>
<string name="no_contacts_with_emails">Não foram encontrados contatos com e-mails</string>
<string name="no_contacts_with_phone_numbers">Não foram encontrados contatos com números de telefone</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Tentar filtrar contatos duplicados</string>
<string name="manage_shown_tabs">Gerenciar abas visíveis</string>
<string name="contacts">Contatos</string>
<string name="favorites">Favoritos</string>
<string name="show_call_confirmation_dialog">Mostrar diálogo para confirmar a chamada antes de ligar</string>
<string name="show_only_contacts_with_numbers">Mostar apenas os contatos com número de telefone</string>
<string name="show_dialpad_letters">Mostrar letras no discador</string>
<!-- Emails -->
<string name="email">E-mail</string>
<string name="home">Residencial</string>
<string name="work">Comercial</string>
<string name="other">Outro</string>
<!-- Phone numbers -->
<string name="number">Número</string>
<string name="mobile">Celular</string>
<string name="main_number">Principal</string>
<string name="work_fax">Fax Comercial</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Parece que você ainda não adicionou nenhum contato favorito.</string>
<string name="add_favorites">Adicionar favoritos</string>
<string name="add_to_favorites">Adicionar aos favoritos</string>
<string name="remove_from_favorites">Remover dos favoritos</string>
<string name="must_be_at_edit">Você deve estar na tela de edição para modificar um contato</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Discador</string>
<string name="calling">Chamando</string>
<string name="incoming_call">Chamada recebida</string>
<string name="incoming_call_from">Chamada recebida de…</string>
<string name="ongoing_call">Chamada efetuada</string>
<string name="disconnected">Desligada</string>
<string name="decline_call">Recusar</string>
<string name="answer_call">Atender</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">E-mails</string>
<string name="addresses">Endereços</string>
<string name="events">Eventos (aniversários, datas especiais)</string>
<string name="notes">Notas</string>
<string name="organization">Empresa</string>
<string name="websites">Páginas Web</string>
<string name="groups">Grupos</string>
<string name="contact_source">Origem do contato</string>
<string name="instant_messaging">Mensageiro instantâneo (MI)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Gerenciar números bloqueados</string>
<string name="not_blocking_anyone">Não há números bloqueados.</string>
<string name="add_a_blocked_number">Adicionar um número a bloquear</string>
<string name="block_number">Bloquear número</string>
<string name="block_numbers">Bloquear números</string>
<string name="blocked_numbers">Números bloqueados</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Você tem certeza que quer deletar %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">O contato será removido de todas removido de todas as fontes de contato.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Manage your contacts easily</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Um aplicativo para gerenciar os seus contatos que respeita a sua privacidade.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
Um aplicativo simples para criar ou gerenciar seus contatos a partir de qualquer origem. Os contatos podem ser armazenados apenas no seu dispositivo, mas também podem ser sincronizados através do Google ou outras contas. Seus contatos favoritos podem ser apresentados em uma lista separada.
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.
Você também pode usá-lo para gerenciar os eventos e e-mails do usuário. Tem a capacidade de ordenar/filtrar através de diversos parâmetros e, opcionalmente, apresentar o sobrenome antes do primeiro nome.
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.
Não contém anúncios e permissões desnecessárias. É totalmente open source e permite a personalização das cores.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Enviar SMS para o grupo</string>
<string name="send_email_to_group">Enviar e-mail para o grupo</string>
<string name="call_person">Ligar a %s</string>
<string name="request_the_required_permissions">Pedir permissão necessária</string>
<string name="create_new_contact">Criar novo contacto</string>
<string name="add_to_existing_contact">Adicionar a contacto existente</string>
<string name="must_make_default_dialer">Tem que tornar esta a aplicação padrão para poder bloquear números.</string>
<string name="set_as_default">Definir como padrão</string>
<!-- Placeholders -->
<string name="no_contacts_found">Não existem contactos.</string>
<string name="no_contacts_with_emails">Não existem contactos com endereço de e-mail</string>
<string name="no_contacts_with_phone_numbers">Não existem contactos com número de telefone</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Tentar filtrar contactos duplicados</string>
<string name="manage_shown_tabs">Gerir separadores a exibir</string>
<string name="contacts">Contactos</string>
<string name="favorites">Favoritos</string>
<string name="show_call_confirmation_dialog">Mostrar diálogo para confirmar a chamada</string>
<string name="show_only_contacts_with_numbers">Mostrar apenas contactos com número de telefone</string>
<string name="show_dialpad_letters">Mostrar letras no marcador</string>
<!-- Emails -->
<string name="email">E-mail</string>
<string name="home">Pessoal</string>
<string name="work">Profissional</string>
<string name="other">Outro</string>
<!-- Phone numbers -->
<string name="number">Número</string>
<string name="mobile">Telemóvel</string>
<string name="main_number">Principal</string>
<string name="work_fax">Fax profissional</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Parece que ainda não adicionou contactos aos favoritos</string>
<string name="add_favorites">Adicionar favoritos</string>
<string name="add_to_favorites">Adicionar aos favoritos</string>
<string name="remove_from_favorites">Remover dos favoritos</string>
<string name="must_be_at_edit">Tem que estar no ecrã de edição para alterar um contacto</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Marcador</string>
<string name="calling">A chamar</string>
<string name="incoming_call">Chamada recebida</string>
<string name="incoming_call_from">Chamada recebida de…</string>
<string name="ongoing_call">Chamada efetuada</string>
<string name="disconnected">Desligada</string>
<string name="decline_call">Recusar</string>
<string name="answer_call">Atender</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Ligação rápida</string>
@ -134,23 +125,13 @@
<string name="emails">E-mail</string>
<string name="addresses">Endereço</string>
<string name="events">Eventos (data de nascimento, aniversário)</string>
<string name="notes">Notas</string>
<string name="organization">Organização</string>
<string name="websites">Site</string>
<string name="groups">Grupos</string>
<string name="contact_source">Origem do contacto</string>
<string name="instant_messaging">Mensagem instantânea (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Gerir números bloqueados</string>
<string name="not_blocking_anyone">Não existem números bloqueados</string>
<string name="add_a_blocked_number">Adicionar um número a bloquear</string>
<string name="block_number">Bloquear número</string>
<string name="block_numbers">Bloquear números</string>
<string name="blocked_numbers">Números bloqueados</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Tem a certeza de que deseja apagar %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">O contacto será apagado de todas as origens.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Gestão de contactos</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Aplicação para gerir os seus contactos, sem anúncios e com total privacidade.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
Uma aplicação básica para criar e gerir contactos. Pode utilizar a aplicação guardar os contactos localmente, na sua conta Google ou em outro tipo de contas. Pode mostrar os contactos favoritos numa lista distinta.
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.
Também pode utilizar a aplicação para gerir endereços de e-mail e eventos. Tem a capacidade de ordenar/filtrar por diversos parâmetros e também a possibilidade de diversas formas de exibição dos contactos.
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.
Não contém anúncios ou permissões desnecessárias. É totalmente open source e permite personalização de cores.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Отправить SMS группе</string>
<string name="send_email_to_group">Отправить письмо группе</string>
<string name="call_person">Вызов %s</string>
<string name="request_the_required_permissions">Запрос необходимых разрешений</string>
<string name="create_new_contact">Создать новый контакт</string>
<string name="add_to_existing_contact">Добавить к существующему контакту</string>
<string name="must_make_default_dialer">Вы должны сделать \"Simple Contacts\" приложением по умолчанию для набора номера, чтобы использовать блокировку номеров.</string>
<string name="set_as_default">Установить по умолчанию</string>
<!-- Placeholders -->
<string name="no_contacts_found">Контакты не найдены.</string>
<string name="no_contacts_with_emails">Контакты с адресами электронной почты не найдены</string>
<string name="no_contacts_with_phone_numbers">Контакты с номерами телефонов не найдены</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Отфильтровывать повторяющиеся контакты</string>
<string name="manage_shown_tabs">Управление отображаемыми вкладками</string>
<string name="contacts">Контакты</string>
<string name="favorites">Избранное</string>
<string name="show_call_confirmation_dialog">Показывать диалог подтверждения вызова</string>
<string name="show_only_contacts_with_numbers">Показывать только контакты с номерами телефонов</string>
<string name="show_dialpad_letters">Показывать буквы на кнопках набора номера</string>
<!-- Emails -->
<string name="email">Эл. почта</string>
<string name="home">Домашний</string>
<string name="work">Рабочий</string>
<string name="other">Другой</string>
<!-- Phone numbers -->
<string name="number">Номер</string>
<string name="mobile">Мобильный</string>
<string name="main_number">Основной</string>
<string name="work_fax">Рабочий факс</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Похоже, вы ещё не добавили избранные контакты.</string>
<string name="add_favorites">Добавить избранные</string>
<string name="add_to_favorites">Добавить в избранные</string>
<string name="remove_from_favorites">Удалить из избранных</string>
<string name="must_be_at_edit">Для изменения контакта необходимо находиться на экране редактирования</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Номеронабиратель</string>
<string name="calling">Вызов</string>
<string name="incoming_call">Входящий вызов</string>
<string name="incoming_call_from">Входящий вызов от…</string>
<string name="ongoing_call">Исходящий вызов</string>
<string name="disconnected">Разъединено</string>
<string name="decline_call">Отклонить</string>
<string name="answer_call">Ответить</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Быстрый набор</string>
@ -134,23 +125,13 @@
<string name="emails">Электронная почта</string>
<string name="addresses">Адреса</string>
<string name="events">События (дни рождения, юбилеи)</string>
<string name="notes">Заметки</string>
<string name="organization">Организация</string>
<string name="websites">Сайты</string>
<string name="groups">Группы</string>
<string name="contact_source">Источник контакта</string>
<string name="instant_messaging">Мессенджеры</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Управление блокируемыми номерами</string>
<string name="not_blocking_anyone">Нет блокируемых номеров</string>
<string name="add_a_blocked_number">Добавить блокируемый номер</string>
<string name="block_number">Блокируемый номер</string>
<string name="block_numbers">Блокируемые номера</string>
<string name="blocked_numbers">Заблокированные номера</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Вы уверены, что хотите удалить %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">Контакт будет удалён из всех источников контактов.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -174,11 +155,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - легко управляйте контактами</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Приложение для управления контактами. Конфиденциальное. Без рекламы.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
Простое приложение для создания и управления контактами из любого источника. Контакты могут быть сохранены только на вашем устройстве, а также синхронизированы через Google или другие учётные записи. Вы можете отображать свои любимые контакты в отдельном списке.
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.
Не содержит рекламы или ненужных разрешений, полностью с открытым исходным кодом. Есть возможность настраивать цвета.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Poslať skupine SMS</string>
<string name="send_email_to_group">Poslať skupine email</string>
<string name="call_person">Zavolať %s</string>
<string name="request_the_required_permissions">Vyžiadať potrebné oprávnenia</string>
<string name="create_new_contact">Vytvoriť nový kontakt</string>
<string name="add_to_existing_contact">Pridať k existujúcemu kontaktu</string>
<string name="must_make_default_dialer">Pre použitie blokovania čísel musíte nastaviť aplikáciu ako predvolenú pre správu hovorov.</string>
<string name="set_as_default">Nastaviť ako predvolenú</string>
<!-- Placeholders -->
<string name="no_contacts_found">Nenašli sa žiadne kontakty.</string>
<string name="no_contacts_with_emails">Nenašli sa žiadne kontakty s emailami</string>
<string name="no_contacts_with_phone_numbers">Nenašli sa žiadne kontakty s telefónnymi číslami</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Pokúsiť sa vyfiltrovať duplicitné kontakty</string>
<string name="manage_shown_tabs">Spravovať zobrazené karty</string>
<string name="contacts">Kontakty</string>
<string name="favorites">Obľúbené</string>
<string name="show_call_confirmation_dialog">Zobraziť pred spustením hovoru okno na jeho potvrdenie</string>
<string name="show_only_contacts_with_numbers">Zobraziť iba kontakty s telefónnymi číslami</string>
<string name="show_dialpad_letters">Zobraziť na číselníku písmená</string>
<!-- Emails -->
<string name="email">Email</string>
<string name="home">Domov</string>
<string name="work">Práca</string>
<string name="other">Iné</string>
<!-- Phone numbers -->
<string name="number">Číslo</string>
<string name="mobile">Mobil</string>
<string name="main_number">Hlavné</string>
<string name="work_fax">Pracovný fax</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Zdá sa, že ste ešte nepridali žiadne obľúbené kontakty.</string>
<string name="add_favorites">Pridať obľúbené</string>
<string name="add_to_favorites">Pridať medzi obľúbené</string>
<string name="remove_from_favorites">Odstrániť z obľúbených</string>
<string name="must_be_at_edit">Pre úpravu kontaktu musíte byť v Editore kontaktu</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Telefón</string>
<string name="calling">Vytáča sa</string>
<string name="incoming_call">Prichádzajúci hovor</string>
<string name="incoming_call_from">Prichádzajúci hovor od…</string>
<string name="accept">Prijať</string>
<string name="decline">Odmietnuť</string>
<string name="unknown_caller">Neznámy volajúci</string>
<string name="is_calling">Vám volá</string>
<string name="dialing">Vytáčanie</string>
<string name="call_ended">Hovor ukončený</string>
<string name="call_ending">Hovor končí</string>
<string name="ongoing_call">Prebiehajúci hovor</string>
<string name="disconnected">Ukončený hovor</string>
<string name="decline_call">Odmietnuť</string>
<string name="answer_call">Prijať</string>
<!-- Speed dial -->
<string name="speed_dial">Rýchle vytáčanie</string>
@ -134,23 +125,13 @@
<string name="emails">Emaily</string>
<string name="addresses">Adresy</string>
<string name="events">Udalosti (narodeniny, výročia)</string>
<string name="notes">Poznámky</string>
<string name="organization">Firma</string>
<string name="websites">Webstránky</string>
<string name="groups">Skupiny</string>
<string name="contact_source">Zdroje kontaktov</string>
<string name="instant_messaging">Rýchle správy (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Spravovať blokované čísla</string>
<string name="not_blocking_anyone">Neblokujete nikoho.</string>
<string name="add_a_blocked_number">Pridať blokované číslo</string>
<string name="block_number">Blokovať číslo</string>
<string name="block_numbers">Blokovať čísla</string>
<string name="blocked_numbers">Blokované čísla</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Ste si istý, že chcete vymazať %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">Kontakt bude vymazaný zo všetkých zdrojov kontaktov.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -174,11 +155,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Jednoduché kontakty Pro - Rýchla správa kontaktov</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Apka na správu vašich kontaktov bez reklám, rešpektujúca vaše súkromie.</string>
<string name="app_short_description">Rýchly spôsob na správu kontaktov bez reklám, podporuje aj skupiny a obľúbené.</string>
<string name="app_long_description">
Jednoduchá aplikácia na vytváranie, alebo správu vašich kontaktov z rôznych zdrojov. Môžu byť uložené buď iba vo vašom zariadení, alebo ich môžete aj synchronizovať cez Google, alebo iný účet. Vaše obľúbené položky viete zobraziť vo vlastnom zozname.
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.
Viete ju používať aj na správu emailov a udalostí kontaktov. Ponúka možnosť zoradenia/filtrovania pomocou rôznych parametrov, voliteľné je zobrazovanie priezviska ako prvého mena.
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.
Neobsahuje žiadne reklamy a nepotrebné oprávnenia. Je opensource, poskytuje možnosť zmeny farieb.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Skicka sms till grupp</string>
<string name="send_email_to_group">Skicka e-post till grupp</string>
<string name="call_person">Ring %s</string>
<string name="request_the_required_permissions">Begär de behörigheter som krävs</string>
<string name="create_new_contact">Skapa ny kontakt</string>
<string name="add_to_existing_contact">Lägg till i en befintlig kontakt</string>
<string name="must_make_default_dialer">Du måste ställa in den här appen som standardtelefonapp för att kunna använda blockerade nummer.</string>
<string name="set_as_default">Ange som standard</string>
<!-- Placeholders -->
<string name="no_contacts_found">Inga kontakter hittades.</string>
<string name="no_contacts_with_emails">Inga kontakter med e-postadresser hittades</string>
<string name="no_contacts_with_phone_numbers">Inga kontakter med telefonnummer hittades</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Försök filtrera bort dubblettkontakter</string>
<string name="manage_shown_tabs">Välj vilka flikar som ska visas</string>
<string name="contacts">Kontakter</string>
<string name="favorites">Favoriter</string>
<string name="show_call_confirmation_dialog">Visa en bekräftelsedialogruta före uppringning</string>
<string name="show_only_contacts_with_numbers">Visa bara kontakter med telefonnummer</string>
<string name="show_dialpad_letters">Visa bokstäver på knappsatsen</string>
<!-- Emails -->
<string name="email">E-post</string>
<string name="home">Hem</string>
<string name="work">Arbete</string>
<string name="other">Annat</string>
<!-- Phone numbers -->
<string name="number">Nummer</string>
<string name="mobile">Mobil</string>
<string name="main_number">Primärt nummer</string>
<string name="work_fax">Arbetsfax</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Det verkar som att du inte har lagt till några favoritkontakter ännu.</string>
<string name="add_favorites">Lägg till favoriter</string>
<string name="add_to_favorites">Lägg till i favoriter</string>
<string name="remove_from_favorites">Ta bort från favoriter</string>
<string name="must_be_at_edit">Kontakter kan bara redigeras i redigeringsvyn</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Telefon</string>
<string name="calling">Ringer</string>
<string name="incoming_call">Inkommande samtal</string>
<string name="incoming_call_from">Inkommande samtal från…</string>
<string name="ongoing_call">Pågående samtal</string>
<string name="disconnected">Frånkopplad</string>
<string name="decline_call">Avvisa</string>
<string name="answer_call">Svara</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>
@ -134,23 +125,13 @@
<string name="emails">E-postadresser</string>
<string name="addresses">Adresser</string>
<string name="events">Händelser (födelsedagar, årsdagar)</string>
<string name="notes">Anteckningar</string>
<string name="organization">Organisation</string>
<string name="websites">Webbplatser</string>
<string name="groups">Grupper</string>
<string name="contact_source">Kontaktkälla</string>
<string name="instant_messaging">Snabbmeddelanden (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Hantera blockerade nummer</string>
<string name="not_blocking_anyone">Du blockerar inte någon.</string>
<string name="add_a_blocked_number">Lägg till ett blockerat nummer</string>
<string name="block_number">Blockera nummer</string>
<string name="block_numbers">Blockera nummer</string>
<string name="blocked_numbers">Blockerade nummer</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">Är du säker på att du vill ta bort %s?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">Kontakten kommer att tas bort från alla kontaktkällor.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,11 +153,33 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Contacts Pro - Manage your contacts easily</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">En app för att hantera dina kontakter utan reklam, respekterar din integritet.</string>
<string name="app_short_description">Easy and quick contact management with no ads, handles groups and favorites too.</string>
<string name="app_long_description">
En enkel app för att skapa och hantera kontakter från olika källor. Kontakterna kan lagras bara på din enhet, men kan också synkroniseras med ditt Google-konto eller andra konton. Du kan visa dina favoritkontakter i en separat lista.
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.
Du kan också använda den för att hantera dina kontakters e-postadresser och händelser. Den kan sortera och filtrera efter flera parametrar. Den kan också visa efternamn först.
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.
Innehåller ingen reklam eller onödiga behörigheter. Den har helt öppen källkod och anpassningsbara färger.

View File

@ -14,14 +14,10 @@
<string name="send_sms_to_group">Gruba SMS gönder</string>
<string name="send_email_to_group">Gruba e-posta gönder</string>
<string name="call_person">%s kişisini ara</string>
<string name="request_the_required_permissions">Gerekli izinleri iste</string>
<string name="create_new_contact">Yeni kişi oluştur</string>
<string name="add_to_existing_contact">Mevcut bir kişiye ekle</string>
<string name="must_make_default_dialer">Engellenen numaraları kullanmak için bu uygulamayı varsayılan çevirici uygulaması yapmalısınız.</string>
<string name="set_as_default">Varsayılan olarak ayarla</string>
<!-- Placeholders -->
<string name="no_contacts_found">Kişi bulunamadı.</string>
<string name="no_contacts_with_emails">E-posta ile hiç bağlantı bulunamadı</string>
<string name="no_contacts_with_phone_numbers">Telefon numaralarını içeren kişi bulunamadı</string>
@ -62,19 +58,16 @@
<string name="filter_duplicates">Çift kişileri filtrelemeyi dene</string>
<string name="manage_shown_tabs">Gösterilen sekmeleri yönet</string>
<string name="contacts">Kişiler</string>
<string name="favorites">Favoriler</string>
<string name="show_call_confirmation_dialog">Arama başlatmadan önce arama onayı penceresi göster</string>
<string name="show_only_contacts_with_numbers">Sadece telefon numaralarını içeren kişileri göster</string>
<string name="show_dialpad_letters">Tuş takımında harfleri göster</string>
<!-- Emails -->
<string name="email">E-posta</string>
<string name="home">Ev</string>
<string name="work">İş</string>
<string name="other">Diğer</string>
<!-- Phone numbers -->
<string name="number">Numara</string>
<string name="mobile">Cep</string>
<string name="main_number">Ana</string>
<string name="work_fax">İş Faksı</string>
@ -88,9 +81,6 @@
<!-- Favorites -->
<string name="no_favorites">Henüz herhangi bir favori kişi eklememişsiniz.</string>
<string name="add_favorites">Favorileri ekle</string>
<string name="add_to_favorites">Favorilere ekle</string>
<string name="remove_from_favorites">Favorilerden kaldır</string>
<string name="must_be_at_edit">Bir kişiyi değiştirmek için Düzen ekranında olmalısınız</string>
<!-- Search -->
@ -113,13 +103,14 @@
<!-- Dialer -->
<string name="dialer">Çevirici</string>
<string name="calling">Çağrı yapılıyor</string>
<string name="incoming_call">Gelen çağrı</string>
<string name="incoming_call_from">Gelen çağrı şundan…</string>
<string name="ongoing_call">Devam eden çağrı</string>
<string name="disconnected">Bağlantı kesildi</string>
<string name="decline_call">Reddet</string>
<string name="answer_call">Cevapla</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<!-- Speed dial -->
<string name="speed_dial">Hızlı arama</string>
@ -134,23 +125,13 @@
<string name="emails">E-postalar</string>
<string name="addresses">Adresler</string>
<string name="events">Etkinlikler (doğum günleri, yıldönümleri)</string>
<string name="notes">Notlar</string>
<string name="organization">Organizasyon</string>
<string name="websites">Web siteleri</string>
<string name="groups">Gruplar</string>
<string name="contact_source">Kişi kaynağı</string>
<string name="instant_messaging">Anlık mesajlaşma (IM)</string>
<!-- Blocked numbers -->
<string name="manage_blocked_numbers">Engelli numaraları yönet</string>
<string name="not_blocking_anyone">Kimseyi engellemiyorsun.</string>
<string name="add_a_blocked_number">Engellenen numara ekle</string>
<string name="block_number">Numarayı engelle</string>
<string name="block_numbers">Numaraları engelle</string>
<string name="blocked_numbers">Engelli numaralar</string>
<!-- Confirmation dialog -->
<string name="delete_contacts_confirmation">%s silmek istediğinize emin misiniz?</string> <!-- Are you sure you want to delete 5 contacts? -->
<string name="delete_from_all_sources">Kişi tüm kişi kaynaklarından kaldırılacak.</string>
<!-- Are you sure you want to delete 5 contacts? -->
@ -172,18 +153,40 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Basit Kişiler Pro - Kişilerinizi kolayca yönetin</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Reklamsız, gizliliğinize saygı duyan, kişilerinizi yönetmek için bir uygulama.</string>
<string name="app_short_description">Reklamsız, grup ve sık kullanılanlarla kolay ve hızlı kişi yönetimi.</string>
<string name="app_long_description">
Kişilerinizi herhangi bir kaynaktan oluşturmak veya yönetmek için basit bir uygulama. Kişiler yalnızca cihazınızda saklanabilir, aynı zamanda Google veya diğer hesaplarla senkronize edilebilir. Favori kişilerinizi ayrı bir listede görüntüleyebilirsiniz.
Milyonlarca insan tarafından sevilen kişilerinizi yönetmek için hafif bir uygulama. Kişiler yalnızca cihazınızda depolanabilir, aynı zamanda Google veya diğer hesaplarla da senkronize edilebilir.
Kullanıcı e-postalarını ve etkinliklerini yönetmek için de kullanabilirsiniz. Birden çok parametreye göre sıralama/filtreleme, isteğe bağlı olarak soyadı ilk ad olarak görüntüleme yeteneğine sahiptir.
Kullanıcı e-postalarını ve etkinliklerini yönetmek için de kullanabilirsiniz. Birden fazla parametreye göre sıralama/filtreleme, isteğe bağlı olarak soyadı ilk ad olarak görüntüleme yeteneğine sahiptir.
Favori kişilerinizi veya gruplarınızı ayrı bir listede görüntüleyebilirsiniz. Gruplar toplu e-postalar veya SMS göndermek için kullanılabilir, size biraz zaman kazandırmak için bunları kolayca yeniden adlandırabilirsiniz.
Kişilerinizi aramak veya mesaj göndermek için kullanışlı düğmeler içerir. Tüm görünür alanlar istediğiniz gibi özelleştirilebilir, kullanılmayanları kolayca gizleyebilirsiniz. Arama işlevi, istediğiniz kişiyi kolayca bulabilmeniz için, verilen dizeyi görünür her kişi alanında arayacaktır.
Akıllı kişi önerileri ile hizmetinizde hafif bir tuş takımı da var.
Kolay taşıma veya verilerinizi yedeklemek için vCard biçimindeki kişileri .vcf dosyalarına dışa aktarmayı/içe aktarmayı destekler.
Bu modern ve kararlı kişi yöneticisi ile kişilerinizi diğer uygulamalarla paylaşmayarak koruyabilir, böylece kişilerinizi gizli tutabilirsiniz.
Kişi kaynağı gibi, kişi adını, e-postayı, telefon numarasını, adresi, organizasyonu, grupları ve diğer birçok özelleştirilebilir alanı da kolayca değiştirebilirsiniz. Doğum günleri, yıldönümleri veya diğer özel etkinlikler gibi kişi etkinliklerini depolamak için de kullanabilirsiniz.
Bu basit kişi düzenleyicisi, ana ekranda telefon numaralarını göstermek, kişi küçük resminin görünürlüğünü değiştirmek, yalnızca telefon numaralarına sahip kişileri göstermek, bir arama başlatmadan önce bir arama onay kutusu göstermek gibi birçok kullanışlı ayara sahiptir. Harfleri de kullanan hızlı bir çevirici ile birlikte gelir.
Kullanıcı deneyimini daha da geliştirmek için, bir kişiye tıklandığında neler olacağını özelleştirebilirsiniz. Bir çağrı başlatabilir, Ayrıntıları Görüntüle ekranına gidebilir veya seçilen kişiyi düzenleyebilirsiniz.
İstenmeyen gelen aramaları önlemek için telefon numaralarını kolayca engelleyebilirsiniz.
Potansiyel olarak istenmeyen kişileri göstermekten kaçınmak için güçlü bir dahili yinelenen kişi birleştirici vardır.
Varsayılan olarak materyal tasarımı ve koyu tema ile birlikte gelir, kolay kullanım için mükemmel kullanıcı deneyimi sağlar. İnternet erişiminin olmaması, diğer uygulamalardan daha fazla gizlilik, güvenlik ve kararlılık sağlar.
Reklam veya gereksiz izinler içermez. Tamamen açık kaynaktır, özelleştirilebilir renkler sağlar.
<b>Basit Araçlar paketinin tamamını buradan inceleyin:</b>
https://www.simplemobiletools.com
<b>Basit Kişiler Pro'nun bağımsız web sitesi:</b>
<b>Basit Kişiler Pro\'nun bağımsız web sitesi:</b>
https://www.simplemobiletools.com/contacts
<b>Facebook:</b>

Some files were not shown because too many files have changed in this diff Show More