Merge pull request #30 from SimpleMobileTools/master

upd
This commit is contained in:
solokot 2020-05-02 10:32:41 +03:00 committed by GitHub
commit d730cedaed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
37 changed files with 135 additions and 48 deletions

View File

@ -15,7 +15,7 @@ android {
defaultConfig {
applicationId "com.simplemobiletools.contacts.pro"
minSdkVersion 21
minSdkVersion 23
targetSdkVersion 29
versionCode 60
versionName "6.9.0"
@ -57,7 +57,7 @@ android {
}
dependencies {
implementation 'com.simplemobiletools:commons:5.27.1'
implementation 'com.simplemobiletools:commons:5.27.2'
implementation 'joda-time:joda-time:2.10.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4'
implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.5'

View File

@ -16,11 +16,10 @@ import android.util.Size
import android.view.WindowManager
import android.widget.RemoteViews
import androidx.core.app.NotificationCompat
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.MINUTE_SECONDS
import com.simplemobiletools.commons.helpers.isOreoMr1Plus
import com.simplemobiletools.commons.helpers.isOreoPlus
import com.simplemobiletools.commons.helpers.isQPlus
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.extensions.audioManager
import com.simplemobiletools.contacts.pro.extensions.config
@ -159,9 +158,11 @@ class CallActivity : SimpleActivity() {
private fun updateCallState(state: Int) {
when (state) {
Call.STATE_RINGING -> callRinging()
Call.STATE_ACTIVE -> callStarted()
Call.STATE_DISCONNECTED -> endCall()
Call.STATE_CONNECTING -> initOutgoingCallUI()
Call.STATE_SELECT_PHONE_ACCOUNT -> showPhoneAccountPicker()
}
if (state == Call.STATE_DISCONNECTED || state == Call.STATE_DISCONNECTING) {
@ -190,6 +191,10 @@ class CallActivity : SimpleActivity() {
ongoing_call_holder.beVisible()
}
private fun callRinging() {
incoming_call_holder.beVisible()
}
private fun callStarted() {
incoming_call_holder.beGone()
ongoing_call_holder.beVisible()
@ -197,6 +202,31 @@ class CallActivity : SimpleActivity() {
callTimer.scheduleAtFixedRate(getCallTimerUpdateTask(), 1000, 1000)
}
@SuppressLint("MissingPermission")
private fun showPhoneAccountPicker() {
if (!hasPermission(PERMISSION_READ_PHONE_STATE)) {
return
}
val items = ArrayList<RadioItem>()
telecomManager.callCapablePhoneAccounts.forEachIndexed { index, 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)"
}
val radioItem = RadioItem(index, label, phoneAccount.accountHandle)
items.add(radioItem)
}
RadioGroupDialog(this, items, titleId = R.string.select_sim) {
}
}
private fun endCall() {
CallManager.reject()
if (proximityWakeLock?.isHeld == true) {

View File

@ -1,10 +1,8 @@
package com.simplemobiletools.contacts.pro.activities
import android.annotation.SuppressLint
import android.annotation.TargetApi
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.telecom.PhoneAccount
import android.telecom.TelecomManager
@ -16,7 +14,6 @@ import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.helpers.REQUEST_CODE_SET_DEFAULT_DIALER
import com.simplemobiletools.contacts.pro.R
@TargetApi(Build.VERSION_CODES.M)
class DialerActivity : SimpleActivity() {
private var callNumber: Uri? = null

View File

@ -1,14 +1,11 @@
package com.simplemobiletools.contacts.pro.services
import android.content.Intent
import android.os.Build
import android.telecom.Call
import android.telecom.InCallService
import androidx.annotation.RequiresApi
import com.simplemobiletools.contacts.pro.activities.CallActivity
import com.simplemobiletools.contacts.pro.helpers.CallManager
@RequiresApi(Build.VERSION_CODES.M)
class CallService : InCallService() {
override fun onCallAdded(call: Call) {
super.onCallAdded(call)

View File

@ -44,7 +44,8 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/ongoing_call_holder"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:visibility="gone">
<ImageView
android:id="@+id/call_toggle_microphone"
@ -104,7 +105,8 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/incoming_call_holder"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:visibility="gone">
<ImageView
android:id="@+id/call_decline"

View File

@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/contact_wrapper"
android:layout_width="match_parent"
android:layout_height="match_parent">
@ -25,7 +23,7 @@
android:id="@+id/contact_photo"
android:layout_width="@dimen/contact_photo_size"
android:layout_height="@dimen/contact_photo_size"
android:layout_marginBottom="@dimen/normal_margin"/>
android:layout_marginBottom="@dimen/normal_margin" />
<ImageView
android:id="@+id/contact_toggle_favorite"
@ -39,7 +37,7 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/tiny_margin"
android:src="@drawable/ic_star_off_vector"
android:visibility="gone"/>
android:visibility="gone" />
<LinearLayout
android:id="@+id/contact_actions_holder"
@ -58,7 +56,7 @@
android:paddingLeft="@dimen/small_margin"
android:paddingRight="@dimen/small_margin"
android:scaleType="fitCenter"
android:src="@drawable/ic_email_vector"/>
android:src="@drawable/ic_email_vector" />
<ImageView
android:id="@+id/contact_start_call"
@ -70,7 +68,7 @@
android:paddingLeft="@dimen/small_margin"
android:paddingRight="@dimen/small_margin"
android:scaleType="fitCenter"
android:src="@drawable/ic_phone_vector"/>
android:src="@drawable/ic_phone_vector" />
<ImageView
android:id="@+id/contact_send_sms"
@ -82,7 +80,7 @@
android:paddingLeft="@dimen/small_margin"
android:paddingRight="@dimen/small_margin"
android:scaleType="fitCenter"
android:src="@drawable/ic_sms_vector"/>
android:src="@drawable/ic_sms_vector" />
</LinearLayout>
@ -94,7 +92,7 @@
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_person_vector"/>
android:src="@drawable/ic_person_vector" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/contact_prefix"
@ -110,7 +108,7 @@
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true"
android:textSize="@dimen/bigger_text_size"/>
android:textSize="@dimen/bigger_text_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/contact_first_name"
@ -126,7 +124,7 @@
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true"
android:textSize="@dimen/bigger_text_size"/>
android:textSize="@dimen/bigger_text_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/contact_middle_name"
@ -142,7 +140,7 @@
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true"
android:textSize="@dimen/bigger_text_size"/>
android:textSize="@dimen/bigger_text_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/contact_surname"
@ -158,7 +156,7 @@
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true"
android:textSize="@dimen/bigger_text_size"/>
android:textSize="@dimen/bigger_text_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/contact_suffix"
@ -174,7 +172,7 @@
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true"
android:textSize="@dimen/bigger_text_size"/>
android:textSize="@dimen/bigger_text_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/contact_nickname"
@ -190,7 +188,7 @@
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:singleLine="true"
android:textSize="@dimen/bigger_text_size"/>
android:textSize="@dimen/bigger_text_size" />
<ImageView
android:id="@+id/contact_numbers_image"
@ -432,11 +430,12 @@
android:id="@+id/contact_photo_big"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="0"
android:background="#88000000"
android:clickable="true"
android:padding="@dimen/activity_margin"
android:src="@drawable/img_write_storage"
android:scaleType="fitCenter"
android:visibility="gone"/>
android:src="@drawable/img_write_storage"
android:visibility="gone" />
</RelativeLayout>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Rychlé vytáčení</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -103,14 +103,16 @@
<!-- Dialer -->
<string name="dialer">Πληκτρολόγιο</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="accept">Αποδοχή</string>
<string name="decline">Απόρριψη</string>
<string name="unknown_caller">Άγνωστος</string>
<string name="is_calling">Καλεί</string>
<string name="dialing">Πληκτρολόγηση</string>
<string name="call_ended">Τέλος Κλήσης</string>
<string name="call_ending">Τερματισμός Κλήσης</string>
<string name="ongoing_call">Τρέχουσα κλήση</string>
<string name="select_sim">Επιλέξτε SIM για αυτήν την κλήση</string>
<string name="always_use_this_sim">Χρήση πάντα αυτής της SIM για αυτόν τον αριθμό</string>
<!-- Speed dial -->
<string name="speed_dial">Ταχεία Κλήση</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Snelkiezer</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Ligação rápida</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Вызов завершён</string>
<string name="call_ending">Завершение вызова</string>
<string name="ongoing_call">Текущий вызов</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Быстрый набор</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Hovor ukončený</string>
<string name="call_ending">Hovor končí</string>
<string name="ongoing_call">Prebiehajúci hovor</string>
<string name="select_sim">Zvoľte SIM pre tento hovor</string>
<string name="always_use_this_sim">Stále použiť túto SIM pri volaní tohto čísla</string>
<!-- Speed dial -->
<string name="speed_dial">Rýchle vytáčanie</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -103,14 +103,16 @@
<!-- Dialer -->
<string name="dialer">Çevirici</string>
<string name="accept">Accept</string>
<string name="decline">Decline</string>
<string name="unknown_caller">Unknown Caller</string>
<string name="is_calling">Is Calling</string>
<string name="dialing">Dialing</string>
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="accept">Kabul Et</string>
<string name="decline">Reddet</string>
<string name="unknown_caller">Bilinmeyen Arama</string>
<string name="is_calling">Arıyor</string>
<string name="dialing">Çevriliyor</string>
<string name="call_ended">Arama Sonlandırıldı</string>
<string name="call_ending">Arama Sonlandırılıyor</string>
<string name="ongoing_call">Devam Eden Arama</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Hızlı arama</string>
@ -173,7 +175,7 @@
Bu basit kişi düzenleyicisi, ana ekranda telefon numaralarını göstermek, kişi küçük resminin görünürlüğünü değiştirmek, yalnızca telefon numaralarına sahip kişileri göstermek, bir arama başlatmadan önce bir arama onay kutusu göstermek gibi birçok kullanışlı ayara sahiptir. Harfleri de kullanan hızlı bir çevirici ile birlikte gelir.
Kullanıcı deneyimini daha da geliştirmek için, bir kişiye tıklandığında neler olacağını özelleştirebilirsiniz. Bir çağrı başlatabilir, Ayrıntıları Görüntüle ekranına gidebilir veya seçilen kişiyi düzenleyebilirsiniz.
Kullanıcı deneyimini daha da geliştirmek için, bir kişiye tıklandığında neler olacağını özelleştirebilirsiniz. Bir arama başlatabilir, Ayrıntıları Görüntüle ekranına gidebilir veya seçilen kişiyi düzenleyebilirsiniz.
İstenmeyen gelen aramaları önlemek için telefon numaralarını kolayca engelleyebilirsiniz.

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">快速撥號</string>

View File

@ -111,6 +111,8 @@
<string name="call_ended">Call Ended</string>
<string name="call_ending">Call Ending</string>
<string name="ongoing_call">Ongoing Call</string>
<string name="select_sim">Select a SIM for this call</string>
<string name="always_use_this_sim">Always use this SIM for this number</string>
<!-- Speed dial -->
<string name="speed_dial">Speed dial</string>