Allow exporting of baresip contacts to Android contacts
This commit is contained in:
@@ -12,6 +12,8 @@
|
|||||||
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
|
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
|
<uses-permission android:name="android.permission.READ_CONTACTS" />
|
||||||
|
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
|
||||||
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
|
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
|
||||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||||
<uses-permission android:name="android.permission.VIBRATE" />
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class Contact(var name: String, var uri: String, var color: Int, val id: Long) {
|
|||||||
fun save(): Boolean {
|
fun save(): Boolean {
|
||||||
var contents = ""
|
var contents = ""
|
||||||
for (c in BaresipService.contacts) contents +=
|
for (c in BaresipService.contacts) contents +=
|
||||||
"\"${c.name}\" <${c.uri}>;id=${c.id};color=${c.color}\n"
|
"\"${c.name}\" <${c.uri}>;id=${c.id};color=${c.color};android=${c.androidContact}\n"
|
||||||
return Utils.putFileContents(BaresipService.filesPath + "/contacts",
|
return Utils.putFileContents(BaresipService.filesPath + "/contacts",
|
||||||
contents.toByteArray())
|
contents.toByteArray())
|
||||||
}
|
}
|
||||||
@@ -49,14 +49,16 @@ class Contact(var name: String, var uri: String, var color: Int, val id: Long) {
|
|||||||
color = colorValue.toInt()
|
color = colorValue.toInt()
|
||||||
else
|
else
|
||||||
color = Utils.randomColor()
|
color = Utils.randomColor()
|
||||||
|
val androidContact = Utils.paramValue(params, "android" ) == "true"
|
||||||
val idValue = Utils.paramValue(params, "id" )
|
val idValue = Utils.paramValue(params, "id" )
|
||||||
val id: Long
|
val id: Long
|
||||||
if (idValue != "")
|
if (idValue != "")
|
||||||
id = idValue.toLong()
|
id = idValue.toLong()
|
||||||
else
|
else
|
||||||
id = baseId + contactNo
|
id = baseId + contactNo
|
||||||
Log.d("Baresip", "Restoring contact $name, $uri, $color, $id")
|
Log.d("Baresip", "Restoring contact $name, $uri, $color, $id, $androidContact")
|
||||||
val contact = Contact(name, uri, color, id)
|
val contact = Contact(name, uri, color, id)
|
||||||
|
contact.androidContact = androidContact
|
||||||
val avatarFilePath = BaresipService.filesPath + "/$id.png"
|
val avatarFilePath = BaresipService.filesPath + "/$id.png"
|
||||||
if (File(avatarFilePath).exists()) {
|
if (File(avatarFilePath).exists()) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import android.content.ContentProviderOperation
|
|||||||
import android.content.ContentValues
|
import android.content.ContentValues
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.content.pm.PackageManager
|
||||||
import android.database.Cursor
|
import android.database.Cursor
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
@@ -36,6 +37,7 @@ class ContactActivity : AppCompatActivity() {
|
|||||||
private lateinit var nameView: EditText
|
private lateinit var nameView: EditText
|
||||||
private lateinit var uriView: EditText
|
private lateinit var uriView: EditText
|
||||||
private lateinit var androidCheck: CheckBox
|
private lateinit var androidCheck: CheckBox
|
||||||
|
private lateinit var menu: Menu
|
||||||
|
|
||||||
private var newContact = false
|
private var newContact = false
|
||||||
private var newAvatar = ""
|
private var newAvatar = ""
|
||||||
@@ -168,12 +170,13 @@ class ContactActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
override fun onCreateOptionsMenu(optionsMenu: Menu): Boolean {
|
||||||
|
|
||||||
super.onCreateOptionsMenu(menu)
|
super.onCreateOptionsMenu(optionsMenu)
|
||||||
|
|
||||||
val inflater = menuInflater
|
val inflater = menuInflater
|
||||||
inflater.inflate(R.menu.check_icon, menu)
|
inflater.inflate(R.menu.check_icon, optionsMenu)
|
||||||
|
menu = optionsMenu
|
||||||
return true
|
return true
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -259,7 +262,8 @@ class ContactActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
Contact.contacts().sortBy { Contact -> Contact.name }
|
Contact.contacts().sortBy { Contact -> Contact.name }
|
||||||
|
|
||||||
if (Utils.checkPermission(this, Manifest.permission.WRITE_CONTACTS)) {
|
if (Utils.checkPermission(this, Manifest.permission.READ_CONTACTS +
|
||||||
|
"|" + Manifest.permission.WRITE_CONTACTS)) {
|
||||||
if (contact.androidContact)
|
if (contact.androidContact)
|
||||||
addOrUpdateAndroidContact(this, contact)
|
addOrUpdateAndroidContact(this, contact)
|
||||||
else
|
else
|
||||||
@@ -267,9 +271,9 @@ class ContactActivity : AppCompatActivity() {
|
|||||||
deleteAndroidContact(this, contact)
|
deleteAndroidContact(this, contact)
|
||||||
} else {
|
} else {
|
||||||
if (contact.androidContact) {
|
if (contact.androidContact) {
|
||||||
Utils.requestPermission(this,
|
Utils.requestPermission(this, Manifest.permission.READ_CONTACTS +
|
||||||
"Manifest.permission.READ_CONTACTS,Manifest.permission.WRITE_CONTACTS",
|
"|" + Manifest.permission.WRITE_CONTACTS,
|
||||||
MainActivity.CONTACT_PERMISSION_REQUEST_CODE)
|
MainActivity.CONTACTS_PERMISSION_REQUEST_CODE)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -297,6 +301,22 @@ class ContactActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>,
|
||||||
|
grantResults: IntArray) {
|
||||||
|
|
||||||
|
when (requestCode) {
|
||||||
|
|
||||||
|
MainActivity.CONTACTS_PERMISSION_REQUEST_CODE ->
|
||||||
|
if (grantResults.isNotEmpty() && permissions.size == grantResults.size) {
|
||||||
|
for (res in grantResults)
|
||||||
|
if (res != PackageManager.PERMISSION_GRANTED)
|
||||||
|
return
|
||||||
|
menu.performIdentifierAction(R.id.checkIcon, 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
override fun onBackPressed() {
|
override fun onBackPressed() {
|
||||||
|
|
||||||
BaresipService.activities.remove("contact,$newContact,$uOrI")
|
BaresipService.activities.remove("contact,$newContact,$uOrI")
|
||||||
@@ -309,10 +329,8 @@ class ContactActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
fun onClick(v: View) {
|
fun onClick(v: View) {
|
||||||
when (v) {
|
when (v) {
|
||||||
binding.AndroidTitle -> {
|
binding.AndroidTitle ->
|
||||||
Utils.alertView(this, getString(R.string.android),
|
Utils.alertView(this, getString(R.string.android), getString(R.string.android_contact_help))
|
||||||
getString(R.string.android_contact_help))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -374,7 +392,6 @@ class ContactActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun addAndroidContact(ctx: Context, contact: Contact): Boolean {
|
private fun addAndroidContact(ctx: Context, contact: Contact): Boolean {
|
||||||
val cameraRotationMatrix = Matrix()
|
|
||||||
val ops = ArrayList<ContentProviderOperation>()
|
val ops = ArrayList<ContentProviderOperation>()
|
||||||
val rawContactInsertIndex = ops.size
|
val rawContactInsertIndex = ops.size
|
||||||
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
|
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
|
||||||
@@ -393,13 +410,8 @@ class ContactActivity : AppCompatActivity() {
|
|||||||
.withValue(Data.DATA1, contact.uri.substringAfter(":"))
|
.withValue(Data.DATA1, contact.uri.substringAfter(":"))
|
||||||
.build())
|
.build())
|
||||||
if (contact.avatarImage != null) {
|
if (contact.avatarImage != null) {
|
||||||
cameraRotationMatrix.postRotate(180F)
|
val photoData: ByteArray? = bitmapToPNGByteArray(contact.avatarImage!!)
|
||||||
val rotatedPhoto = Bitmap.createBitmap(contact.avatarImage!!, 0, 0,
|
|
||||||
contact.avatarImage!!.width, contact.avatarImage!!.height,
|
|
||||||
cameraRotationMatrix, false);
|
|
||||||
val photoData: ByteArray? = bitmapToPNGByteArray(rotatedPhoto)
|
|
||||||
if (photoData != null) {
|
if (photoData != null) {
|
||||||
Log.d("Baresip", "Adding photo")
|
|
||||||
ops.add(ContentProviderOperation
|
ops.add(ContentProviderOperation
|
||||||
.newInsert(ContactsContract.Data.CONTENT_URI)
|
.newInsert(ContactsContract.Data.CONTENT_URI)
|
||||||
.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
|
.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
|
||||||
@@ -420,8 +432,7 @@ class ContactActivity : AppCompatActivity() {
|
|||||||
private fun updateAndroidContact(ctx: Context, contactId: Long, contact: Contact) {
|
private fun updateAndroidContact(ctx: Context, contactId: Long, contact: Contact) {
|
||||||
val ops = ArrayList<ContentProviderOperation>()
|
val ops = ArrayList<ContentProviderOperation>()
|
||||||
val selection = ContactsContract.Data.CONTACT_ID + "='" + contactId.toString() +
|
val selection = ContactsContract.Data.CONTACT_ID + "='" + contactId.toString() +
|
||||||
"' AND " +
|
"' AND " + Data.MIMETYPE + "='" + CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'"
|
||||||
Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'"
|
|
||||||
if (contact.avatarImage != null) {
|
if (contact.avatarImage != null) {
|
||||||
val stream = ByteArrayOutputStream()
|
val stream = ByteArrayOutputStream()
|
||||||
contact.avatarImage!!.compress(Bitmap.CompressFormat.PNG, 100, stream)
|
contact.avatarImage!!.compress(Bitmap.CompressFormat.PNG, 100, stream)
|
||||||
@@ -441,7 +452,7 @@ class ContactActivity : AppCompatActivity() {
|
|||||||
Log.e("Baresip", "Update of contact $contactId failed")
|
Log.e("Baresip", "Update of contact $contactId failed")
|
||||||
}
|
}
|
||||||
val contentValues = ContentValues()
|
val contentValues = ContentValues()
|
||||||
contentValues.put(ContactsContract.Data.DATA1, contact.uri)
|
contentValues.put(ContactsContract.Data.DATA1, contact.uri.substringAfter("sip:"))
|
||||||
val where = ContactsContract.Data.CONTACT_ID + "=?" + " AND " + Data.MIMETYPE + "=?"
|
val where = ContactsContract.Data.CONTACT_ID + "=?" + " AND " + Data.MIMETYPE + "=?"
|
||||||
val args = arrayOf((contactId).toString(), CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE)
|
val args = arrayOf((contactId).toString(), CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE)
|
||||||
ctx.contentResolver.update(ContactsContract.Data.CONTENT_URI, contentValues, where, args)
|
ctx.contentResolver.update(ContactsContract.Data.CONTENT_URI, contentValues, where, args)
|
||||||
@@ -463,6 +474,8 @@ class ContactActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
|
var contact: Contact? = null
|
||||||
|
|
||||||
fun deleteAndroidContact(ctx: Context, contact: Contact): Int {
|
fun deleteAndroidContact(ctx: Context, contact: Contact): Int {
|
||||||
return ctx.contentResolver.delete(ContactsContract.RawContacts.CONTENT_URI,
|
return ctx.contentResolver.delete(ContactsContract.RawContacts.CONTENT_URI,
|
||||||
ContactsContract.Contacts.DISPLAY_NAME + "='" + contact.name + "'",
|
ContactsContract.Contacts.DISPLAY_NAME + "='" + contact.name + "'",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.tutpro.baresip
|
package com.tutpro.baresip
|
||||||
|
|
||||||
|
import android.Manifest
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.DialogInterface
|
import android.content.DialogInterface
|
||||||
@@ -126,9 +127,10 @@ class ContactListAdapter(private val ctx: Context, private val rows: ArrayList<C
|
|||||||
Log.e("Baresip", "Could not delete file '$id.img")
|
Log.e("Baresip", "Could not delete file '$id.img")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Contact.contacts().removeAt(position)
|
if (contact.androidContact &&
|
||||||
if (contact.androidContact)
|
Utils.checkPermission(ctx, Manifest.permission.WRITE_CONTACTS))
|
||||||
ContactActivity.deleteAndroidContact(ctx, contact)
|
ContactActivity.deleteAndroidContact(ctx, contact)
|
||||||
|
Contact.contacts().removeAt(position)
|
||||||
Contact.save()
|
Contact.save()
|
||||||
this.notifyDataSetChanged()
|
this.notifyDataSetChanged()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1780,7 +1780,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
const val BACKUP_PERMISSION_REQUEST_CODE = 1
|
const val BACKUP_PERMISSION_REQUEST_CODE = 1
|
||||||
const val RESTORE_PERMISSION_REQUEST_CODE = 2
|
const val RESTORE_PERMISSION_REQUEST_CODE = 2
|
||||||
const val RECORD_PERMISSION_REQUEST_CODE = 3
|
const val RECORD_PERMISSION_REQUEST_CODE = 3
|
||||||
const val CONTACT_PERMISSION_REQUEST_CODE = 4
|
const val CONTACTS_PERMISSION_REQUEST_CODE = 4
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -371,16 +371,21 @@ object Utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun checkPermission(ctx: Context, permission: String) : Boolean {
|
fun checkPermission(ctx: Context, permissions: String) : Boolean {
|
||||||
return ContextCompat.checkSelfPermission(ctx, permission) == PackageManager.PERMISSION_GRANTED
|
for (p in permissions.split("|")) {
|
||||||
|
if (ContextCompat.checkSelfPermission(ctx, p) != PackageManager.PERMISSION_GRANTED)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
fun requestPermission(ctx: Context, permission: String, requestCode: Int) : Boolean {
|
fun requestPermission(ctx: Context, permissions: String, requestCode: Int) : Boolean {
|
||||||
if (ContextCompat.checkSelfPermission(ctx, permission) != PackageManager.PERMISSION_GRANTED) {
|
val pArray = permissions.split("|").toTypedArray()
|
||||||
Log.w("Baresip", "Baresip does not have $permission permission")
|
for (p in pArray)
|
||||||
ActivityCompat.requestPermissions(ctx as Activity, arrayOf(permission), requestCode)
|
if (ContextCompat.checkSelfPermission(ctx, p) != PackageManager.PERMISSION_GRANTED) {
|
||||||
return false
|
ActivityCompat.requestPermissions(ctx as Activity, pArray, requestCode)
|
||||||
}
|
return false
|
||||||
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
(rekisteröintiä ei ole aktivoitu).</li>
|
(rekisteröintiä ei ole aktivoitu).</li>
|
||||||
<li>Pisteen kosketus johtaa suoraan tilin asetuksiin.</li>
|
<li>Pisteen kosketus johtaa suoraan tilin asetuksiin.</li>
|
||||||
<li>Pyyhkäisy alas aikaansaa parhaillaan näkyvissä olevan tilin uudelleen rekisteröinnin.</li>
|
<li>Pyyhkäisy alas aikaansaa parhaillaan näkyvissä olevan tilin uudelleen rekisteröinnin.</li>
|
||||||
<li>Voit lisätä puheluiden ja viestien kohteet kontakteihin pitkällä kosketuksella.</li>
|
<li>Voit lisätä puheluiden ja viestien kohteet yhteystietoihin pitkällä kosketuksella.</li>
|
||||||
<li>Pitkillä kosketuksilla voi myös poistaa puheluita, viestiketjuja, viestejä ja kontakteja.</li>
|
<li>Pitkillä kosketuksilla voi myös poistaa puheluita, viestiketjuja, viestejä ja yhteystietoja.</li>
|
||||||
<li>Voit lisätä/poistaa kontaktin avatar-kuvan koskettamalla kontaktin ikonia lyhyesti/pitkästi.</li>
|
<li>Voit lisätä/poistaa yhteystiedon avatar-kuvan koskettamalla yhteystiedon ikonia lyhyesti/pitkästi.</li>
|
||||||
<li>Voit valita edellisen puhelun uudelleen koskettamalla virheää luuria silloin,
|
<li>Voit valita edellisen puhelun uudelleen koskettamalla virheää luuria silloin,
|
||||||
kun puhelun kohde on tyhjä.</li>
|
kun puhelun kohde on tyhjä.</li>
|
||||||
<h2>Tunnetut ongelmat</h2>
|
<h2>Tunnetut ongelmat</h2>
|
||||||
@@ -55,9 +55,9 @@
|
|||||||
(rekisteröintiä ei ole aktivoitu).</li>
|
(rekisteröintiä ei ole aktivoitu).</li>
|
||||||
<li>Pisteen kosketus johtaa suoraan tilin asetuksiin.</li>
|
<li>Pisteen kosketus johtaa suoraan tilin asetuksiin.</li>
|
||||||
<li>Pyyhkäisy alas aikaansaa parhaillaan näkyvissä olevan tilin uudelleen rekisteröinnin.</li>
|
<li>Pyyhkäisy alas aikaansaa parhaillaan näkyvissä olevan tilin uudelleen rekisteröinnin.</li>
|
||||||
<li>Voit lisätä puheluiden ja viestien kohteet kontakteihin pitkällä kosketuksella.</li>
|
<li>Voit lisätä puheluiden ja viestien kohteet yhteystietoihin pitkällä kosketuksella.</li>
|
||||||
<li>Pitkillä kosketuksilla voi myös poistaa puheluita, viestiketjuja, viestejä ja kontakteja.</li>
|
<li>Pitkillä kosketuksilla voi myös poistaa puheluita, viestiketjuja, viestejä ja yhteystietoja.</li>
|
||||||
<li>Voit lisätä/poistaa kontaktin avatar-kuvan koskettamalla kontaktin ikonia lyhyesti/pitkästi.</li>
|
<li>Voit lisätä/poistaa yhteystiedon avatar-kuvan koskettamalla yhteystiedon ikonia lyhyesti/pitkästi.</li>
|
||||||
<li>Voit valita edellisen puhelun uudelleen koskettamalla virheää luuria silloin,
|
<li>Voit valita edellisen puhelun uudelleen koskettamalla virheää luuria silloin,
|
||||||
kun puhelun kohde on tyhjä.</li>
|
kun puhelun kohde on tyhjä.</li>
|
||||||
<li>Jos et puhelun aikana kuule, mitä toinen sanoo, kasvata median volyymia laitteessa
|
<li>Jos et puhelun aikana kuule, mitä toinen sanoo, kasvata median volyymia laitteessa
|
||||||
@@ -222,7 +222,7 @@
|
|||||||
<string name="calls_call_message_question">Haluatko soittaa tai lähettää viestin kohteeseen
|
<string name="calls_call_message_question">Haluatko soittaa tai lähettää viestin kohteeseen
|
||||||
\'%1$s\'?
|
\'%1$s\'?
|
||||||
</string>
|
</string>
|
||||||
<string name="calls_add_delete_question">Haluatko luoda uuden kontaktin \'%1$s\' tai poistaa
|
<string name="calls_add_delete_question">Haluatko luoda uuden yhteystiedon \'%1$s\' tai poistaa
|
||||||
%2$s puheluhistoriasta?
|
%2$s puheluhistoriasta?
|
||||||
</string>
|
</string>
|
||||||
<string name="calls_delete_question">Haluatko poistaa \'%1$s\' %2$s puheluhistoriasta?</string>
|
<string name="calls_delete_question">Haluatko poistaa \'%1$s\' %2$s puheluhistoriasta?</string>
|
||||||
@@ -235,9 +235,9 @@
|
|||||||
<string name="chat_with">Viestiketju %1$s</string>
|
<string name="chat_with">Viestiketju %1$s</string>
|
||||||
<string name="new_message">Uusi viesti</string>
|
<string name="new_message">Uusi viesti</string>
|
||||||
<string name="long_message_question">Haluatko poistaa viestin tai
|
<string name="long_message_question">Haluatko poistaa viestin tai
|
||||||
luoda uuden kontaktin \'%1$s\'?</string>
|
luoda uuden yhteystiedon \'%1$s\'?</string>
|
||||||
<string name="short_message_question">Haluatko poistaa viestin?</string>
|
<string name="short_message_question">Haluatko poistaa viestin?</string>
|
||||||
<string name="add_contact">Lisää kontakti</string>
|
<string name="add_contact">Lisää yhteystieto</string>
|
||||||
<string name="sending_failed">Viestin lähetys epäonnistui</string>
|
<string name="sending_failed">Viestin lähetys epäonnistui</string>
|
||||||
<string name="message_failed">Epäonnistui</string>
|
<string name="message_failed">Epäonnistui</string>
|
||||||
<!-- Chats Activity -->
|
<!-- Chats Activity -->
|
||||||
@@ -247,7 +247,7 @@
|
|||||||
<string name="new_chat_peer">Uusi viestin kohde</string>
|
<string name="new_chat_peer">Uusi viestin kohde</string>
|
||||||
<string name="invalid_chat_peer_uri">Virheellinen SIP URI</string>
|
<string name="invalid_chat_peer_uri">Virheellinen SIP URI</string>
|
||||||
<string name="long_chat_question">Haluatko poistaa viestiketjun tai
|
<string name="long_chat_question">Haluatko poistaa viestiketjun tai
|
||||||
luoda uuden kontaktin \'%1$s\'?</string>
|
luoda uuden yhteystiedon \'%1$s\'?</string>
|
||||||
<string name="short_chat_question">Haluatko poistaa viestiketjun \'%1$s\'?</string>
|
<string name="short_chat_question">Haluatko poistaa viestiketjun \'%1$s\'?</string>
|
||||||
<string name="delete_chats">Tyhjennä</string>
|
<string name="delete_chats">Tyhjennä</string>
|
||||||
<string name="delete_chats_alert">Haluatko tyhjentää tilin \'%1$s\' viestihistorian?</string>
|
<string name="delete_chats_alert">Haluatko tyhjentää tilin \'%1$s\' viestihistorian?</string>
|
||||||
@@ -333,19 +333,21 @@
|
|||||||
käyttöön. Käynnistä nyt?
|
käyttöön. Käynnistä nyt?
|
||||||
</string>
|
</string>
|
||||||
<!-- Contact Activity -->
|
<!-- Contact Activity -->
|
||||||
<string name="contact">Kontakti</string>
|
<string name="contact">Yhteystieto</string>
|
||||||
<string name="new_contact">Uusi kontakti</string>
|
<string name="new_contact">Uusi yhteystieto</string>
|
||||||
<string name="contact_name">Nimi</string>
|
<string name="contact_name">Nimi</string>
|
||||||
<string name="invalid_contact">Virheellinen kontaktin nimi \'%1$s\'</string>
|
<string name="invalid_contact">Virheellinen yhteystiedon nimi \'%1$s\'</string>
|
||||||
<string name="contact_already_exists">Kontakti \'%1$s\' on jo olemassa.</string>
|
<string name="contact_already_exists">Yhteystieto \'%1$s\' on jo olemassa.</string>
|
||||||
<string name="invalid_contact_uri">Virheellinen SIP URI \'%1$s\'</string>
|
<string name="invalid_contact_uri">Virheellinen SIP URI \'%1$s\'</string>
|
||||||
|
<string name="android_contact_help">Jos merkitty, tämä yhteystieto näkyy myös Androidin
|
||||||
|
yhteystiedoissa.</string>
|
||||||
<!-- Contacts Activity -->
|
<!-- Contacts Activity -->
|
||||||
<string name="contacts">Kontaktit</string>
|
<string name="contacts">Yhteystiedot</string>
|
||||||
<string name="contact_action_question">Haluatko soittaa tai lähettää
|
<string name="contact_action_question">Haluatko soittaa tai lähettää
|
||||||
viestin kontaktille \'%1$s\'?</string>
|
viestin ositteeseen \'%1$s\'?</string>
|
||||||
<string name="send_message">Lähetä viesti</string>
|
<string name="send_message">Lähetä viesti</string>
|
||||||
<string name="contact_delete_question">Haluatko poistaa kontaktin \'%1$s\'?</string>
|
<string name="contact_delete_question">Haluatko poistaa yhteystiedon \'%1$s\'?</string>
|
||||||
<string name="contacts_exceeded">Kontaktiesi enimmäismäärä %1$d on ylittynyt.</string>
|
<string name="contacts_exceeded">Yhteystietojesi enimmäismäärä %1$d on ylittynyt.</string>
|
||||||
<!-- Generic -->
|
<!-- Generic -->
|
||||||
<string name="alert">Varoitus</string>
|
<string name="alert">Varoitus</string>
|
||||||
<string name="info">Tieto</string>
|
<string name="info">Tieto</string>
|
||||||
|
|||||||
@@ -302,8 +302,7 @@
|
|||||||
<string name="contact_already_exists">Contact \'%1$s\' already exists.</string>
|
<string name="contact_already_exists">Contact \'%1$s\' already exists.</string>
|
||||||
<string name="invalid_contact_uri">Invalid SIP URI</string>
|
<string name="invalid_contact_uri">Invalid SIP URI</string>
|
||||||
<string name="android" translatable="false">Android</string>
|
<string name="android" translatable="false">Android</string>
|
||||||
<string name="android_contact_help">This information is exposed in Android contacts.</string>
|
<string name="android_contact_help">if checked, this contact is available also in Android contacts.</string>
|
||||||
|
|
||||||
<!-- Contacts Activity -->
|
<!-- Contacts Activity -->
|
||||||
<string name="contacts">Contacts</string>
|
<string name="contacts">Contacts</string>
|
||||||
<string name="contact_action_question">Do you want to call or send message to \'%1$s\'?</string>
|
<string name="contact_action_question">Do you want to call or send message to \'%1$s\'?</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user