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