Merge branch 'release/4.4' into master
This commit is contained in:
commit
1198551254
55 changed files with 1049 additions and 1003 deletions
11
CHANGELOG.md
11
CHANGELOG.md
|
@ -10,10 +10,19 @@ Group changes to describe their impact on the project, as follows:
|
|||
Fixed for any bug fixes.
|
||||
Security to invite users to upgrade in case of vulnerabilities.
|
||||
|
||||
### [4.4.0] - Unreleased
|
||||
### [4.4.0] - 2021-03-29
|
||||
|
||||
### Added
|
||||
- Dedicated notification channel for missed calls
|
||||
|
||||
### Changed
|
||||
- SDK updated to 4.5.0
|
||||
- Min Android version updated from 21 to 23 (Android 6) due to SDK audio routes feature
|
||||
- Rely on SDK audio routes feature instead of doing it in the application
|
||||
- User can now check incoming messages delivery status in group chat rooms
|
||||
- Asking user to read and accept privacy policy and general terms
|
||||
- Updated translations
|
||||
- Various crashes & issues fixed
|
||||
|
||||
## [4.3.0] - 2020-06-23
|
||||
|
||||
|
|
|
@ -41,6 +41,22 @@ task getGitVersion() {
|
|||
project.version = gitVersion
|
||||
}
|
||||
|
||||
configurations {
|
||||
customImpl.extendsFrom(implementation)
|
||||
}
|
||||
|
||||
task linphoneSdkSource() {
|
||||
doLast {
|
||||
configurations.customImpl.getIncoming().each {
|
||||
it.getResolutionResult().allComponents.each {
|
||||
if (it.id.getDisplayName().contains("linphone-sdk-android")) {
|
||||
println 'Linphone SDK used is ' + it.moduleVersion.version + ' from ' + it.properties["repositoryName"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///// Exclude Files /////
|
||||
|
||||
def excludeFiles = []
|
||||
|
@ -63,14 +79,17 @@ excludePackage.add('**/LICENSE.txt')
|
|||
|
||||
repositories {
|
||||
maven {
|
||||
name "local linphone-sdk maven repository"
|
||||
url file(LinphoneSdkBuildDir + '/maven_repository/')
|
||||
}
|
||||
maven {
|
||||
name "linphone.org maven repository"
|
||||
url "https://linphone.org/maven_repository"
|
||||
}
|
||||
}
|
||||
|
||||
project.tasks['preBuild'].dependsOn 'getGitVersion'
|
||||
project.tasks['preBuild'].dependsOn 'linphoneSdkSource'
|
||||
|
||||
android {
|
||||
lintOptions {
|
||||
|
@ -81,7 +100,7 @@ android {
|
|||
defaultConfig {
|
||||
minSdkVersion 23
|
||||
targetSdkVersion 29
|
||||
versionCode 4300
|
||||
versionCode 4400
|
||||
versionName "${project.version}"
|
||||
applicationId getPackageName()
|
||||
multiDexEnabled true
|
||||
|
@ -168,6 +187,7 @@ dependencies {
|
|||
if (firebaseEnabled()) {
|
||||
implementation 'com.google.firebase:firebase-messaging:19.0.1'
|
||||
}
|
||||
implementation 'androidx.media:media:1.2.0'
|
||||
implementation 'androidx.recyclerview:recyclerview:1.0.0'
|
||||
implementation 'androidx.appcompat:appcompat:1.1.0'
|
||||
implementation 'com.google.android:flexbox:1.1.0'
|
||||
|
|
|
@ -20,9 +20,7 @@
|
|||
package org.linphone;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.hardware.Sensor;
|
||||
import android.hardware.SensorEvent;
|
||||
import android.hardware.SensorEventListener;
|
||||
|
@ -33,20 +31,13 @@ import android.os.PowerManager;
|
|||
import android.os.PowerManager.WakeLock;
|
||||
import android.telephony.PhoneStateListener;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.CheckBox;
|
||||
import java.io.File;
|
||||
import java.sql.Timestamp;
|
||||
import java.util.Date;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
import org.linphone.assistant.PhoneAccountLinkingAssistantActivity;
|
||||
import org.linphone.call.AndroidAudioManager;
|
||||
import org.linphone.call.CallManager;
|
||||
import org.linphone.contacts.ContactsManager;
|
||||
import org.linphone.core.AccountCreator;
|
||||
import org.linphone.core.AccountCreatorListenerStub;
|
||||
import org.linphone.core.Call;
|
||||
import org.linphone.core.Call.State;
|
||||
import org.linphone.core.Core;
|
||||
|
@ -92,7 +83,6 @@ public class LinphoneManager implements SensorEventListener {
|
|||
private Core mCore;
|
||||
private CoreListenerStub mCoreListener;
|
||||
private AccountCreator mAccountCreator;
|
||||
private AccountCreatorListenerStub mAccountCreatorListener;
|
||||
|
||||
private boolean mExited;
|
||||
private boolean mCallGsmON;
|
||||
|
@ -185,7 +175,6 @@ public class LinphoneManager implements SensorEventListener {
|
|||
if (mCore != null) {
|
||||
if (mCore.getCallsNb() > 0) {
|
||||
mCallManager.acceptCall(call);
|
||||
mAudioManager.routeAudioToEarPiece();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -224,39 +213,6 @@ public class LinphoneManager implements SensorEventListener {
|
|||
list.removeListener(ContactsManager.getInstance());
|
||||
}
|
||||
};
|
||||
|
||||
mAccountCreatorListener =
|
||||
new AccountCreatorListenerStub() {
|
||||
@Override
|
||||
public void onIsAccountExist(
|
||||
AccountCreator accountCreator,
|
||||
AccountCreator.Status status,
|
||||
String resp) {
|
||||
if (status.equals(AccountCreator.Status.AccountExist)) {
|
||||
accountCreator.isAccountLinked();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLinkAccount(
|
||||
AccountCreator accountCreator,
|
||||
AccountCreator.Status status,
|
||||
String resp) {
|
||||
if (status.equals(AccountCreator.Status.AccountNotLinked)) {
|
||||
askLinkWithPhoneNumber();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onIsAccountLinked(
|
||||
AccountCreator accountCreator,
|
||||
AccountCreator.Status status,
|
||||
String resp) {
|
||||
if (status.equals(AccountCreator.Status.AccountNotLinked)) {
|
||||
askLinkWithPhoneNumber();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static synchronized LinphoneManager getInstance() {
|
||||
|
@ -315,15 +271,6 @@ public class LinphoneManager implements SensorEventListener {
|
|||
|
||||
private void destroyCore() {
|
||||
Log.w("[Manager] Destroying Core");
|
||||
if (LinphonePreferences.instance() != null) {
|
||||
// We set network reachable at false before destroying the Core
|
||||
// to not send a register with expires at 0
|
||||
if (LinphonePreferences.instance().isPushNotificationEnabled()) {
|
||||
Log.w(
|
||||
"[Manager] Setting network reachability to False to prevent unregister and allow incoming push notifications");
|
||||
mCore.setNetworkReachable(false);
|
||||
}
|
||||
}
|
||||
mCore.stop();
|
||||
mCore.removeListener(mCoreListener);
|
||||
}
|
||||
|
@ -462,7 +409,6 @@ public class LinphoneManager implements SensorEventListener {
|
|||
resetCameraFromPreferences();
|
||||
|
||||
mAccountCreator = mCore.createAccountCreator(LinphonePreferences.instance().getXmlrpcUrl());
|
||||
mAccountCreator.setListener(mAccountCreatorListener);
|
||||
mCallGsmON = false;
|
||||
|
||||
Log.i("[Manager] Core configured");
|
||||
|
@ -499,99 +445,10 @@ public class LinphoneManager implements SensorEventListener {
|
|||
Log.w("[Manager] Account creator shouldn't be null !");
|
||||
mAccountCreator =
|
||||
mCore.createAccountCreator(LinphonePreferences.instance().getXmlrpcUrl());
|
||||
mAccountCreator.setListener(mAccountCreatorListener);
|
||||
}
|
||||
return mAccountCreator;
|
||||
}
|
||||
|
||||
public void isAccountWithAlias() {
|
||||
if (mCore.getDefaultProxyConfig() != null) {
|
||||
long now = new Timestamp(new Date().getTime()).getTime();
|
||||
AccountCreator accountCreator = getAccountCreator();
|
||||
if (LinphonePreferences.instance().getLinkPopupTime() == null
|
||||
|| Long.parseLong(LinphonePreferences.instance().getLinkPopupTime()) < now) {
|
||||
accountCreator.reset();
|
||||
accountCreator.setUsername(
|
||||
LinphonePreferences.instance()
|
||||
.getAccountUsername(
|
||||
LinphonePreferences.instance().getDefaultAccountIndex()));
|
||||
accountCreator.isAccountExist();
|
||||
}
|
||||
} else {
|
||||
LinphonePreferences.instance().setLinkPopupTime(null);
|
||||
}
|
||||
}
|
||||
|
||||
private void askLinkWithPhoneNumber() {
|
||||
if (!LinphonePreferences.instance().isLinkPopupEnabled()) return;
|
||||
|
||||
long now = new Timestamp(new Date().getTime()).getTime();
|
||||
if (LinphonePreferences.instance().getLinkPopupTime() != null
|
||||
&& Long.parseLong(LinphonePreferences.instance().getLinkPopupTime()) >= now) return;
|
||||
|
||||
ProxyConfig proxyConfig = mCore.getDefaultProxyConfig();
|
||||
if (proxyConfig == null) return;
|
||||
if (!proxyConfig.getDomain().equals(getString(R.string.default_domain))) return;
|
||||
|
||||
long future =
|
||||
new Timestamp(
|
||||
mContext.getResources()
|
||||
.getInteger(
|
||||
R.integer.phone_number_linking_popup_time_interval))
|
||||
.getTime();
|
||||
long newDate = now + future;
|
||||
|
||||
LinphonePreferences.instance().setLinkPopupTime(String.valueOf(newDate));
|
||||
|
||||
final Dialog dialog =
|
||||
LinphoneUtils.getDialog(
|
||||
mContext,
|
||||
String.format(
|
||||
getString(R.string.link_account_popup),
|
||||
proxyConfig.getIdentityAddress().asStringUriOnly()));
|
||||
Button delete = dialog.findViewById(R.id.dialog_delete_button);
|
||||
delete.setVisibility(View.GONE);
|
||||
Button ok = dialog.findViewById(R.id.dialog_ok_button);
|
||||
ok.setText(getString(R.string.link));
|
||||
ok.setVisibility(View.VISIBLE);
|
||||
Button cancel = dialog.findViewById(R.id.dialog_cancel_button);
|
||||
cancel.setText(getString(R.string.maybe_later));
|
||||
|
||||
dialog.findViewById(R.id.dialog_do_not_ask_again_layout).setVisibility(View.VISIBLE);
|
||||
final CheckBox doNotAskAgain = dialog.findViewById(R.id.doNotAskAgain);
|
||||
dialog.findViewById(R.id.doNotAskAgainLabel)
|
||||
.setOnClickListener(
|
||||
new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
doNotAskAgain.setChecked(!doNotAskAgain.isChecked());
|
||||
}
|
||||
});
|
||||
|
||||
ok.setOnClickListener(
|
||||
new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
Intent assistant = new Intent();
|
||||
assistant.setClass(mContext, PhoneAccountLinkingAssistantActivity.class);
|
||||
mContext.startActivity(assistant);
|
||||
dialog.dismiss();
|
||||
}
|
||||
});
|
||||
|
||||
cancel.setOnClickListener(
|
||||
new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if (doNotAskAgain.isChecked()) {
|
||||
LinphonePreferences.instance().enableLinkPopup(false);
|
||||
}
|
||||
dialog.dismiss();
|
||||
}
|
||||
});
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
/* Presence stuff */
|
||||
|
||||
private boolean isPresenceModelActivitySet() {
|
||||
|
|
|
@ -43,10 +43,13 @@ import android.widget.TextView;
|
|||
import android.widget.Toast;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import androidx.drawerlayout.widget.DrawerLayout;
|
||||
import java.sql.Timestamp;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import org.linphone.LinphoneContext;
|
||||
import org.linphone.LinphoneManager;
|
||||
import org.linphone.R;
|
||||
import org.linphone.assistant.PhoneAccountLinkingAssistantActivity;
|
||||
import org.linphone.call.CallActivity;
|
||||
import org.linphone.call.CallIncomingActivity;
|
||||
import org.linphone.call.CallOutgoingActivity;
|
||||
|
@ -55,8 +58,9 @@ import org.linphone.compatibility.Compatibility;
|
|||
import org.linphone.contacts.ContactsActivity;
|
||||
import org.linphone.contacts.ContactsManager;
|
||||
import org.linphone.contacts.LinphoneContact;
|
||||
import org.linphone.core.AccountCreator;
|
||||
import org.linphone.core.AccountCreatorListenerStub;
|
||||
import org.linphone.core.Address;
|
||||
import org.linphone.core.AuthInfo;
|
||||
import org.linphone.core.Call;
|
||||
import org.linphone.core.ChatMessage;
|
||||
import org.linphone.core.ChatRoom;
|
||||
|
@ -99,6 +103,7 @@ public abstract class MainActivity extends LinphoneGenericActivity
|
|||
protected String[] mPermissionsToHave;
|
||||
|
||||
private CoreListenerStub mListener;
|
||||
private AccountCreatorListenerStub mAccountCreatorListener;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
|
@ -228,15 +233,10 @@ public abstract class MainActivity extends LinphoneGenericActivity
|
|||
MainActivity.this);
|
||||
|
||||
if (getResources().getBoolean(R.bool.use_phone_number_validation)) {
|
||||
AuthInfo authInfo =
|
||||
core.findAuthInfo(
|
||||
proxyConfig.getRealm(),
|
||||
proxyConfig.getIdentityAddress().getUsername(),
|
||||
proxyConfig.getDomain());
|
||||
if (authInfo != null
|
||||
&& authInfo.getDomain()
|
||||
.equals(getString(R.string.default_domain))) {
|
||||
LinphoneManager.getInstance().isAccountWithAlias();
|
||||
if (proxyConfig
|
||||
.getDomain()
|
||||
.equals(getString(R.string.default_domain))) {
|
||||
isAccountWithAlias();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -269,6 +269,39 @@ public abstract class MainActivity extends LinphoneGenericActivity
|
|||
}
|
||||
}
|
||||
};
|
||||
|
||||
mAccountCreatorListener =
|
||||
new AccountCreatorListenerStub() {
|
||||
@Override
|
||||
public void onIsAccountExist(
|
||||
AccountCreator accountCreator,
|
||||
AccountCreator.Status status,
|
||||
String resp) {
|
||||
if (status.equals(AccountCreator.Status.AccountExist)) {
|
||||
accountCreator.isAccountLinked();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLinkAccount(
|
||||
AccountCreator accountCreator,
|
||||
AccountCreator.Status status,
|
||||
String resp) {
|
||||
if (status.equals(AccountCreator.Status.AccountNotLinked)) {
|
||||
askLinkWithPhoneNumber();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onIsAccountLinked(
|
||||
AccountCreator accountCreator,
|
||||
AccountCreator.Status status,
|
||||
String resp) {
|
||||
if (status.equals(AccountCreator.Status.AccountNotLinked)) {
|
||||
askLinkWithPhoneNumber();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -559,6 +592,7 @@ public abstract class MainActivity extends LinphoneGenericActivity
|
|||
if (LinphoneContext.isReady()) {
|
||||
ContactsManager.getInstance().enableContactsAccess();
|
||||
ContactsManager.getInstance().initializeContactManager();
|
||||
ContactsManager.getInstance().fetchContactsAsync();
|
||||
}
|
||||
}
|
||||
} else if (permissions[i].equals(Manifest.permission.READ_EXTERNAL_STORAGE)) {
|
||||
|
@ -813,6 +847,101 @@ public abstract class MainActivity extends LinphoneGenericActivity
|
|||
dialog.show();
|
||||
}
|
||||
|
||||
public void isAccountWithAlias() {
|
||||
if (LinphoneManager.getCore().getDefaultProxyConfig() != null) {
|
||||
long now = new Timestamp(new Date().getTime()).getTime();
|
||||
AccountCreator accountCreator = LinphoneManager.getInstance().getAccountCreator();
|
||||
accountCreator.setListener(mAccountCreatorListener);
|
||||
if (LinphonePreferences.instance().getLinkPopupTime() == null
|
||||
|| Long.parseLong(LinphonePreferences.instance().getLinkPopupTime()) < now) {
|
||||
accountCreator.reset();
|
||||
accountCreator.setUsername(
|
||||
LinphonePreferences.instance()
|
||||
.getAccountUsername(
|
||||
LinphonePreferences.instance().getDefaultAccountIndex()));
|
||||
accountCreator.isAccountExist();
|
||||
}
|
||||
} else {
|
||||
LinphonePreferences.instance().setLinkPopupTime(null);
|
||||
}
|
||||
}
|
||||
|
||||
private void askLinkWithPhoneNumber() {
|
||||
if (!LinphonePreferences.instance().isLinkPopupEnabled()) return;
|
||||
|
||||
long now = new Timestamp(new Date().getTime()).getTime();
|
||||
if (LinphonePreferences.instance().getLinkPopupTime() != null
|
||||
&& Long.parseLong(LinphonePreferences.instance().getLinkPopupTime()) >= now) return;
|
||||
|
||||
ProxyConfig proxyConfig = LinphoneManager.getCore().getDefaultProxyConfig();
|
||||
if (proxyConfig == null) return;
|
||||
if (!proxyConfig.getDomain().equals(getString(R.string.default_domain))) return;
|
||||
|
||||
final Dialog dialog =
|
||||
LinphoneUtils.getDialog(
|
||||
this,
|
||||
String.format(
|
||||
getString(R.string.link_account_popup),
|
||||
proxyConfig.getIdentityAddress().asStringUriOnly()));
|
||||
Button delete = dialog.findViewById(R.id.dialog_delete_button);
|
||||
delete.setVisibility(View.GONE);
|
||||
Button ok = dialog.findViewById(R.id.dialog_ok_button);
|
||||
ok.setText(getString(R.string.link));
|
||||
ok.setVisibility(View.VISIBLE);
|
||||
Button cancel = dialog.findViewById(R.id.dialog_cancel_button);
|
||||
cancel.setText(getString(R.string.maybe_later));
|
||||
|
||||
dialog.findViewById(R.id.dialog_do_not_ask_again_layout).setVisibility(View.VISIBLE);
|
||||
final CheckBox doNotAskAgain = dialog.findViewById(R.id.doNotAskAgain);
|
||||
dialog.findViewById(R.id.doNotAskAgainLabel)
|
||||
.setOnClickListener(
|
||||
new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
doNotAskAgain.setChecked(!doNotAskAgain.isChecked());
|
||||
}
|
||||
});
|
||||
|
||||
ok.setOnClickListener(
|
||||
new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
Intent assistant = new Intent();
|
||||
assistant.setClass(
|
||||
MainActivity.this, PhoneAccountLinkingAssistantActivity.class);
|
||||
startActivity(assistant);
|
||||
updatePopupTimestamp();
|
||||
dialog.dismiss();
|
||||
}
|
||||
});
|
||||
|
||||
cancel.setOnClickListener(
|
||||
new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if (doNotAskAgain.isChecked()) {
|
||||
LinphonePreferences.instance().enableLinkPopup(false);
|
||||
}
|
||||
updatePopupTimestamp();
|
||||
dialog.dismiss();
|
||||
}
|
||||
});
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
private void updatePopupTimestamp() {
|
||||
long future =
|
||||
new Timestamp(
|
||||
getResources()
|
||||
.getInteger(
|
||||
R.integer.phone_number_linking_popup_time_interval))
|
||||
.getTime();
|
||||
long now = new Timestamp(new Date().getTime()).getTime();
|
||||
long newDate = now + future;
|
||||
|
||||
LinphonePreferences.instance().setLinkPopupTime(String.valueOf(newDate));
|
||||
}
|
||||
|
||||
// Logs
|
||||
|
||||
private void shareUploadedLogsUrl(String info) {
|
||||
|
|
|
@ -163,6 +163,8 @@ public abstract class AssistantActivity extends LinphoneGenericActivity
|
|||
LinphoneContext.instance().getNotificationManager().startForeground();
|
||||
}
|
||||
}
|
||||
LinphonePreferences.instance()
|
||||
.setPushNotificationEnabled(!isGenericAccount || useLinphoneDefaultValues);
|
||||
|
||||
if (proxyConfig == null) {
|
||||
Log.e("[Assistant] Account creator couldn't create proxy config");
|
||||
|
|
|
@ -20,9 +20,7 @@
|
|||
package org.linphone.assistant;
|
||||
|
||||
import android.Manifest;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.media.AudioManager;
|
||||
import android.os.Bundle;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
|
@ -117,13 +115,9 @@ public class EchoCancellerCalibrationAssistantActivity extends AssistantActivity
|
|||
Core core, EcCalibratorStatus status, int delayMs) {
|
||||
if (status == EcCalibratorStatus.InProgress) return;
|
||||
core.removeListener(this);
|
||||
LinphoneManager.getAudioManager().routeAudioToEarPiece();
|
||||
goToLinphoneActivity();
|
||||
|
||||
((AudioManager) getSystemService(Context.AUDIO_SERVICE))
|
||||
.setMode(AudioManager.MODE_NORMAL);
|
||||
}
|
||||
});
|
||||
LinphoneManager.getAudioManager().startEcCalibration();
|
||||
LinphoneManager.getCore().startEchoCancellerCalibration();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,11 +20,22 @@
|
|||
package org.linphone.assistant;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.text.Spannable;
|
||||
import android.text.SpannableString;
|
||||
import android.text.Spanned;
|
||||
import android.text.method.LinkMovementMethod;
|
||||
import android.text.style.ClickableSpan;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.View;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.TextView;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import org.linphone.R;
|
||||
import org.linphone.settings.LinphonePreferences;
|
||||
|
||||
|
@ -122,6 +133,8 @@ public class MenuAssistantActivity extends AssistantActivity {
|
|||
PhoneAccountCreationAssistantActivity.class));
|
||||
finish();
|
||||
}
|
||||
|
||||
setUpTermsAndPrivacyLinks();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -158,4 +171,92 @@ public class MenuAssistantActivity extends AssistantActivity {
|
|||
}
|
||||
return super.onKeyDown(keyCode, event);
|
||||
}
|
||||
|
||||
private void setUpTermsAndPrivacyLinks() {
|
||||
String terms = getString(R.string.assistant_general_terms);
|
||||
String privacy = getString(R.string.assistant_privacy_policy);
|
||||
|
||||
String label = getString(R.string.assistant_read_and_agree_terms, terms, privacy);
|
||||
Spannable spannable = new SpannableString(label);
|
||||
|
||||
Matcher termsMatcher = Pattern.compile(terms).matcher(label);
|
||||
if (termsMatcher.find()) {
|
||||
ClickableSpan clickableSpan =
|
||||
new ClickableSpan() {
|
||||
@Override
|
||||
public void onClick(@NonNull View widget) {
|
||||
Intent browserIntent =
|
||||
new Intent(
|
||||
Intent.ACTION_VIEW,
|
||||
Uri.parse(
|
||||
getString(
|
||||
R.string
|
||||
.assistant_general_terms_link)));
|
||||
startActivity(browserIntent);
|
||||
}
|
||||
};
|
||||
spannable.setSpan(
|
||||
clickableSpan,
|
||||
termsMatcher.start(0),
|
||||
termsMatcher.end(),
|
||||
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
}
|
||||
|
||||
Matcher privacyMatcher = Pattern.compile(privacy).matcher(label);
|
||||
if (privacyMatcher.find()) {
|
||||
ClickableSpan clickableSpan =
|
||||
new ClickableSpan() {
|
||||
@Override
|
||||
public void onClick(@NonNull View widget) {
|
||||
Intent browserIntent =
|
||||
new Intent(
|
||||
Intent.ACTION_VIEW,
|
||||
Uri.parse(
|
||||
getString(
|
||||
R.string
|
||||
.assistant_privacy_policy_link)));
|
||||
startActivity(browserIntent);
|
||||
}
|
||||
};
|
||||
spannable.setSpan(
|
||||
clickableSpan,
|
||||
privacyMatcher.start(0),
|
||||
privacyMatcher.end(),
|
||||
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
}
|
||||
|
||||
TextView termsAndPrivacy = findViewById(R.id.terms_and_privacy);
|
||||
final CheckBox termsAndPrivacyCheckBox = findViewById(R.id.terms_and_privacy_checkbox);
|
||||
|
||||
termsAndPrivacy.setText(spannable);
|
||||
termsAndPrivacy.setMovementMethod(new LinkMovementMethod());
|
||||
if (LinphonePreferences.instance().getReadAndAgreeTermsAndPrivacy()) {
|
||||
termsAndPrivacyCheckBox.setEnabled(false);
|
||||
termsAndPrivacyCheckBox.setChecked(true);
|
||||
} else {
|
||||
final TextView accountCreation = findViewById(R.id.account_creation);
|
||||
final TextView accountConnection = findViewById(R.id.account_connection);
|
||||
final TextView genericConnection = findViewById(R.id.generic_connection);
|
||||
final TextView remoteConfiguration = findViewById(R.id.remote_configuration);
|
||||
accountCreation.setEnabled(false);
|
||||
accountConnection.setEnabled(false);
|
||||
genericConnection.setEnabled(false);
|
||||
remoteConfiguration.setEnabled(false);
|
||||
|
||||
termsAndPrivacyCheckBox.setOnCheckedChangeListener(
|
||||
new CompoundButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
if (isChecked) {
|
||||
LinphonePreferences.instance().setReadAndAgreeTermsAndPrivacy(true);
|
||||
termsAndPrivacyCheckBox.setEnabled(false);
|
||||
accountCreation.setEnabled(true);
|
||||
accountConnection.setEnabled(true);
|
||||
genericConnection.setEnabled(true);
|
||||
remoteConfiguration.setEnabled(true);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -52,8 +52,11 @@ public class PhoneAccountLinkingAssistantActivity extends AssistantActivity {
|
|||
|
||||
setContentView(R.layout.assistant_phone_account_linking);
|
||||
|
||||
if (getIntent() != null && getIntent().hasExtra("AccountNumber")) {
|
||||
int proxyConfigIndex = getIntent().getExtras().getInt("AccountNumber");
|
||||
if (getIntent() != null) {
|
||||
int proxyConfigIndex = 0;
|
||||
if (getIntent().hasExtra("AccountNumber"))
|
||||
proxyConfigIndex = getIntent().getExtras().getInt("AccountNumber");
|
||||
|
||||
Core core = LinphoneManager.getCore();
|
||||
if (core == null) {
|
||||
Log.e("[Account Linking Assistant] Core not available");
|
||||
|
@ -96,10 +99,6 @@ public class PhoneAccountLinkingAssistantActivity extends AssistantActivity {
|
|||
unexpectedError();
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
Log.e("[Account Linking Assistant] Proxy config index not found");
|
||||
unexpectedError();
|
||||
return;
|
||||
}
|
||||
|
||||
mCountryPicker = findViewById(R.id.select_country);
|
||||
|
|
|
@ -19,69 +19,31 @@
|
|||
*/
|
||||
package org.linphone.call;
|
||||
|
||||
import static android.media.AudioManager.MODE_RINGTONE;
|
||||
import static android.media.AudioManager.STREAM_RING;
|
||||
import static android.media.AudioManager.STREAM_VOICE_CALL;
|
||||
|
||||
import android.bluetooth.BluetoothAdapter;
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.bluetooth.BluetoothHeadset;
|
||||
import android.bluetooth.BluetoothProfile;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.media.AudioManager;
|
||||
import android.media.MediaPlayer;
|
||||
import android.net.Uri;
|
||||
import android.os.Vibrator;
|
||||
import android.provider.Settings;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.view.KeyEvent;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import org.linphone.LinphoneContext;
|
||||
import org.linphone.LinphoneManager;
|
||||
import org.linphone.R;
|
||||
import org.linphone.compatibility.Compatibility;
|
||||
import org.linphone.core.Address;
|
||||
import org.linphone.core.AudioDevice;
|
||||
import org.linphone.core.Call;
|
||||
import org.linphone.core.Core;
|
||||
import org.linphone.core.CoreListenerStub;
|
||||
import org.linphone.core.EcCalibratorStatus;
|
||||
import org.linphone.core.tools.Log;
|
||||
import org.linphone.receivers.BluetoothReceiver;
|
||||
import org.linphone.receivers.HeadsetReceiver;
|
||||
import org.linphone.settings.LinphonePreferences;
|
||||
|
||||
public class AndroidAudioManager {
|
||||
private Context mContext;
|
||||
private AudioManager mAudioManager;
|
||||
private Call mRingingCall;
|
||||
private MediaPlayer mRingerPlayer;
|
||||
private final Vibrator mVibrator;
|
||||
private BluetoothAdapter mBluetoothAdapter;
|
||||
private BluetoothHeadset mBluetoothHeadset;
|
||||
private BluetoothReceiver mBluetoothReceiver;
|
||||
private HeadsetReceiver mHeadsetReceiver;
|
||||
private boolean mHeadsetReceiverRegistered;
|
||||
|
||||
private boolean mIsRinging;
|
||||
private boolean mAudioFocused;
|
||||
private boolean mEchoTesterIsRunning;
|
||||
private boolean mIsBluetoothHeadsetConnected;
|
||||
private boolean mIsBluetoothHeadsetScoConnected;
|
||||
private boolean mEchoTesterIsRunning = false;
|
||||
private boolean mPreviousStateIsConnected = false;
|
||||
|
||||
private CoreListenerStub mListener;
|
||||
|
||||
public AndroidAudioManager(Context context) {
|
||||
mContext = context;
|
||||
mAudioManager = ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE));
|
||||
mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
|
||||
mEchoTesterIsRunning = false;
|
||||
mHeadsetReceiverRegistered = false;
|
||||
|
||||
startBluetooth();
|
||||
mPreviousStateIsConnected = false;
|
||||
|
||||
mListener =
|
||||
new CoreListenerStub() {
|
||||
|
@ -91,36 +53,9 @@ public class AndroidAudioManager {
|
|||
final Call call,
|
||||
final Call.State state,
|
||||
final String message) {
|
||||
if (state == Call.State.IncomingReceived
|
||||
|| (state == Call.State.IncomingEarlyMedia
|
||||
&& mContext.getResources()
|
||||
.getBoolean(
|
||||
R.bool.allow_ringing_while_early_media))) {
|
||||
// Brighten screen for at least 10 seconds
|
||||
if (core.getCallsNb() == 1) {
|
||||
requestAudioFocus(STREAM_RING);
|
||||
|
||||
mRingingCall = call;
|
||||
startRinging(call.getRemoteAddress());
|
||||
// otherwise there is the beep
|
||||
}
|
||||
} else if (call == mRingingCall && mIsRinging) {
|
||||
// previous state was ringing, so stop ringing
|
||||
stopRinging();
|
||||
}
|
||||
|
||||
if (state == Call.State.Connected) {
|
||||
if (core.getCallsNb() == 1) {
|
||||
// It is for incoming calls, because outgoing calls enter
|
||||
// MODE_IN_COMMUNICATION immediately when they start.
|
||||
// However, incoming call first use the MODE_RINGING to play the
|
||||
// local ring.
|
||||
if (call.getDir() == Call.Dir.Incoming) {
|
||||
setAudioManagerInCallMode();
|
||||
// mAudioManager.abandonAudioFocus(null);
|
||||
requestAudioFocus(STREAM_VOICE_CALL);
|
||||
}
|
||||
if (!mIsBluetoothHeadsetConnected) {
|
||||
if (!isBluetoothHeadsetConnected()) {
|
||||
if (mContext.getResources().getBoolean(R.bool.isTablet)) {
|
||||
routeAudioToSpeaker();
|
||||
} else {
|
||||
|
@ -131,69 +66,14 @@ public class AndroidAudioManager {
|
|||
}
|
||||
}
|
||||
}
|
||||
// Only register this one when a call is active
|
||||
|
||||
enableHeadsetReceiver();
|
||||
}
|
||||
} else if (state == Call.State.End || state == Call.State.Error) {
|
||||
if (core.getCallsNb() == 0) {
|
||||
if (mAudioFocused) {
|
||||
int res = mAudioManager.abandonAudioFocus(null);
|
||||
Log.d(
|
||||
"[Audio Manager] Audio focus released a bit later: "
|
||||
+ (res
|
||||
== AudioManager
|
||||
.AUDIOFOCUS_REQUEST_GRANTED
|
||||
? "Granted"
|
||||
: "Denied"));
|
||||
mAudioFocused = false;
|
||||
}
|
||||
|
||||
// Only register this one when a call is active
|
||||
if (mHeadsetReceiver != null && mHeadsetReceiverRegistered) {
|
||||
Log.i("[Audio Manager] Unregistering headset receiver");
|
||||
mContext.unregisterReceiver(mHeadsetReceiver);
|
||||
mHeadsetReceiverRegistered = false;
|
||||
}
|
||||
|
||||
TelephonyManager tm =
|
||||
(TelephonyManager)
|
||||
mContext.getSystemService(
|
||||
Context.TELEPHONY_SERVICE);
|
||||
if (tm.getCallState() == TelephonyManager.CALL_STATE_IDLE) {
|
||||
Log.d(
|
||||
"[Audio Manager] ---AndroidAudioManager: back to MODE_NORMAL");
|
||||
mAudioManager.setMode(AudioManager.MODE_NORMAL);
|
||||
Log.d(
|
||||
"[Audio Manager] All call terminated, routing back to earpiece");
|
||||
routeAudioToEarPiece();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (state == Call.State.OutgoingInit) {
|
||||
// Enter the MODE_IN_COMMUNICATION mode as soon as possible, so that
|
||||
// ringback is heard normally in earpiece or bluetooth receiver.
|
||||
setAudioManagerInCallMode();
|
||||
requestAudioFocus(STREAM_VOICE_CALL);
|
||||
if (mIsBluetoothHeadsetConnected) {
|
||||
} else if (state == Call.State.StreamsRunning
|
||||
&& mPreviousStateIsConnected) {
|
||||
if (isBluetoothHeadsetConnected()) {
|
||||
routeAudioToBluetooth();
|
||||
}
|
||||
}
|
||||
|
||||
if (state == Call.State.StreamsRunning) {
|
||||
setAudioManagerInCallMode();
|
||||
if (mIsBluetoothHeadsetConnected) {
|
||||
routeAudioToBluetooth();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEcCalibrationResult(
|
||||
Core core, EcCalibratorStatus status, int delay_ms) {
|
||||
mAudioManager.setMode(AudioManager.MODE_NORMAL);
|
||||
mAudioManager.abandonAudioFocus(null);
|
||||
Log.i("[Audio Manager] Set audio mode on 'Normal'");
|
||||
mPreviousStateIsConnected = state == Call.State.Connected;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -204,16 +84,6 @@ public class AndroidAudioManager {
|
|||
}
|
||||
|
||||
public void destroy() {
|
||||
if (mBluetoothAdapter != null && mBluetoothHeadset != null) {
|
||||
Log.i("[Audio Manager] [Bluetooth] Closing HEADSET profile proxy");
|
||||
mBluetoothAdapter.closeProfileProxy(BluetoothProfile.HEADSET, mBluetoothHeadset);
|
||||
}
|
||||
|
||||
Log.i("[Audio Manager] [Bluetooth] Unegistering bluetooth receiver");
|
||||
if (mBluetoothReceiver != null) {
|
||||
mContext.unregisterReceiver(mBluetoothReceiver);
|
||||
}
|
||||
|
||||
Core core = LinphoneManager.getCore();
|
||||
if (core != null) {
|
||||
core.removeListener(mListener);
|
||||
|
@ -222,10 +92,6 @@ public class AndroidAudioManager {
|
|||
|
||||
/* Audio routing */
|
||||
|
||||
public void setAudioManagerModeNormal() {
|
||||
mAudioManager.setMode(AudioManager.MODE_NORMAL);
|
||||
}
|
||||
|
||||
public void routeAudioToEarPiece() {
|
||||
routeAudioToSpeakerHelper(false);
|
||||
}
|
||||
|
@ -235,50 +101,26 @@ public class AndroidAudioManager {
|
|||
}
|
||||
|
||||
public boolean isAudioRoutedToSpeaker() {
|
||||
return mAudioManager.isSpeakerphoneOn() && !isUsingBluetoothAudioRoute();
|
||||
return isUsingSpeakerAudioRoute() && !isUsingBluetoothAudioRoute();
|
||||
}
|
||||
|
||||
public boolean isAudioRoutedToEarpiece() {
|
||||
return !mAudioManager.isSpeakerphoneOn() && !isUsingBluetoothAudioRoute();
|
||||
return !isUsingSpeakerAudioRoute() && !isUsingBluetoothAudioRoute();
|
||||
}
|
||||
|
||||
/* Echo cancellation */
|
||||
|
||||
public void startEcCalibration() {
|
||||
Core core = LinphoneManager.getCore();
|
||||
if (core == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
routeAudioToSpeaker();
|
||||
setAudioManagerInCallMode();
|
||||
Log.i("[Audio Manager] Set audio mode on 'Voice Communication'");
|
||||
requestAudioFocus(STREAM_VOICE_CALL);
|
||||
int oldVolume = mAudioManager.getStreamVolume(STREAM_VOICE_CALL);
|
||||
int maxVolume = mAudioManager.getStreamMaxVolume(STREAM_VOICE_CALL);
|
||||
mAudioManager.setStreamVolume(STREAM_VOICE_CALL, maxVolume, 0);
|
||||
core.startEchoCancellerCalibration();
|
||||
mAudioManager.setStreamVolume(STREAM_VOICE_CALL, oldVolume, 0);
|
||||
}
|
||||
|
||||
public void startEchoTester() {
|
||||
Core core = LinphoneManager.getCore();
|
||||
if (core == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
routeAudioToSpeaker();
|
||||
setAudioManagerInCallMode();
|
||||
Log.i("[Audio Manager] Set audio mode on 'Voice Communication'");
|
||||
requestAudioFocus(STREAM_VOICE_CALL);
|
||||
int maxVolume = mAudioManager.getStreamMaxVolume(STREAM_VOICE_CALL);
|
||||
int sampleRate;
|
||||
mAudioManager.setStreamVolume(STREAM_VOICE_CALL, maxVolume, 0);
|
||||
String sampleRateProperty =
|
||||
mAudioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
|
||||
sampleRate = Integer.parseInt(sampleRateProperty);
|
||||
core.startEchoTester(sampleRate);
|
||||
mEchoTesterIsRunning = true;
|
||||
core.startEchoTester(sampleRate);
|
||||
}
|
||||
|
||||
public void stopEchoTester() {
|
||||
|
@ -287,10 +129,8 @@ public class AndroidAudioManager {
|
|||
return;
|
||||
}
|
||||
|
||||
mEchoTesterIsRunning = false;
|
||||
core.stopEchoTester();
|
||||
routeAudioToEarPiece();
|
||||
mAudioManager.setMode(AudioManager.MODE_NORMAL);
|
||||
mEchoTesterIsRunning = false;
|
||||
Log.i("[Audio Manager] Set audio mode on 'Normal'");
|
||||
}
|
||||
|
||||
|
@ -309,107 +149,38 @@ public class AndroidAudioManager {
|
|||
return false;
|
||||
}
|
||||
|
||||
private void setAudioManagerInCallMode() {
|
||||
if (mAudioManager.getMode() == AudioManager.MODE_IN_COMMUNICATION) {
|
||||
Log.w("[Audio Manager] already in MODE_IN_COMMUNICATION, skipping...");
|
||||
return;
|
||||
}
|
||||
Log.d("[Audio Manager] Mode: MODE_IN_COMMUNICATION");
|
||||
|
||||
mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
|
||||
}
|
||||
|
||||
private void requestAudioFocus(int stream) {
|
||||
if (!mAudioFocused) {
|
||||
int res =
|
||||
mAudioManager.requestAudioFocus(
|
||||
null, stream, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE);
|
||||
Log.d(
|
||||
"[Audio Manager] Audio focus requested: "
|
||||
+ (res == AudioManager.AUDIOFOCUS_REQUEST_GRANTED
|
||||
? "Granted"
|
||||
: "Denied"));
|
||||
if (res == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) mAudioFocused = true;
|
||||
}
|
||||
}
|
||||
|
||||
private synchronized void startRinging(Address remoteAddress) {
|
||||
if (!LinphonePreferences.instance().isDeviceRingtoneEnabled()) {
|
||||
// Enable speaker audio route, linphone library will do the ringing itself automatically
|
||||
routeAudioToSpeaker();
|
||||
return;
|
||||
}
|
||||
|
||||
boolean doNotDisturbPolicyAllowsRinging =
|
||||
Compatibility.isDoNotDisturbPolicyAllowingRinging(mContext, remoteAddress);
|
||||
if (!doNotDisturbPolicyAllowsRinging) {
|
||||
Log.e("[Audio Manager] Do not ring as Android Do Not Disturb Policy forbids it");
|
||||
return;
|
||||
}
|
||||
|
||||
routeAudioToSpeaker();
|
||||
mAudioManager.setMode(MODE_RINGTONE);
|
||||
|
||||
try {
|
||||
if ((mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE
|
||||
|| mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_NORMAL)
|
||||
&& mVibrator != null
|
||||
&& LinphonePreferences.instance().isIncomingCallVibrationEnabled()) {
|
||||
Compatibility.vibrate(mVibrator);
|
||||
}
|
||||
if (mRingerPlayer == null) {
|
||||
requestAudioFocus(STREAM_RING);
|
||||
mRingerPlayer = new MediaPlayer();
|
||||
mRingerPlayer.setAudioStreamType(STREAM_RING);
|
||||
|
||||
String ringtone =
|
||||
LinphonePreferences.instance()
|
||||
.getRingtone(Settings.System.DEFAULT_RINGTONE_URI.toString());
|
||||
try {
|
||||
if (ringtone.startsWith("content://")) {
|
||||
mRingerPlayer.setDataSource(mContext, Uri.parse(ringtone));
|
||||
} else {
|
||||
FileInputStream fis = new FileInputStream(ringtone);
|
||||
mRingerPlayer.setDataSource(fis.getFD());
|
||||
fis.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
Log.e(e, "[Audio Manager] Cannot set ringtone");
|
||||
}
|
||||
|
||||
mRingerPlayer.prepare();
|
||||
mRingerPlayer.setLooping(true);
|
||||
mRingerPlayer.start();
|
||||
} else {
|
||||
Log.w("[Audio Manager] Already ringing");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.e(e, "[Audio Manager] Cannot handle incoming call");
|
||||
}
|
||||
mIsRinging = true;
|
||||
}
|
||||
|
||||
private synchronized void stopRinging() {
|
||||
if (mRingerPlayer != null) {
|
||||
mRingerPlayer.stop();
|
||||
mRingerPlayer.release();
|
||||
mRingerPlayer = null;
|
||||
}
|
||||
if (mVibrator != null) {
|
||||
mVibrator.cancel();
|
||||
}
|
||||
|
||||
mIsRinging = false;
|
||||
public synchronized boolean isUsingSpeakerAudioRoute() {
|
||||
if (LinphoneManager.getCore().getCallsNb() == 0) return false;
|
||||
Call currentCall = LinphoneManager.getCore().getCurrentCall();
|
||||
if (currentCall == null) currentCall = LinphoneManager.getCore().getCalls()[0];
|
||||
if (currentCall == null) return false;
|
||||
AudioDevice audioDevice = currentCall.getOutputAudioDevice();
|
||||
if (audioDevice == null) return false;
|
||||
Log.i(
|
||||
"[Audio Manager] Currently used audio device: ",
|
||||
audioDevice.getDeviceName(),
|
||||
"/",
|
||||
audioDevice.getType().name());
|
||||
return audioDevice.getType() == AudioDevice.Type.Speaker;
|
||||
}
|
||||
|
||||
private void routeAudioToSpeakerHelper(boolean speakerOn) {
|
||||
Log.w("[Audio Manager] Routing audio to " + (speakerOn ? "speaker" : "earpiece"));
|
||||
if (mIsBluetoothHeadsetScoConnected) {
|
||||
Log.w("[Audio Manager] [Bluetooth] Disabling bluetooth audio route");
|
||||
changeBluetoothSco(false);
|
||||
}
|
||||
|
||||
mAudioManager.setSpeakerphoneOn(speakerOn);
|
||||
if (LinphoneManager.getCore().getCallsNb() == 0) return;
|
||||
Call currentCall = LinphoneManager.getCore().getCurrentCall();
|
||||
if (currentCall == null) currentCall = LinphoneManager.getCore().getCalls()[0];
|
||||
if (currentCall == null) return;
|
||||
|
||||
for (AudioDevice audioDevice : LinphoneManager.getCore().getAudioDevices()) {
|
||||
if (speakerOn && audioDevice.getType() == AudioDevice.Type.Speaker) {
|
||||
currentCall.setOutputAudioDevice(audioDevice);
|
||||
return;
|
||||
} else if (!speakerOn && audioDevice.getType() == AudioDevice.Type.Earpiece) {
|
||||
currentCall.setOutputAudioDevice(audioDevice);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void adjustVolume(int i) {
|
||||
|
@ -419,7 +190,7 @@ public class AndroidAudioManager {
|
|||
}
|
||||
|
||||
int stream = STREAM_VOICE_CALL;
|
||||
if (mIsBluetoothHeadsetScoConnected) {
|
||||
if (isUsingBluetoothAudioRoute()) {
|
||||
Log.i(
|
||||
"[Audio Manager] Bluetooth is connected, try to change the volume on STREAM_BLUETOOTH_SCO");
|
||||
stream = 6; // STREAM_BLUETOOTH_SCO, it's hidden...
|
||||
|
@ -433,194 +204,71 @@ public class AndroidAudioManager {
|
|||
AudioManager.FLAG_SHOW_UI);
|
||||
}
|
||||
|
||||
// Bluetooth
|
||||
|
||||
public synchronized void bluetoothHeadetConnectionChanged(boolean connected) {
|
||||
mIsBluetoothHeadsetConnected = connected;
|
||||
mAudioManager.setBluetoothScoOn(connected);
|
||||
if (LinphoneContext.isReady()) LinphoneManager.getCallManager().refreshInCallActions();
|
||||
}
|
||||
|
||||
public synchronized void bluetoothHeadetAudioConnectionChanged(boolean connected) {
|
||||
mIsBluetoothHeadsetScoConnected = connected;
|
||||
mAudioManager.setBluetoothScoOn(connected);
|
||||
public synchronized boolean isUsingBluetoothAudioRoute() {
|
||||
if (LinphoneManager.getCore().getCallsNb() == 0) return false;
|
||||
Call currentCall = LinphoneManager.getCore().getCurrentCall();
|
||||
if (currentCall == null) currentCall = LinphoneManager.getCore().getCalls()[0];
|
||||
if (currentCall == null) return false;
|
||||
AudioDevice audioDevice = currentCall.getOutputAudioDevice();
|
||||
if (audioDevice == null) return false;
|
||||
Log.i(
|
||||
"[Audio Manager] Currently used audio device: ",
|
||||
audioDevice.getDeviceName(),
|
||||
"/",
|
||||
audioDevice.getType().name());
|
||||
return audioDevice.getType() == AudioDevice.Type.Bluetooth;
|
||||
}
|
||||
|
||||
public synchronized boolean isBluetoothHeadsetConnected() {
|
||||
return mIsBluetoothHeadsetConnected;
|
||||
for (AudioDevice audioDevice : LinphoneManager.getCore().getAudioDevices()) {
|
||||
if (audioDevice.getType() == AudioDevice.Type.Bluetooth
|
||||
&& audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityPlay)) {
|
||||
Log.i(
|
||||
"[Audio Manager] Found bluetooth device: ",
|
||||
audioDevice.getDeviceName(),
|
||||
"/",
|
||||
audioDevice.getType().name());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public synchronized void bluetoothHeadetScoConnectionChanged(boolean connected) {
|
||||
mIsBluetoothHeadsetScoConnected = connected;
|
||||
if (LinphoneContext.isReady()) LinphoneManager.getCallManager().refreshInCallActions();
|
||||
}
|
||||
|
||||
public synchronized boolean isUsingBluetoothAudioRoute() {
|
||||
return mIsBluetoothHeadsetScoConnected;
|
||||
public synchronized boolean isWiredHeadsetAvailable() {
|
||||
for (AudioDevice audioDevice : LinphoneManager.getCore().getExtendedAudioDevices()) {
|
||||
if (audioDevice.getType() == AudioDevice.Type.Headphones
|
||||
|| audioDevice.getType() == AudioDevice.Type.Headset) {
|
||||
Log.i(
|
||||
"[Audio Manager] Found headset/headphone device: ",
|
||||
audioDevice.getDeviceName(),
|
||||
"/",
|
||||
audioDevice.getType().name());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public synchronized void routeAudioToBluetooth() {
|
||||
if (!isBluetoothHeadsetConnected()) {
|
||||
Log.w("[Audio Manager] [Bluetooth] No headset connected");
|
||||
return;
|
||||
}
|
||||
if (mAudioManager.getMode() != AudioManager.MODE_IN_COMMUNICATION) {
|
||||
Log.w(
|
||||
"[Audio Manager] [Bluetooth] Changing audio mode to MODE_IN_COMMUNICATION and requesting STREAM_VOICE_CALL focus");
|
||||
mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
|
||||
requestAudioFocus(STREAM_VOICE_CALL);
|
||||
}
|
||||
changeBluetoothSco(true);
|
||||
}
|
||||
if (LinphoneManager.getCore().getCallsNb() == 0) return;
|
||||
Call currentCall = LinphoneManager.getCore().getCurrentCall();
|
||||
if (currentCall == null) currentCall = LinphoneManager.getCore().getCalls()[0];
|
||||
if (currentCall == null) return;
|
||||
|
||||
private synchronized void changeBluetoothSco(final boolean enable) {
|
||||
// IT WILL TAKE A CERTAIN NUMBER OF CALLS TO EITHER START/STOP BLUETOOTH SCO FOR IT TO WORK
|
||||
if (enable && mIsBluetoothHeadsetScoConnected) {
|
||||
Log.i("[Audio Manager] [Bluetooth] SCO already enabled, skipping");
|
||||
return;
|
||||
} else if (!enable && !mIsBluetoothHeadsetScoConnected) {
|
||||
Log.i("[Audio Manager] [Bluetooth] SCO already disabled, skipping");
|
||||
return;
|
||||
}
|
||||
|
||||
new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
Log.i("[Audio Manager] [Bluetooth] SCO start/stop thread started");
|
||||
boolean resultAcknowledged;
|
||||
int retries = 0;
|
||||
|
||||
do {
|
||||
try {
|
||||
Thread.sleep(200);
|
||||
} catch (InterruptedException e) {
|
||||
Log.e(e);
|
||||
}
|
||||
|
||||
synchronized (AndroidAudioManager.this) {
|
||||
if (enable) {
|
||||
Log.i(
|
||||
"[Audio Manager] [Bluetooth] Starting SCO: try number "
|
||||
+ retries);
|
||||
mAudioManager.startBluetoothSco();
|
||||
} else {
|
||||
Log.i(
|
||||
"[Audio Manager] [Bluetooth] Stopping SCO: try number "
|
||||
+ retries);
|
||||
mAudioManager.stopBluetoothSco();
|
||||
}
|
||||
resultAcknowledged = isUsingBluetoothAudioRoute() == enable;
|
||||
retries++;
|
||||
}
|
||||
} while (!resultAcknowledged && retries < 10);
|
||||
for (AudioDevice audioDevice : LinphoneManager.getCore().getAudioDevices()) {
|
||||
if (audioDevice.getType() == AudioDevice.Type.Bluetooth
|
||||
&& audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityPlay)) {
|
||||
Log.i(
|
||||
"[Audio Manager] Found bluetooth audio device",
|
||||
audioDevice.getDeviceName(),
|
||||
"/",
|
||||
audioDevice.getType().name(),
|
||||
", routing audio to it");
|
||||
currentCall.setOutputAudioDevice(audioDevice);
|
||||
return;
|
||||
}
|
||||
}.start();
|
||||
}
|
||||
|
||||
public void bluetoothAdapterStateChanged() {
|
||||
if (mBluetoothAdapter.isEnabled()) {
|
||||
Log.i("[Audio Manager] [Bluetooth] Adapter enabled");
|
||||
mIsBluetoothHeadsetConnected = false;
|
||||
mIsBluetoothHeadsetScoConnected = false;
|
||||
|
||||
BluetoothProfile.ServiceListener bluetoothServiceListener =
|
||||
new BluetoothProfile.ServiceListener() {
|
||||
public void onServiceConnected(int profile, BluetoothProfile proxy) {
|
||||
if (profile == BluetoothProfile.HEADSET) {
|
||||
Log.i("[Audio Manager] [Bluetooth] HEADSET profile connected");
|
||||
mBluetoothHeadset = (BluetoothHeadset) proxy;
|
||||
|
||||
List<BluetoothDevice> devices =
|
||||
mBluetoothHeadset.getConnectedDevices();
|
||||
if (devices.size() > 0) {
|
||||
Log.i(
|
||||
"[Audio Manager] [Bluetooth] A device is already connected");
|
||||
bluetoothHeadetConnectionChanged(true);
|
||||
}
|
||||
|
||||
Log.i("[Audio Manager] [Bluetooth] Registering bluetooth receiver");
|
||||
|
||||
IntentFilter filter = new IntentFilter();
|
||||
filter.addAction(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED);
|
||||
filter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
|
||||
filter.addAction(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED);
|
||||
filter.addAction(
|
||||
BluetoothHeadset.ACTION_VENDOR_SPECIFIC_HEADSET_EVENT);
|
||||
|
||||
Intent sticky =
|
||||
mContext.registerReceiver(mBluetoothReceiver, filter);
|
||||
Log.i("[Audio Manager] [Bluetooth] Bluetooth receiver registered");
|
||||
int state =
|
||||
sticky.getIntExtra(
|
||||
AudioManager.EXTRA_SCO_AUDIO_STATE,
|
||||
AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
|
||||
if (state == AudioManager.SCO_AUDIO_STATE_CONNECTED) {
|
||||
Log.i(
|
||||
"[Audio Manager] [Bluetooth] Bluetooth headset SCO connected");
|
||||
bluetoothHeadetScoConnectionChanged(true);
|
||||
} else if (state == AudioManager.SCO_AUDIO_STATE_DISCONNECTED) {
|
||||
Log.i(
|
||||
"[Audio Manager] [Bluetooth] Bluetooth headset SCO disconnected");
|
||||
bluetoothHeadetScoConnectionChanged(false);
|
||||
} else if (state == AudioManager.SCO_AUDIO_STATE_CONNECTING) {
|
||||
Log.i(
|
||||
"[Audio Manager] [Bluetooth] Bluetooth headset SCO connecting");
|
||||
} else if (state == AudioManager.SCO_AUDIO_STATE_ERROR) {
|
||||
Log.i(
|
||||
"[Audio Manager] [Bluetooth] Bluetooth headset SCO connection error");
|
||||
} else {
|
||||
Log.w(
|
||||
"[Audio Manager] [Bluetooth] Bluetooth headset unknown SCO state changed: "
|
||||
+ state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void onServiceDisconnected(int profile) {
|
||||
if (profile == BluetoothProfile.HEADSET) {
|
||||
Log.i("[Audio Manager] [Bluetooth] HEADSET profile disconnected");
|
||||
mBluetoothHeadset = null;
|
||||
mIsBluetoothHeadsetConnected = false;
|
||||
mIsBluetoothHeadsetScoConnected = false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
mBluetoothAdapter.getProfileProxy(
|
||||
mContext, bluetoothServiceListener, BluetoothProfile.HEADSET);
|
||||
} else {
|
||||
Log.w("[Audio Manager] [Bluetooth] Adapter disabled");
|
||||
}
|
||||
}
|
||||
|
||||
private void startBluetooth() {
|
||||
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
|
||||
if (mBluetoothAdapter != null) {
|
||||
Log.i("[Audio Manager] [Bluetooth] Adapter found");
|
||||
if (mAudioManager.isBluetoothScoAvailableOffCall()) {
|
||||
Log.i("[Audio Manager] [Bluetooth] SCO available off call, continue");
|
||||
} else {
|
||||
Log.w("[Audio Manager] [Bluetooth] SCO not available off call !");
|
||||
}
|
||||
|
||||
mBluetoothReceiver = new BluetoothReceiver();
|
||||
IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
|
||||
mContext.registerReceiver(mBluetoothReceiver, filter);
|
||||
|
||||
bluetoothAdapterStateChanged();
|
||||
}
|
||||
}
|
||||
|
||||
// HEADSET
|
||||
|
||||
private void enableHeadsetReceiver() {
|
||||
mHeadsetReceiver = new HeadsetReceiver();
|
||||
|
||||
Log.i("[Audio Manager] Registering headset receiver");
|
||||
mContext.registerReceiver(
|
||||
mHeadsetReceiver, new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY));
|
||||
mContext.registerReceiver(
|
||||
mHeadsetReceiver, new IntentFilter(AudioManager.ACTION_HEADSET_PLUG));
|
||||
mHeadsetReceiverRegistered = true;
|
||||
Log.w(
|
||||
"[Audio Manager] Didn't find any bluetooth audio device, keeping default audio route");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -407,6 +407,14 @@ public class CallActivity extends LinphoneGenericActivity
|
|||
} else if (state == Call.State.StreamsRunning) {
|
||||
mCallPausedByRemote.setVisibility(View.GONE);
|
||||
|
||||
if (call.getCurrentParams().videoEnabled()) {
|
||||
AndroidAudioManager manager = LinphoneManager.getAudioManager();
|
||||
if (!manager.isUsingBluetoothAudioRoute()
|
||||
&& !manager.isWiredHeadsetAvailable()) {
|
||||
LinphoneManager.getAudioManager().routeAudioToSpeaker();
|
||||
}
|
||||
}
|
||||
|
||||
setCurrentCallContactInformation();
|
||||
updateInterfaceDependingOnVideo();
|
||||
} else if (state == Call.State.UpdatedByRemote) {
|
||||
|
@ -430,6 +438,14 @@ public class CallActivity extends LinphoneGenericActivity
|
|||
updateButtons();
|
||||
updateCallsList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAudioDevicesListUpdated(@NonNull Core core) {
|
||||
if (mAudioManager.isBluetoothHeadsetConnected()) {
|
||||
mAudioManager.routeAudioToBluetooth();
|
||||
}
|
||||
updateButtons();
|
||||
}
|
||||
};
|
||||
|
||||
mCore = LinphoneManager.getCore();
|
||||
|
@ -449,8 +465,11 @@ public class CallActivity extends LinphoneGenericActivity
|
|||
|
||||
if (videoEnabled) {
|
||||
mAudioManager = LinphoneManager.getAudioManager();
|
||||
mAudioManager.routeAudioToSpeaker();
|
||||
mSpeaker.setSelected(true);
|
||||
if (!mAudioManager.isWiredHeadsetAvailable()
|
||||
&& !mAudioManager.isUsingBluetoothAudioRoute()) {
|
||||
mAudioManager.routeAudioToSpeaker();
|
||||
mSpeaker.setSelected(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1107,7 +1126,8 @@ public class CallActivity extends LinphoneGenericActivity
|
|||
if (mCore.isInConference()) {
|
||||
displayConferenceCall(call);
|
||||
conferenceDisplayed = true;
|
||||
} else if (!pausedConferenceDisplayed) {
|
||||
} else if (!pausedConferenceDisplayed
|
||||
&& mCore.getCallsNb() > 1) { // Workaround for temporary SDK issue
|
||||
displayPausedConference();
|
||||
pausedConferenceDisplayed = true;
|
||||
}
|
||||
|
|
|
@ -144,6 +144,13 @@ public class CallManager {
|
|||
params.enableVideo(true);
|
||||
core.enableVideoCapture(true);
|
||||
core.enableVideoDisplay(true);
|
||||
|
||||
if (!LinphoneManager.getAudioManager().isUsingBluetoothAudioRoute()
|
||||
&& !LinphoneManager.getAudioManager().isWiredHeadsetAvailable()) {
|
||||
LinphoneManager.getAudioManager().routeAudioToSpeaker();
|
||||
}
|
||||
} else {
|
||||
params.enableVideo(false);
|
||||
}
|
||||
|
||||
call.acceptUpdate(params);
|
||||
|
@ -340,15 +347,17 @@ public class CallManager {
|
|||
Log.e("[Call Manager] Remote has low bandwidth, won't be able to do video");
|
||||
return false;
|
||||
}
|
||||
if (call.getCurrentParams().videoEnabled()) {
|
||||
Log.e("[Call Manager] Video is already enabled");
|
||||
return false;
|
||||
}
|
||||
|
||||
CallParams params = core.createCallParams(call);
|
||||
if (params.videoEnabled()) return false;
|
||||
|
||||
// Check if video possible regarding bandwidth limitations
|
||||
mBandwidthManager.updateWithProfileSettings(params);
|
||||
|
||||
// Abort if not enough bandwidth...
|
||||
if (!params.videoEnabled()) {
|
||||
Log.e("[Call Manager] Video can't be enabled");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -297,6 +297,7 @@ public class ChatActivity extends MainActivity {
|
|||
|
||||
public void showChatRoomGroupInfo(
|
||||
Address peerAddress,
|
||||
Address localAddress,
|
||||
ArrayList<ContactAddress> participants,
|
||||
String subject,
|
||||
boolean encrypted) {
|
||||
|
@ -304,6 +305,9 @@ public class ChatActivity extends MainActivity {
|
|||
if (peerAddress != null) {
|
||||
extras.putSerializable("RemoteSipUri", peerAddress.asStringUriOnly());
|
||||
}
|
||||
if (localAddress != null) {
|
||||
extras.putSerializable("LocalSipUri", localAddress.asStringUriOnly());
|
||||
}
|
||||
extras.putSerializable("Participants", participants);
|
||||
extras.putString("Subject", subject);
|
||||
extras.putBoolean("Encrypted", encrypted);
|
||||
|
@ -313,11 +317,14 @@ public class ChatActivity extends MainActivity {
|
|||
changeFragment(fragment, "Chat room group info", true);
|
||||
}
|
||||
|
||||
public void showChatRoomEphemeral(Address peerAddress) {
|
||||
public void showChatRoomEphemeral(Address peerAddress, Address localAddress) {
|
||||
Bundle extras = new Bundle();
|
||||
if (peerAddress != null) {
|
||||
extras.putSerializable("RemoteSipUri", peerAddress.asStringUriOnly());
|
||||
}
|
||||
if (localAddress != null) {
|
||||
extras.putSerializable("LocalSipUri", localAddress.asStringUriOnly());
|
||||
}
|
||||
EphemeralFragment fragment = new EphemeralFragment();
|
||||
fragment.setArguments(extras);
|
||||
changeFragment(fragment, "Chat room ephemeral", true);
|
||||
|
|
|
@ -28,8 +28,8 @@ import android.content.Intent;
|
|||
import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
import android.os.CountDownTimer;
|
||||
import android.text.Spanned;
|
||||
import android.text.method.LinkMovementMethod;
|
||||
import android.text.util.Linkify;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.webkit.MimeTypeMap;
|
||||
|
@ -221,9 +221,8 @@ public class ChatMessageViewHolder extends RecyclerView.ViewHolder implements Vi
|
|||
}
|
||||
|
||||
if (message.hasTextContent()) {
|
||||
String msg = message.getTextContent();
|
||||
Spanned text = LinphoneUtils.getTextWithHttpLinks(msg);
|
||||
messageText.setText(text);
|
||||
messageText.setText(message.getTextContent());
|
||||
Linkify.addLinks(messageText, Linkify.ALL);
|
||||
messageText.setMovementMethod(LinkMovementMethod.getInstance());
|
||||
messageText.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
@ -265,7 +264,8 @@ public class ChatMessageViewHolder extends RecyclerView.ViewHolder implements Vi
|
|||
final TextView fileName = content.findViewById(R.id.file);
|
||||
fileName.setVisibility(View.GONE);
|
||||
|
||||
if (c.isFile() || (c.isFileTransfer() && !c.getFilePath().isEmpty())) {
|
||||
if (c.isFile()
|
||||
|| (c.isFileTransfer() && message.isOutgoing() && !c.getFilePath().isEmpty())) {
|
||||
// If message is outgoing, even if content
|
||||
// is file transfer we have the file available
|
||||
final String filePath = c.getFilePath();
|
||||
|
|
|
@ -334,9 +334,11 @@ public class ChatMessagesAdapter extends SelectableAdapter<ChatMessageViewHolder
|
|||
}
|
||||
|
||||
public void addToHistory(EventLog log) {
|
||||
mHistory.add(0, log);
|
||||
notifyItemInserted(0);
|
||||
notifyItemChanged(1); // Update second to last item just in case for grouping purposes
|
||||
if (!mHistory.contains(log)) {
|
||||
mHistory.add(0, log);
|
||||
notifyItemInserted(0);
|
||||
notifyItemChanged(1); // Update second to last item just in case for grouping purposes
|
||||
}
|
||||
}
|
||||
|
||||
public void addAllToHistory(ArrayList<EventLog> logs) {
|
||||
|
|
|
@ -50,6 +50,7 @@ import android.widget.CheckBox;
|
|||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.view.menu.MenuBuilder;
|
||||
import androidx.appcompat.view.menu.MenuPopupHelper;
|
||||
import androidx.core.view.inputmethod.InputConnectionCompat;
|
||||
|
@ -299,6 +300,7 @@ public class ChatMessagesFragment extends Fragment
|
|||
mMessageTextToSend.setText(sharedText);
|
||||
Log.i("[Chat Messages Fragment] Found shared text: " + sharedText);
|
||||
}
|
||||
getArguments().clear();
|
||||
}
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
|
@ -373,6 +375,9 @@ public class ChatMessagesFragment extends Fragment
|
|||
public void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
|
||||
outState.putString("LocalSipUri", mChatRoom.getLocalAddress().asStringUriOnly());
|
||||
outState.putString("RemoteSipUri", mChatRoom.getPeerAddress().asStringUriOnly());
|
||||
|
||||
ArrayList<String> files = new ArrayList<>();
|
||||
for (int i = 0; i < mFilesUploadLayout.getChildCount(); i++) {
|
||||
View child = mFilesUploadLayout.getChildAt(i);
|
||||
|
@ -500,8 +505,7 @@ public class ChatMessagesFragment extends Fragment
|
|||
inflater.inflate(R.menu.chat_bubble_menu, menu);
|
||||
}
|
||||
|
||||
if (!message.isOutgoing()
|
||||
|| mChatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())) {
|
||||
if (mChatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())) {
|
||||
// Do not show incoming messages IDMN state in 1 to 1 chat room as we don't receive IMDN
|
||||
// for them
|
||||
menu.removeItem(R.id.imdn_infos);
|
||||
|
@ -537,8 +541,6 @@ public class ChatMessagesFragment extends Fragment
|
|||
String messageId = message.getMessageId();
|
||||
|
||||
if (item.getItemId() == R.id.resend) {
|
||||
((ChatMessagesGenericAdapter) mChatEventsList.getAdapter())
|
||||
.removeItem(mContextMenuMessagePosition);
|
||||
message.send();
|
||||
return true;
|
||||
}
|
||||
|
@ -666,10 +668,15 @@ public class ChatMessagesFragment extends Fragment
|
|||
}
|
||||
|
||||
/** View initialization */
|
||||
private void setReadOnly() {
|
||||
mMessageTextToSend.setEnabled(false);
|
||||
mAttachImageButton.setEnabled(false);
|
||||
mSendMessageButton.setEnabled(false);
|
||||
private void setReadOnly(boolean readOnly) {
|
||||
if (readOnly) {
|
||||
mMessageTextToSend.setText("");
|
||||
mFilesUploadLayout.removeAllViews();
|
||||
}
|
||||
|
||||
mMessageTextToSend.setEnabled(!readOnly);
|
||||
mAttachImageButton.setEnabled(!readOnly);
|
||||
mSendMessageButton.setEnabled(!readOnly);
|
||||
mSendEphemeralIcon.setEnabled(mSendMessageButton.isEnabled());
|
||||
}
|
||||
|
||||
|
@ -716,6 +723,7 @@ public class ChatMessagesFragment extends Fragment
|
|||
|| mRemoteSipUri == null
|
||||
|| mRemoteSipUri.isEmpty()
|
||||
|| core == null) {
|
||||
Log.e("[Chat Messages Fragment] No local/remote SIP URI found!");
|
||||
// TODO error
|
||||
return;
|
||||
}
|
||||
|
@ -798,7 +806,7 @@ public class ChatMessagesFragment extends Fragment
|
|||
|
||||
mSendEphemeralIcon.setVisibility(mChatRoom.ephemeralEnabled() ? View.VISIBLE : View.GONE);
|
||||
if (mChatRoom.hasBeenLeft()) {
|
||||
setReadOnly();
|
||||
setReadOnly(true);
|
||||
}
|
||||
|
||||
updateSecurityLevelIcon();
|
||||
|
@ -912,6 +920,12 @@ public class ChatMessagesFragment extends Fragment
|
|||
}
|
||||
|
||||
private void onRestoreInstanceState(Bundle savedInstanceState) {
|
||||
|
||||
String localSipUri = savedInstanceState.getString("LocalSipUri");
|
||||
mRemoteSipUri = savedInstanceState.getString("RemoteSipUri");
|
||||
mLocalSipAddress = Factory.instance().createAddress(localSipUri);
|
||||
mRemoteSipAddress = Factory.instance().createAddress(mRemoteSipUri);
|
||||
|
||||
ArrayList<String> files = savedInstanceState.getStringArrayList("Files");
|
||||
if (files != null && !files.isEmpty()) {
|
||||
for (String file : files) {
|
||||
|
@ -1075,15 +1089,18 @@ public class ChatMessagesFragment extends Fragment
|
|||
|
||||
boolean split =
|
||||
isBasicChatRoom; // Always split contents in basic chat rooms for compatibility
|
||||
if (hasText && sendImageAndTextAsDifferentMessages) {
|
||||
split = true;
|
||||
} else if (mFilesUploadLayout.getChildCount() > 1
|
||||
&& sendMultipleImagesAsDifferentMessages) {
|
||||
split = true;
|
||||
if (!split) {
|
||||
if (hasText && sendImageAndTextAsDifferentMessages) {
|
||||
split = true;
|
||||
} else if (mFilesUploadLayout.getChildCount() > 1
|
||||
&& sendMultipleImagesAsDifferentMessages) {
|
||||
split = true;
|
||||
|
||||
// Allow the last image to be sent with text if image and text at the same time OK
|
||||
if (hasText && i == filesCount - 1) {
|
||||
split = false;
|
||||
// Allow the last image to be sent with text if image and text at the same time
|
||||
// OK
|
||||
if (hasText && i == filesCount - 1) {
|
||||
split = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1198,12 +1215,16 @@ public class ChatMessagesFragment extends Fragment
|
|||
boolean encrypted = mChatRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt());
|
||||
((ChatActivity) getActivity())
|
||||
.showChatRoomGroupInfo(
|
||||
mRemoteSipAddress, participants, mChatRoom.getSubject(), encrypted);
|
||||
mRemoteSipAddress,
|
||||
mLocalSipAddress,
|
||||
participants,
|
||||
mChatRoom.getSubject(),
|
||||
encrypted);
|
||||
}
|
||||
|
||||
private void goToEphemeral() {
|
||||
if (mChatRoom == null) return;
|
||||
((ChatActivity) getActivity()).showChatRoomEphemeral(mRemoteSipAddress);
|
||||
((ChatActivity) getActivity()).showChatRoomEphemeral(mRemoteSipAddress, mLocalSipAddress);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1211,11 +1232,17 @@ public class ChatMessagesFragment extends Fragment
|
|||
*/
|
||||
|
||||
@Override
|
||||
public void onChatMessageSent(ChatRoom cr, EventLog event) {
|
||||
public void onNewEvent(@NonNull ChatRoom chatRoom, @NonNull EventLog eventLog) {}
|
||||
|
||||
@Override
|
||||
public void onChatMessageSending(ChatRoom cr, EventLog event) {
|
||||
((ChatMessagesGenericAdapter) mChatEventsList.getAdapter()).addToHistory(event);
|
||||
scrollToBottom();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChatMessageSent(@NonNull ChatRoom chatRoom, @NonNull EventLog eventLog) {}
|
||||
|
||||
@Override
|
||||
public void onConferenceAddressGeneration(ChatRoom cr) {}
|
||||
|
||||
|
@ -1435,9 +1462,7 @@ public class ChatMessagesFragment extends Fragment
|
|||
|
||||
@Override
|
||||
public void onStateChanged(ChatRoom cr, ChatRoom.State newState) {
|
||||
if (mChatRoom.hasBeenLeft()) {
|
||||
setReadOnly();
|
||||
}
|
||||
setReadOnly(mChatRoom.hasBeenLeft());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -154,6 +154,7 @@ public class ChatRoomCreationFragment extends Fragment
|
|||
? null
|
||||
: Factory.instance()
|
||||
.createAddress(mChatRoomAddress),
|
||||
mChatRoom == null ? null : mChatRoom.getLocalAddress(),
|
||||
mSearchAdapter.getContactsSelectedList(),
|
||||
mChatRoomSubject,
|
||||
mSecurityToggle.isChecked());
|
||||
|
|
|
@ -58,12 +58,14 @@ public class EphemeralFragment extends Fragment {
|
|||
|
||||
String address = getArguments().getString("RemoteSipUri");
|
||||
Address peerAddress = null;
|
||||
String localSipUri = getArguments().getString("LocalSipUri");
|
||||
Address localSipAddress = Factory.instance().createAddress(localSipUri);
|
||||
mChatRoom = null;
|
||||
if (address != null && address.length() > 0) {
|
||||
peerAddress = Factory.instance().createAddress(address);
|
||||
}
|
||||
if (peerAddress != null) {
|
||||
mChatRoom = LinphoneManager.getCore().getChatRoom(peerAddress);
|
||||
mChatRoom = LinphoneManager.getCore().getChatRoom(peerAddress, localSipAddress);
|
||||
}
|
||||
if (mChatRoom == null) {
|
||||
return null;
|
||||
|
|
|
@ -95,9 +95,16 @@ public class GroupInfoFragment extends Fragment {
|
|||
mGroupChatRoomAddress = Factory.instance().createAddress(address);
|
||||
}
|
||||
|
||||
Address localSipAddress = null;
|
||||
String localSipUri = getArguments().getString("LocalSipUri");
|
||||
if (localSipUri != null && localSipUri.length() > 0) {
|
||||
localSipAddress = Factory.instance().createAddress(localSipUri);
|
||||
}
|
||||
|
||||
mIsAlreadyCreatedGroup = mGroupChatRoomAddress != null;
|
||||
if (mIsAlreadyCreatedGroup) {
|
||||
mChatRoom = LinphoneManager.getCore().getChatRoom(mGroupChatRoomAddress);
|
||||
mChatRoom =
|
||||
LinphoneManager.getCore().getChatRoom(mGroupChatRoomAddress, localSipAddress);
|
||||
}
|
||||
|
||||
if (mChatRoom == null) {
|
||||
|
|
|
@ -23,6 +23,7 @@ import static org.linphone.compatibility.Compatibility.CHAT_NOTIFICATIONS_GROUP;
|
|||
import static org.linphone.compatibility.Compatibility.INTENT_LOCAL_IDENTITY;
|
||||
import static org.linphone.compatibility.Compatibility.INTENT_MARK_AS_READ_ACTION;
|
||||
import static org.linphone.compatibility.Compatibility.INTENT_NOTIF_ID;
|
||||
import static org.linphone.compatibility.Compatibility.INTENT_REMOTE_IDENTITY;
|
||||
import static org.linphone.compatibility.Compatibility.INTENT_REPLY_NOTIF_ACTION;
|
||||
import static org.linphone.compatibility.Compatibility.KEY_TEXT_REPLY;
|
||||
|
||||
|
@ -132,6 +133,7 @@ class ApiTwentyEightPlus {
|
|||
replyIntent.setAction(INTENT_REPLY_NOTIF_ACTION);
|
||||
replyIntent.putExtra(INTENT_NOTIF_ID, notif.getNotificationId());
|
||||
replyIntent.putExtra(INTENT_LOCAL_IDENTITY, notif.getLocalIdentity());
|
||||
replyIntent.putExtra(INTENT_REMOTE_IDENTITY, notif.getRemoteIdentity());
|
||||
|
||||
PendingIntent replyPendingIntent =
|
||||
PendingIntent.getBroadcast(
|
||||
|
@ -156,6 +158,7 @@ class ApiTwentyEightPlus {
|
|||
markAsReadIntent.setAction(INTENT_MARK_AS_READ_ACTION);
|
||||
markAsReadIntent.putExtra(INTENT_NOTIF_ID, notif.getNotificationId());
|
||||
markAsReadIntent.putExtra(INTENT_LOCAL_IDENTITY, notif.getLocalIdentity());
|
||||
markAsReadIntent.putExtra(INTENT_REMOTE_IDENTITY, notif.getRemoteIdentity());
|
||||
|
||||
PendingIntent markAsReadPendingIntent =
|
||||
PendingIntent.getBroadcast(
|
||||
|
|
|
@ -25,6 +25,7 @@ import static org.linphone.compatibility.Compatibility.INTENT_HANGUP_CALL_NOTIF_
|
|||
import static org.linphone.compatibility.Compatibility.INTENT_LOCAL_IDENTITY;
|
||||
import static org.linphone.compatibility.Compatibility.INTENT_MARK_AS_READ_ACTION;
|
||||
import static org.linphone.compatibility.Compatibility.INTENT_NOTIF_ID;
|
||||
import static org.linphone.compatibility.Compatibility.INTENT_REMOTE_IDENTITY;
|
||||
import static org.linphone.compatibility.Compatibility.INTENT_REPLY_NOTIF_ACTION;
|
||||
import static org.linphone.compatibility.Compatibility.KEY_TEXT_REPLY;
|
||||
|
||||
|
@ -167,6 +168,7 @@ class ApiTwentyFourPlus {
|
|||
replyIntent.setAction(INTENT_REPLY_NOTIF_ACTION);
|
||||
replyIntent.putExtra(INTENT_NOTIF_ID, notif.getNotificationId());
|
||||
replyIntent.putExtra(INTENT_LOCAL_IDENTITY, notif.getLocalIdentity());
|
||||
replyIntent.putExtra(INTENT_REMOTE_IDENTITY, notif.getRemoteIdentity());
|
||||
|
||||
PendingIntent replyPendingIntent =
|
||||
PendingIntent.getBroadcast(
|
||||
|
@ -190,6 +192,7 @@ class ApiTwentyFourPlus {
|
|||
markAsReadIntent.setAction(INTENT_MARK_AS_READ_ACTION);
|
||||
markAsReadIntent.putExtra(INTENT_NOTIF_ID, notif.getNotificationId());
|
||||
markAsReadIntent.putExtra(INTENT_LOCAL_IDENTITY, notif.getLocalIdentity());
|
||||
markAsReadIntent.putExtra(INTENT_REMOTE_IDENTITY, notif.getRemoteIdentity());
|
||||
|
||||
PendingIntent markAsReadPendingIntent =
|
||||
PendingIntent.getBroadcast(
|
||||
|
|
|
@ -24,6 +24,7 @@ import static org.linphone.compatibility.Compatibility.INTENT_HANGUP_CALL_NOTIF_
|
|||
import static org.linphone.compatibility.Compatibility.INTENT_LOCAL_IDENTITY;
|
||||
import static org.linphone.compatibility.Compatibility.INTENT_MARK_AS_READ_ACTION;
|
||||
import static org.linphone.compatibility.Compatibility.INTENT_NOTIF_ID;
|
||||
import static org.linphone.compatibility.Compatibility.INTENT_REMOTE_IDENTITY;
|
||||
import static org.linphone.compatibility.Compatibility.INTENT_REPLY_NOTIF_ACTION;
|
||||
import static org.linphone.compatibility.Compatibility.KEY_TEXT_REPLY;
|
||||
|
||||
|
@ -48,6 +49,7 @@ public class ApiTwentyNinePlus {
|
|||
replyIntent.setAction(INTENT_REPLY_NOTIF_ACTION);
|
||||
replyIntent.putExtra(INTENT_NOTIF_ID, notif.getNotificationId());
|
||||
replyIntent.putExtra(INTENT_LOCAL_IDENTITY, notif.getLocalIdentity());
|
||||
replyIntent.putExtra(INTENT_REMOTE_IDENTITY, notif.getRemoteIdentity());
|
||||
|
||||
PendingIntent replyPendingIntent =
|
||||
PendingIntent.getBroadcast(
|
||||
|
@ -72,6 +74,7 @@ public class ApiTwentyNinePlus {
|
|||
markAsReadIntent.setAction(INTENT_MARK_AS_READ_ACTION);
|
||||
markAsReadIntent.putExtra(INTENT_NOTIF_ID, notif.getNotificationId());
|
||||
markAsReadIntent.putExtra(INTENT_LOCAL_IDENTITY, notif.getLocalIdentity());
|
||||
markAsReadIntent.putExtra(INTENT_REMOTE_IDENTITY, notif.getRemoteIdentity());
|
||||
|
||||
PendingIntent markAsReadPendingIntent =
|
||||
PendingIntent.getBroadcast(
|
||||
|
|
|
@ -107,6 +107,23 @@ class ApiTwentySixPlus {
|
|||
notificationManager.createNotificationChannel(channel);
|
||||
}
|
||||
|
||||
public static void createMissedCallChannel(Context context) {
|
||||
NotificationManager notificationManager =
|
||||
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
// Create missed call notification channel
|
||||
String id = context.getString(R.string.notification_missed_call_channel_id);
|
||||
String name = context.getString(R.string.content_title_notification_missed_call);
|
||||
String description = context.getString(R.string.content_title_notification_missed_call);
|
||||
NotificationChannel channel =
|
||||
new NotificationChannel(id, name, NotificationManager.IMPORTANCE_LOW);
|
||||
channel.setDescription(description);
|
||||
channel.setLightColor(context.getColor(R.color.notification_led_color));
|
||||
channel.enableLights(true);
|
||||
channel.enableVibration(true);
|
||||
channel.setShowBadge(true);
|
||||
notificationManager.createNotificationChannel(channel);
|
||||
}
|
||||
|
||||
public static Notification createMessageNotification(
|
||||
Context context, Notifiable notif, Bitmap contactIcon, PendingIntent intent) {
|
||||
|
||||
|
@ -262,14 +279,14 @@ class ApiTwentySixPlus {
|
|||
public static Notification createMissedCallNotification(
|
||||
Context context, String title, String text, PendingIntent intent, int count) {
|
||||
return new Notification.Builder(
|
||||
context, context.getString(R.string.notification_channel_id))
|
||||
context, context.getString(R.string.notification_missed_call_channel_id))
|
||||
.setContentTitle(title)
|
||||
.setContentText(text)
|
||||
.setSmallIcon(R.drawable.call_status_missed)
|
||||
.setAutoCancel(true)
|
||||
.setContentIntent(intent)
|
||||
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)
|
||||
.setCategory(Notification.CATEGORY_EVENT)
|
||||
// .setCategory(Notification.CATEGORY_EVENT) No one really matches "missed call"
|
||||
.setVisibility(Notification.VISIBILITY_PRIVATE)
|
||||
.setPriority(Notification.PRIORITY_HIGH)
|
||||
.setWhen(System.currentTimeMillis())
|
||||
|
|
|
@ -45,6 +45,7 @@ public class Compatibility {
|
|||
public static final String INTENT_HANGUP_CALL_NOTIF_ACTION = "org.linphone.HANGUP_CALL_ACTION";
|
||||
public static final String INTENT_ANSWER_CALL_NOTIF_ACTION = "org.linphone.ANSWER_CALL_ACTION";
|
||||
public static final String INTENT_LOCAL_IDENTITY = "LOCAL_IDENTITY";
|
||||
public static final String INTENT_REMOTE_IDENTITY = "REMOTE_IDENTITY";
|
||||
public static final String INTENT_MARK_AS_READ_ACTION = "org.linphone.MARK_AS_READ_ACTION";
|
||||
|
||||
public static String getDeviceName(Context context) {
|
||||
|
@ -71,6 +72,7 @@ public class Compatibility {
|
|||
if (Version.sdkAboveOrEqual(Version.API26_O_80)) {
|
||||
ApiTwentySixPlus.createServiceChannel(context);
|
||||
ApiTwentySixPlus.createMessageChannel(context);
|
||||
ApiTwentySixPlus.createMissedCallChannel(context);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -500,9 +500,8 @@ public class ContactEditorFragment extends Fragment {
|
|||
} catch (IOException e) {
|
||||
Log.e("[Contact Editor] Failed to get Exif rotation, error is ", e);
|
||||
}
|
||||
} else {
|
||||
|
||||
}
|
||||
|
||||
if (image == null) {
|
||||
Log.e(
|
||||
"[Contact Editor] Couldn't get bitmap from either filePath [",
|
||||
|
|
|
@ -216,6 +216,7 @@ public class ContactsFragment extends Fragment
|
|||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
||||
ContactsManager.getInstance().addContactsListener(this);
|
||||
|
||||
mOnlyDisplayLinphoneContacts =
|
||||
|
@ -224,6 +225,7 @@ public class ContactsFragment extends Fragment
|
|||
|
||||
changeContactsToggle();
|
||||
invalidate();
|
||||
onContactsUpdated();
|
||||
|
||||
((ContactsActivity) (getActivity())).showTabBar();
|
||||
}
|
||||
|
|
|
@ -106,6 +106,9 @@ public class DialerActivity extends MainActivity implements AddressText.AddressC
|
|||
@Override
|
||||
public void onCallStateChanged(
|
||||
Core core, Call call, Call.State state, String message) {
|
||||
if (state == Call.State.OutgoingInit) {
|
||||
if (mAddress != null) mAddress.setText("");
|
||||
}
|
||||
updateLayout();
|
||||
}
|
||||
|
||||
|
@ -166,10 +169,6 @@ public class DialerActivity extends MainActivity implements AddressText.AddressC
|
|||
};
|
||||
|
||||
mIsTransfer = false;
|
||||
if (getIntent() != null) {
|
||||
mIsTransfer = getIntent().getBooleanExtra("isTransfer", false);
|
||||
}
|
||||
|
||||
handleIntentParams(getIntent());
|
||||
}
|
||||
|
||||
|
@ -178,13 +177,6 @@ public class DialerActivity extends MainActivity implements AddressText.AddressC
|
|||
super.onNewIntent(intent);
|
||||
|
||||
handleIntentParams(intent);
|
||||
|
||||
if (intent != null) {
|
||||
mIsTransfer = intent.getBooleanExtra("isTransfer", mIsTransfer);
|
||||
if (mAddress != null && intent.getStringExtra("SipUri") != null) {
|
||||
mAddress.setText(intent.getStringExtra("SipUri"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -207,7 +199,6 @@ public class DialerActivity extends MainActivity implements AddressText.AddressC
|
|||
@Override
|
||||
protected void onPause() {
|
||||
enableVideoPreviewIfTablet(false);
|
||||
if (mAddress != null) mAddress.setText("");
|
||||
Core core = LinphoneManager.getCore();
|
||||
if (core != null) {
|
||||
core.removeListener(mListener);
|
||||
|
@ -219,6 +210,7 @@ public class DialerActivity extends MainActivity implements AddressText.AddressC
|
|||
@Override
|
||||
protected void onDestroy() {
|
||||
if (mInterfaceLoaded) {
|
||||
if (mAddress != null) mAddress.setText("");
|
||||
mAddress = null;
|
||||
mStartCall = null;
|
||||
mAddCall = null;
|
||||
|
@ -280,6 +272,7 @@ public class DialerActivity extends MainActivity implements AddressText.AddressC
|
|||
intent.putExtra("EditOnClick", true);
|
||||
intent.putExtra("SipAddress", mAddress.getText().toString());
|
||||
startActivity(intent);
|
||||
if (mAddress != null) mAddress.setText("");
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -289,6 +282,7 @@ public class DialerActivity extends MainActivity implements AddressText.AddressC
|
|||
@Override
|
||||
public void onClick(View v) {
|
||||
goBackToCall();
|
||||
if (mAddress != null) mAddress.setText("");
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -334,6 +328,7 @@ public class DialerActivity extends MainActivity implements AddressText.AddressC
|
|||
@Override
|
||||
protected void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putSerializable("address", mAddress.getText().toString());
|
||||
outState.putSerializable("isTransfer", mIsTransfer);
|
||||
}
|
||||
|
||||
|
@ -341,6 +336,7 @@ public class DialerActivity extends MainActivity implements AddressText.AddressC
|
|||
protected void onRestoreInstanceState(Bundle savedInstanceState) {
|
||||
super.onRestoreInstanceState(savedInstanceState);
|
||||
mIsTransfer = savedInstanceState.getBoolean("isTransfer");
|
||||
if (mAddress != null) mAddress.setText(savedInstanceState.getString("address"));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -375,6 +371,8 @@ public class DialerActivity extends MainActivity implements AddressText.AddressC
|
|||
private void handleIntentParams(Intent intent) {
|
||||
if (intent == null) return;
|
||||
|
||||
mIsTransfer = intent.getBooleanExtra("isTransfer", mIsTransfer);
|
||||
|
||||
String action = intent.getAction();
|
||||
String addressToCall = null;
|
||||
if (ACTION_CALL_LINPHONE.equals(action)
|
||||
|
@ -409,7 +407,13 @@ public class DialerActivity extends MainActivity implements AddressText.AddressC
|
|||
Log.i("[Dialer] " + action + " with number: " + addressToCall);
|
||||
}
|
||||
} else {
|
||||
Log.w("[Dialer] Intent data is null for action " + action);
|
||||
String sipUri = intent.getStringExtra("SipUri");
|
||||
if (sipUri != null) {
|
||||
Log.i("[Dialer] Found extra SIP URI: " + sipUri);
|
||||
addressToCall = sipUri;
|
||||
} else {
|
||||
Log.w("[Dialer] Intent data is null for action " + action);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -210,13 +210,8 @@ public class HistoryDetailFragment extends Fragment {
|
|||
Core core = LinphoneManager.getCore();
|
||||
if (address != null && core != null) {
|
||||
address.clean();
|
||||
ProxyConfig proxyConfig = core.getDefaultProxyConfig();
|
||||
CallLog[] logs;
|
||||
if (proxyConfig != null) {
|
||||
logs = core.getCallHistory(address, proxyConfig.getIdentityAddress());
|
||||
} else {
|
||||
logs = core.getCallHistoryForAddress(address);
|
||||
}
|
||||
logs = core.getCallHistoryForAddress(address);
|
||||
List<CallLog> logsList = Arrays.asList(logs);
|
||||
mLogsList.setAdapter(
|
||||
new HistoryLogAdapter(
|
||||
|
|
|
@ -28,6 +28,7 @@ public class Notifiable {
|
|||
private boolean mIsGroup;
|
||||
private String mGroupTitle;
|
||||
private String mLocalIdentity;
|
||||
private String mRemoteIdentity;
|
||||
private String mMyself;
|
||||
private int mIconId;
|
||||
private int mTextId;
|
||||
|
@ -84,10 +85,18 @@ public class Notifiable {
|
|||
return mLocalIdentity;
|
||||
}
|
||||
|
||||
public String getRemoteIdentity() {
|
||||
return mRemoteIdentity;
|
||||
}
|
||||
|
||||
public void setLocalIdentity(String localIdentity) {
|
||||
mLocalIdentity = localIdentity;
|
||||
}
|
||||
|
||||
public void setRemoteIdentity(String remoteIdentity) {
|
||||
mRemoteIdentity = remoteIdentity;
|
||||
}
|
||||
|
||||
public int getIconResourceId() {
|
||||
return mIconId;
|
||||
}
|
||||
|
|
|
@ -19,7 +19,10 @@
|
|||
*/
|
||||
package org.linphone.notifications;
|
||||
|
||||
import static android.content.Context.NOTIFICATION_SERVICE;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.RemoteInput;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
|
@ -34,27 +37,40 @@ import org.linphone.core.Call;
|
|||
import org.linphone.core.ChatMessage;
|
||||
import org.linphone.core.ChatRoom;
|
||||
import org.linphone.core.Core;
|
||||
import org.linphone.core.Factory;
|
||||
import org.linphone.core.tools.Log;
|
||||
import org.linphone.settings.LinphonePreferences;
|
||||
|
||||
public class NotificationBroadcastReceiver extends BroadcastReceiver {
|
||||
@Override
|
||||
public void onReceive(final Context context, Intent intent) {
|
||||
final int notifId = intent.getIntExtra(Compatibility.INTENT_NOTIF_ID, 0);
|
||||
final String localyIdentity = intent.getStringExtra(Compatibility.INTENT_LOCAL_IDENTITY);
|
||||
final String remoteIdentity = intent.getStringExtra(Compatibility.INTENT_REMOTE_IDENTITY);
|
||||
|
||||
if (!LinphoneContext.isReady()) {
|
||||
Log.e("[Notification Broadcast Receiver] Context not ready, aborting...");
|
||||
return;
|
||||
Log.e("[Notification Broadcast Receiver] Context not ready...");
|
||||
}
|
||||
|
||||
if (intent.getAction().equals(Compatibility.INTENT_REPLY_NOTIF_ACTION)
|
||||
|| intent.getAction().equals(Compatibility.INTENT_MARK_AS_READ_ACTION)) {
|
||||
String remoteSipAddr =
|
||||
LinphoneContext.instance()
|
||||
.getNotificationManager()
|
||||
.getSipUriForNotificationId(notifId);
|
||||
String remoteSipAddr = remoteIdentity;
|
||||
|
||||
Core core;
|
||||
boolean stopCoreWhenFinished = false;
|
||||
if (!LinphoneContext.isReady()) {
|
||||
String basePath = context.getFilesDir().getAbsolutePath();
|
||||
core =
|
||||
Factory.instance()
|
||||
.createCore(
|
||||
basePath + LinphonePreferences.LINPHONE_DEFAULT_RC,
|
||||
basePath + LinphonePreferences.LINPHONE_FACTORY_RC,
|
||||
context);
|
||||
stopCoreWhenFinished = true;
|
||||
Log.e("[Notification Broadcast Receiver] Created temporary Core");
|
||||
core.start();
|
||||
} else core = LinphoneManager.getCore();
|
||||
|
||||
Core core = LinphoneManager.getCore();
|
||||
if (core == null) {
|
||||
Log.e("[Notification Broadcast Receiver] Couldn't get Core instance");
|
||||
onError(context, notifId);
|
||||
|
@ -102,15 +118,33 @@ public class NotificationBroadcastReceiver extends BroadcastReceiver {
|
|||
|
||||
ChatMessage msg = room.createMessage(reply);
|
||||
msg.setUserData(notifId);
|
||||
msg.addListener(
|
||||
LinphoneContext.instance().getNotificationManager().getMessageListener());
|
||||
if (!stopCoreWhenFinished) {
|
||||
msg.addListener(
|
||||
LinphoneContext.instance()
|
||||
.getNotificationManager()
|
||||
.getMessageListener());
|
||||
}
|
||||
msg.send();
|
||||
Log.i("[Notification Broadcast Receiver] Reply sent for notif id " + notifId);
|
||||
} else {
|
||||
LinphoneContext.instance().getNotificationManager().dismissNotification(notifId);
|
||||
if (!stopCoreWhenFinished) {
|
||||
LinphoneContext.instance()
|
||||
.getNotificationManager()
|
||||
.dismissNotification(notifId);
|
||||
} else {
|
||||
NotificationManager notificationManager =
|
||||
(NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
|
||||
notificationManager.cancel(notifId);
|
||||
}
|
||||
}
|
||||
|
||||
if (stopCoreWhenFinished) {
|
||||
core.stopAsync();
|
||||
}
|
||||
} else if (intent.getAction().equals(Compatibility.INTENT_ANSWER_CALL_NOTIF_ACTION)
|
||||
|| intent.getAction().equals(Compatibility.INTENT_HANGUP_CALL_NOTIF_ACTION)) {
|
||||
if (!LinphoneContext.isReady()) return;
|
||||
|
||||
String remoteAddr =
|
||||
LinphoneContext.instance()
|
||||
.getNotificationManager()
|
||||
|
|
|
@ -462,6 +462,7 @@ public class NotificationsManager {
|
|||
notif.setGroupTitle(subject);
|
||||
notif.setMyself(LinphoneUtils.getAddressDisplayName(localIdentity));
|
||||
notif.setLocalIdentity(localIdentity.asString());
|
||||
notif.setRemoteIdentity(conferenceAddress);
|
||||
|
||||
displayMessageNotificationFromNotifiable(
|
||||
notif, conferenceAddress, localIdentity.asStringUriOnly());
|
||||
|
@ -496,6 +497,7 @@ public class NotificationsManager {
|
|||
notif.setIsGroup(false);
|
||||
notif.setMyself(LinphoneUtils.getAddressDisplayName(localIdentity));
|
||||
notif.setLocalIdentity(localIdentity.asString());
|
||||
notif.setRemoteIdentity(fromSipUri);
|
||||
|
||||
displayMessageNotificationFromNotifiable(
|
||||
notif, fromSipUri, localIdentity.asStringUriOnly());
|
||||
|
|
|
@ -1,145 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2010-2019 Belledonne Communications SARL.
|
||||
*
|
||||
* This file is part of linphone-android
|
||||
* (see https://www.linphone.org).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package org.linphone.receivers;
|
||||
|
||||
import android.bluetooth.BluetoothAdapter;
|
||||
import android.bluetooth.BluetoothHeadset;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.media.AudioManager;
|
||||
import org.linphone.LinphoneManager;
|
||||
import org.linphone.core.tools.Log;
|
||||
|
||||
public class BluetoothReceiver extends BroadcastReceiver {
|
||||
public BluetoothReceiver() {
|
||||
super();
|
||||
Log.i("[Bluetooth] Bluetooth receiver created");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
String action = intent.getAction();
|
||||
Log.i("[Bluetooth] Bluetooth broadcast received");
|
||||
|
||||
if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
|
||||
int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
|
||||
switch (state) {
|
||||
case BluetoothAdapter.STATE_OFF:
|
||||
Log.w("[Bluetooth] Adapter has been turned off");
|
||||
break;
|
||||
case BluetoothAdapter.STATE_TURNING_OFF:
|
||||
Log.w("[Bluetooth] Adapter is being turned off");
|
||||
break;
|
||||
case BluetoothAdapter.STATE_ON:
|
||||
Log.i("[Bluetooth] Adapter has been turned on");
|
||||
LinphoneManager.getAudioManager().bluetoothAdapterStateChanged();
|
||||
break;
|
||||
case BluetoothAdapter.STATE_TURNING_ON:
|
||||
Log.i("[Bluetooth] Adapter is being turned on");
|
||||
break;
|
||||
case BluetoothAdapter.ERROR:
|
||||
Log.e("[Bluetooth] Adapter is in error state !");
|
||||
break;
|
||||
default:
|
||||
Log.w("[Bluetooth] Unknown adapter state: ", state);
|
||||
break;
|
||||
}
|
||||
} else if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) {
|
||||
int state =
|
||||
intent.getIntExtra(
|
||||
BluetoothHeadset.EXTRA_STATE, BluetoothHeadset.STATE_DISCONNECTED);
|
||||
if (state == BluetoothHeadset.STATE_CONNECTED) {
|
||||
Log.i("[Bluetooth] Bluetooth headset connected");
|
||||
LinphoneManager.getAudioManager().bluetoothHeadetConnectionChanged(true);
|
||||
} else if (state == BluetoothHeadset.STATE_DISCONNECTED) {
|
||||
Log.i("[Bluetooth] Bluetooth headset disconnected");
|
||||
LinphoneManager.getAudioManager().bluetoothHeadetConnectionChanged(false);
|
||||
} else {
|
||||
Log.w("[Bluetooth] Bluetooth headset unknown state changed: " + state);
|
||||
}
|
||||
} else if (action.equals(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED)) {
|
||||
int state =
|
||||
intent.getIntExtra(
|
||||
BluetoothHeadset.EXTRA_STATE,
|
||||
BluetoothHeadset.STATE_AUDIO_DISCONNECTED);
|
||||
if (state == BluetoothHeadset.STATE_AUDIO_CONNECTED) {
|
||||
Log.i("[Bluetooth] Bluetooth headset audio connected");
|
||||
LinphoneManager.getAudioManager().bluetoothHeadetAudioConnectionChanged(true);
|
||||
} else if (state == BluetoothHeadset.STATE_AUDIO_DISCONNECTED) {
|
||||
Log.i("[Bluetooth] Bluetooth headset audio disconnected");
|
||||
LinphoneManager.getAudioManager().bluetoothHeadetAudioConnectionChanged(false);
|
||||
} else if (state == BluetoothHeadset.STATE_AUDIO_CONNECTING) {
|
||||
Log.i("[Bluetooth] Bluetooth headset audio connecting");
|
||||
} else {
|
||||
Log.w("[Bluetooth] Bluetooth headset unknown audio state changed: " + state);
|
||||
}
|
||||
} else if (action.equals(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED)) {
|
||||
int state =
|
||||
intent.getIntExtra(
|
||||
AudioManager.EXTRA_SCO_AUDIO_STATE,
|
||||
AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
|
||||
if (state == AudioManager.SCO_AUDIO_STATE_CONNECTED) {
|
||||
Log.i("[Bluetooth] Bluetooth headset SCO connected");
|
||||
LinphoneManager.getAudioManager().bluetoothHeadetScoConnectionChanged(true);
|
||||
} else if (state == AudioManager.SCO_AUDIO_STATE_DISCONNECTED) {
|
||||
Log.i("[Bluetooth] Bluetooth headset SCO disconnected");
|
||||
LinphoneManager.getAudioManager().bluetoothHeadetScoConnectionChanged(false);
|
||||
} else if (state == AudioManager.SCO_AUDIO_STATE_CONNECTING) {
|
||||
Log.i("[Bluetooth] Bluetooth headset SCO connecting");
|
||||
} else if (state == AudioManager.SCO_AUDIO_STATE_ERROR) {
|
||||
Log.i("[Bluetooth] Bluetooth headset SCO connection error");
|
||||
} else {
|
||||
Log.w("[Bluetooth] Bluetooth headset unknown SCO state changed: " + state);
|
||||
}
|
||||
} else if (action.equals(BluetoothHeadset.ACTION_VENDOR_SPECIFIC_HEADSET_EVENT)) {
|
||||
String command =
|
||||
intent.getStringExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD);
|
||||
int type =
|
||||
intent.getIntExtra(
|
||||
BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE, -1);
|
||||
|
||||
String commandType;
|
||||
switch (type) {
|
||||
case BluetoothHeadset.AT_CMD_TYPE_ACTION:
|
||||
commandType = "AT Action";
|
||||
break;
|
||||
case BluetoothHeadset.AT_CMD_TYPE_READ:
|
||||
commandType = "AT Read";
|
||||
break;
|
||||
case BluetoothHeadset.AT_CMD_TYPE_TEST:
|
||||
commandType = "AT Test";
|
||||
break;
|
||||
case BluetoothHeadset.AT_CMD_TYPE_SET:
|
||||
commandType = "AT Set";
|
||||
break;
|
||||
case BluetoothHeadset.AT_CMD_TYPE_BASIC:
|
||||
commandType = "AT Basic";
|
||||
break;
|
||||
default:
|
||||
commandType = "AT Unknown";
|
||||
break;
|
||||
}
|
||||
Log.i("[Bluetooth] Vendor action " + commandType + " : " + command);
|
||||
} else {
|
||||
Log.w("[Bluetooth] Bluetooth unknown action: " + action);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,67 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2010-2019 Belledonne Communications SARL.
|
||||
*
|
||||
* This file is part of linphone-android
|
||||
* (see https://www.linphone.org).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package org.linphone.receivers;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.media.AudioManager;
|
||||
import org.linphone.LinphoneManager;
|
||||
import org.linphone.core.tools.Log;
|
||||
|
||||
public class HeadsetReceiver extends BroadcastReceiver {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if (isInitialStickyBroadcast()) {
|
||||
Log.i("[Headset] Received broadcast from sticky cache, ignoring...");
|
||||
return;
|
||||
}
|
||||
|
||||
String action = intent.getAction();
|
||||
if (action.equals(AudioManager.ACTION_HEADSET_PLUG)) {
|
||||
// This happens when the user plugs a Jack headset to the device for example
|
||||
// https://developer.android.com/reference/android/media/AudioManager.html#ACTION_HEADSET_PLUG
|
||||
int state = intent.getIntExtra("state", 0);
|
||||
String name = intent.getStringExtra("name");
|
||||
int hasMicrophone = intent.getIntExtra("microphone", 0);
|
||||
|
||||
if (state == 0) {
|
||||
Log.i("[Headset] Headset disconnected:" + name);
|
||||
} else if (state == 1) {
|
||||
Log.i("[Headset] Headset connected:" + name);
|
||||
if (hasMicrophone == 1) {
|
||||
Log.i("[Headset] Headset " + name + " has a microphone");
|
||||
}
|
||||
} else {
|
||||
Log.w("[Headset] Unknown headset plugged state: " + state);
|
||||
}
|
||||
|
||||
LinphoneManager.getAudioManager().routeAudioToEarPiece();
|
||||
LinphoneManager.getCallManager().refreshInCallActions();
|
||||
} else if (action.equals(AudioManager.ACTION_AUDIO_BECOMING_NOISY)) {
|
||||
// This happens when the user disconnect a headset, so we shouldn't play audio loudly
|
||||
Log.i("[Headset] Noisy state detected, most probably a headset has been disconnected");
|
||||
LinphoneManager.getAudioManager().routeAudioToEarPiece();
|
||||
LinphoneManager.getCallManager().refreshInCallActions();
|
||||
} else {
|
||||
Log.w("[Headset] Unknown action: " + action);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -107,7 +107,6 @@ public class RecordingsActivity extends MainActivity
|
|||
hideTopBar();
|
||||
hideTabBar();
|
||||
|
||||
LinphoneManager.getAudioManager().setAudioManagerModeNormal();
|
||||
LinphoneManager.getAudioManager().routeAudioToSpeaker();
|
||||
|
||||
removeDeletedRecordings();
|
||||
|
|
|
@ -107,11 +107,6 @@ public final class LinphoneService extends Service {
|
|||
if (core != null) {
|
||||
core.terminateAllCalls();
|
||||
}
|
||||
|
||||
// If push is enabled, don't unregister account, otherwise do unregister
|
||||
if (LinphonePreferences.instance().isPushNotificationEnabled()) {
|
||||
if (core != null) core.setNetworkReachable(false);
|
||||
}
|
||||
stopSelf();
|
||||
}
|
||||
super.onTaskRemoved(rootIntent);
|
||||
|
|
|
@ -20,9 +20,7 @@
|
|||
package org.linphone.settings;
|
||||
|
||||
import android.Manifest;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.media.AudioManager;
|
||||
import android.os.Bundle;
|
||||
import android.text.InputType;
|
||||
import android.view.LayoutInflater;
|
||||
|
@ -274,7 +272,6 @@ public class AudioSettingsFragment extends SettingsFragment {
|
|||
Core core, EcCalibratorStatus status, int delayMs) {
|
||||
if (status == EcCalibratorStatus.InProgress) return;
|
||||
core.removeListener(this);
|
||||
LinphoneManager.getAudioManager().routeAudioToEarPiece();
|
||||
|
||||
if (status == EcCalibratorStatus.DoneNoEcho) {
|
||||
mEchoCalibration.setSubtitle(getString(R.string.no_echo));
|
||||
|
@ -287,12 +284,8 @@ public class AudioSettingsFragment extends SettingsFragment {
|
|||
mEchoCalibration.setSubtitle(getString(R.string.failed));
|
||||
}
|
||||
mEchoCanceller.setChecked(status != EcCalibratorStatus.DoneNoEcho);
|
||||
((AudioManager)
|
||||
getActivity()
|
||||
.getSystemService(Context.AUDIO_SERVICE))
|
||||
.setMode(AudioManager.MODE_NORMAL);
|
||||
}
|
||||
});
|
||||
LinphoneManager.getAudioManager().startEcCalibration();
|
||||
LinphoneManager.getCore().startEchoCancellerCalibration();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -53,8 +53,8 @@ import org.linphone.utils.LinphoneUtils;
|
|||
|
||||
public class LinphonePreferences {
|
||||
private static final int LINPHONE_CORE_RANDOM_PORT = -1;
|
||||
private static final String LINPHONE_DEFAULT_RC = "/.linphonerc";
|
||||
private static final String LINPHONE_FACTORY_RC = "/linphonerc";
|
||||
public static final String LINPHONE_DEFAULT_RC = "/.linphonerc";
|
||||
public static final String LINPHONE_FACTORY_RC = "/linphonerc";
|
||||
private static final String LINPHONE_LPCONFIG_XSD = "/lpconfig.xsd";
|
||||
private static final String DEFAULT_ASSISTANT_RC = "/default_assistant_create.rc";
|
||||
private static final String LINPHONE_ASSISTANT_RC = "/linphone_assistant_create.rc";
|
||||
|
@ -203,6 +203,15 @@ public class LinphonePreferences {
|
|||
return ringtone;
|
||||
}
|
||||
|
||||
public boolean getReadAndAgreeTermsAndPrivacy() {
|
||||
if (getConfig() == null) return false;
|
||||
return getConfig().getBool("app", "read_and_agree_terms_and_privacy", false);
|
||||
}
|
||||
|
||||
public void setReadAndAgreeTermsAndPrivacy(boolean value) {
|
||||
getConfig().setBool("app", "read_and_agree_terms_and_privacy", value);
|
||||
}
|
||||
|
||||
// Accounts settings
|
||||
private ProxyConfig getProxyConfig(int n) {
|
||||
if (getLc() == null) return null;
|
||||
|
|
|
@ -29,8 +29,6 @@ import android.net.NetworkInfo;
|
|||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.text.Html;
|
||||
import android.text.Spanned;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
|
@ -41,7 +39,6 @@ import androidx.core.content.ContextCompat;
|
|||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.Locale;
|
||||
import java.util.regex.Pattern;
|
||||
import org.linphone.LinphoneContext;
|
||||
import org.linphone.LinphoneManager;
|
||||
import org.linphone.R;
|
||||
|
@ -302,48 +299,6 @@ public final class LinphoneUtils {
|
|||
}
|
||||
}
|
||||
|
||||
public static Spanned getTextWithHttpLinks(String text) {
|
||||
if (text == null) return null;
|
||||
|
||||
if (text.contains("<")) {
|
||||
text = text.replace("<", "<");
|
||||
}
|
||||
if (text.contains(">")) {
|
||||
text = text.replace(">", ">");
|
||||
}
|
||||
if (text.contains("\n")) {
|
||||
text = text.replace("\n", "<br>");
|
||||
}
|
||||
if (text.contains("http://")) {
|
||||
int indexHttp = text.indexOf("http://");
|
||||
int indexFinHttp =
|
||||
text.indexOf(" ", indexHttp) == -1
|
||||
? text.length()
|
||||
: text.indexOf(" ", indexHttp);
|
||||
String link = text.substring(indexHttp, indexFinHttp);
|
||||
String linkWithoutScheme = link.replace("http://", "");
|
||||
text =
|
||||
text.replaceFirst(
|
||||
Pattern.quote(link),
|
||||
"<a href=\"" + link + "\">" + linkWithoutScheme + "</a>");
|
||||
}
|
||||
if (text.contains("https://")) {
|
||||
int indexHttp = text.indexOf("https://");
|
||||
int indexFinHttp =
|
||||
text.indexOf(" ", indexHttp) == -1
|
||||
? text.length()
|
||||
: text.indexOf(" ", indexHttp);
|
||||
String link = text.substring(indexHttp, indexFinHttp);
|
||||
String linkWithoutScheme = link.replace("https://", "");
|
||||
text =
|
||||
text.replaceFirst(
|
||||
Pattern.quote(link),
|
||||
"<a href=\"" + link + "\">" + linkWithoutScheme + "</a>");
|
||||
}
|
||||
|
||||
return Html.fromHtml(text);
|
||||
}
|
||||
|
||||
public static void showTrustDeniedDialog(Context context) {
|
||||
final Dialog dialog = new Dialog(context);
|
||||
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
|
|
|
@ -49,6 +49,27 @@
|
|||
android:layout_height="match_parent"
|
||||
android:columnCount="2">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="fill"
|
||||
android:layout_columnSpan="2"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_margin="10dp">
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/terms_and_privacy_checkbox"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/terms_and_privacy"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/account_creation"
|
||||
style="@style/button_font"
|
||||
|
|
|
@ -49,6 +49,27 @@
|
|||
android:layout_height="match_parent"
|
||||
android:columnCount="1">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="fill"
|
||||
android:layout_columnSpan="1"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_margin="10dp">
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/terms_and_privacy_checkbox"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/terms_and_privacy"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/account_creation"
|
||||
style="@style/button_font"
|
||||
|
|
|
@ -45,11 +45,12 @@
|
|||
<TextView
|
||||
android:id="@+id/inviteFriend"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="20dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginRight="10dp"
|
||||
android:text="@string/invite_friend"
|
||||
android:padding="10dp"
|
||||
android:textAppearance="@style/contact_invite_font"
|
||||
android:visibility="gone" />
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
<entry name="nat_policy_ref" overwrite="true"></entry>
|
||||
<entry name="realm" overwrite="true"></entry>
|
||||
<entry name="conference_factory_uri" overwrite="true"></entry>
|
||||
<entry name="push_notification_allowed" overwrite="true">0</entry>
|
||||
</section>
|
||||
<section name="nat_policy_default_values">
|
||||
<entry name="stun_server" overwrite="true"></entry>
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
<entry name="nat_policy_ref" overwrite="true">nat_policy_default_values</entry>
|
||||
<entry name="realm" overwrite="true">sip.linphone.org</entry>
|
||||
<entry name="conference_factory_uri" overwrite="true">sip:conference-factory@sip.linphone.org</entry>
|
||||
<entry name="push_notification_allowed" overwrite="true">1</entry>
|
||||
</section>
|
||||
<section name="nat_policy_default_values">
|
||||
<entry name="stun_server" overwrite="true">stun.linphone.org</entry>
|
||||
|
|
|
@ -6,15 +6,25 @@
|
|||
<string name="addressbook_label">لِنْفُونْ</string>
|
||||
<string name="notification_title">لِنْفُونْ</string>
|
||||
<string name="wait_dialog_text">يجري التشغيل</string>
|
||||
<string name="notification_registered">%s متصل</string>
|
||||
<string name="notification_register_failure">%s فشل في الاتصال</string>
|
||||
<string name="tunnel_host"></string>
|
||||
<string name="about_version">لِنْفُونْ أندرويد %s</string>
|
||||
<string name="about_liblinphone_version">Linphone Core %s</string>
|
||||
<string name="about_privacy_policy">زُر سياسة خصوصيتنا</string>
|
||||
<string name="sync_account_name">جهات اتصال لِنْفُونْ</string>
|
||||
<!--Notifications-->
|
||||
<string name="notification_reply_label">أجبْ</string>
|
||||
<string name="notification_replied_label">الجواب المُرسَل : %s</string>
|
||||
<string name="notification_call_hangup_label">أنْهِ المكالمة</string>
|
||||
<string name="notification_call_answer_label">أجبْ</string>
|
||||
<string name="notification_mark_as_read_label">حدِّد كمقروءة</string>
|
||||
<!--Common-->
|
||||
<string name="username">اسم المستخدم</string>
|
||||
<string name="userid">معرِّف المستخدم (اختياري)</string>
|
||||
<string name="phone_number">رقم الهاتف</string>
|
||||
<string name="confirmation_code">رمز التأكيد</string>
|
||||
<string name="international_prefix">بادِئَة رقم الهاتف الدولي</string>
|
||||
<string name="display_name">الاسم المعروض</string>
|
||||
<string name="password">كلمة السر</string>
|
||||
<string name="confirm_password">تأكيد كلمة السر</string>
|
||||
|
@ -26,6 +36,7 @@
|
|||
<string name="retry">إعادة المحاولة</string>
|
||||
<string name="cancel">إلغاء</string>
|
||||
<string name="accept">قبول</string>
|
||||
<string name="open">افتح</string>
|
||||
<string name="continue_text">استمرار</string>
|
||||
<string name="about">حول</string>
|
||||
<string name="deny">رفض</string>
|
||||
|
@ -39,12 +50,15 @@
|
|||
<string name="decline">رفض</string>
|
||||
<string name="conference">اجتماع</string>
|
||||
<string name="link">الرابط</string>
|
||||
<string name="link_account_popup">أ تريد ربط الحساب %s مع رقم هاتفك ؟</string>
|
||||
<string name="maybe_later">ربما لاحقا</string>
|
||||
<string name="later">لاحقا</string>
|
||||
<string name="no">لا</string>
|
||||
<string name="ok">حسنا</string>
|
||||
<string name="yes">نعم</string>
|
||||
<string name="link_account">اربط حسابك</string>
|
||||
<string name="update_available">هناك تحديث متاح</string>
|
||||
<string name="do_not_ask_again">لا تظهر مجددا</string>
|
||||
<!--Launch screen-->
|
||||
<string name="app_description">الزبون SIP <i>الحر</i></string>
|
||||
<!--Assistant-->
|
||||
|
@ -75,10 +89,12 @@
|
|||
<string name="assistant_generic_account">استخدم حساب SIP</string>
|
||||
<string name="assistant_remote_provisioning_title">اجذب التهيئة البعيدة</string>
|
||||
<string name="assistant_fetch_apply">اجذبْ وطبِّق</string>
|
||||
<string name="assistant_launch_qrcode">الرمز المربع</string>
|
||||
<string name="assistant_login">الولوج</string>
|
||||
<string name="assistant_ec_calibration">معايرة مزيل الصدى في طور الإنجاز</string>
|
||||
<string name="assistant_remote_provisioning_login">أدخل اسم الولوج</string>
|
||||
<string name="assistant_account_not_validated">لم يتم تأكيد حسابك بعد.</string>
|
||||
<string name="assistant_error_confirmation_code">رمز التأكيد باطل.\nيُرجى إعادة المحاولة.</string>
|
||||
<string name="assistant_account_validated">تم تأكيد حسابك.</string>
|
||||
<string name="assistant_error_bad_credentials">اسم المسخدم أو كلمة السر غير صحيحة</string>
|
||||
<string name="assistant_codec_down_question">أأنت موافق على تنزيل مرماز الفيديو OpenH264 المُقدَّم من طرف شركة Cisco Systems, Inc. ؟</string>
|
||||
|
@ -88,6 +104,7 @@
|
|||
<string name="assistant_codec_downloaded">انتهى تنزيل مرماز الفيديو OpenH264 المُقدَّم من طرف شركة Cisco Systems, Inc.</string>
|
||||
<string name="wizard_failed">حدث خطأ، حاول لاحقا.</string>
|
||||
<string name="wizard_server_unavailable">انعدام الوصول للخادم، تأكد من اتصالك بالشبكة.</string>
|
||||
<string name="wizard_username_unavailable">إسم المستخدم هذا محجوز مسبقا.</string>
|
||||
<string name="wizard_username_incorrect">اسم المستخدم غير صحيح.</string>
|
||||
<string name="assistant_phone_number_incorrect">رقم هاتفك غير صحيح.</string>
|
||||
<string name="wizard_email_incorrect">عنوانك الإلكتروني غير صحيح.</string>
|
||||
|
@ -106,6 +123,7 @@
|
|||
<string name="phone_number_link_info_content">
|
||||
\nسيجدك أصدقاؤك بسهولة إن ربطت حسابك برقم هاتفك\\n\nسوف تجد في دفتر عناوينك من يستخدم لِنْفُونْ وسيتمكن أصدقاؤك من الوصول إليك بواسطة لِنْفُونْ كذلك.لِنْفُونْ.\n</string>
|
||||
<string name="phone_number_link_info_content_already_account">يمكنك استخدام رقم هاتفي واحد مع حساب لنفون واحد.\n\nإن ربطت رقم هاتفك مع حساب آخر لكنك تود استخدام هذا الحساب، يمكنك ببساطة ربطه مع رقم هاتفك تلقائيا وسيُنقَل هذا الأخير إلى هذا الحساب.</string>
|
||||
<string name="account_doesnt_exist">الحساب غير موجود</string>
|
||||
<!--Status-->
|
||||
<string name="invalid_email">البريد الإلكتروني غير صحيح</string>
|
||||
<string name="account_already_exist">الحساب موجود مسبقا</string>
|
||||
|
@ -120,11 +138,13 @@
|
|||
<string name="phone_number_too_long">رقم الهاتف طويل جدا</string>
|
||||
<string name="phone_number_too_short">رقم الهاتف قصير جدا</string>
|
||||
<string name="phone_number_invalid">رقم الهاتف غير صحيح</string>
|
||||
<string name="activation_code_invalid">رمز التفعيل باطل</string>
|
||||
<string name="password_too_short">كلمة السر قصيرة جدا</string>
|
||||
<string name="password_too_long">كلمة السر طويلة جدا</string>
|
||||
<string name="request_failed">فشل في استعلام الخادم. يُرجى إعادة المحاولة لاحقا.</string>
|
||||
<string name="transport_unsupported">النقل غير مدعوم</string>
|
||||
<string name="country_code_invalid">رمز البلد غير صحيح</string>
|
||||
<string name="invalid_characters">هناك حرف أو حروف غير صالحة</string>
|
||||
<!--In-app-->
|
||||
<string name="inapp">التبضع المحمول</string>
|
||||
<string name="inapp_notification_title">شراء بالتبضع محمول</string>
|
||||
|
@ -137,6 +157,7 @@
|
|||
<string name="delete_history_log">أتود حذف سجل المكالمات المحددة ؟</string>
|
||||
<string name="today">اليوم</string>
|
||||
<string name="yesterday">اﻷمس</string>
|
||||
<string name="calls">المكالمات</string>
|
||||
<!--Contacts-->
|
||||
<string name="no_contact">لا وجود لأي جهة اتصال في دفتر عناوينك.</string>
|
||||
<string name="no_sip_contact">لا وجود لأي جهة اتصال SIP في دفتر عناوينك.</string>
|
||||
|
@ -146,10 +167,16 @@
|
|||
<string name="contact_first_name">اﻹسم</string>
|
||||
<string name="contact_last_name">اللقب</string>
|
||||
<string name="contact_organization">المنظمة</string>
|
||||
<string name="invite_friend">ادعُ</string>
|
||||
<string name="invite_friend_text">أهلا، انضم معي إلى لِنْفُونْ ! يمكنك تنزيله مجانا من %s</string>
|
||||
<string name="toast_choose_contact_for_edition">اختر جهة الاتصال أو قم بإنشاء واحدة</string>
|
||||
<!--Chat-->
|
||||
<string name="no_chat_history">لا وجود لأي محادثة</string>
|
||||
<string name="delete_conversation">أتود حذف المحادثات المحددة ؟</string>
|
||||
<string name="delete_message">أتود حذف الرسالة المحددة ؟</string>
|
||||
<string name="remote_composing">المُراسِل يكتب...</string>
|
||||
<string name="remote_composing_single">%s يكتب...</string>
|
||||
<string name="remote_composing_multiple">%s يكتبون...</string>
|
||||
<string name="share_picture_size_small">صغيرة</string>
|
||||
<string name="share_picture_size_medium">متوسطة</string>
|
||||
<string name="share_picture_size_large">كبيرة</string>
|
||||
|
@ -159,6 +186,7 @@
|
|||
<string name="image_picker_title">اختر المصدر</string>
|
||||
<string name="image_saved">حُفظَت الصورة</string>
|
||||
<string name="image_not_saved">خطأ، لم تُحفَظ الصورة</string>
|
||||
<string name="wait">يُرجى الانتظار...</string>
|
||||
<string name="image_transfert_error">حدث خطأ أثناء نقل الملف</string>
|
||||
<string name="message_not_encrypted">إن الرسالة ليست مُعمَّاة</string>
|
||||
<string name="message_cant_be_decrypted">لقد استلمت رسالة مُعمَّاة لم تتمكن من فك تعميتها من %s\nيجب عليك الاتصال بمخاطبك لتبادل مفاتيح ZRTP إذا أردت فك تعمية الرسائل اللاحقة التي ستستلمها.</string>
|
||||
|
@ -167,7 +195,12 @@
|
|||
<string name="processing_image">قد تستلزم معالجة الصور بضع ثوان حسب حجم الملف.</string>
|
||||
<string name="displayed">قُرِأ</string>
|
||||
<string name="delivered">سُلِّم</string>
|
||||
<string name="undelivered">غير مُستلَم</string>
|
||||
<string name="sent">أُرسل</string>
|
||||
<string name="resend">أعد اﻹرسال</string>
|
||||
<string name="error_opening_file">حدث خطأ خلال فتح هذا الملف.</string>
|
||||
<string name="conversation_information">معلومات</string>
|
||||
<string name="chat_room_infos_title">معلومات</string>
|
||||
<string name="add_to_contacts">إضافة إلى جهات الاتصال</string>
|
||||
<string name="download_file">تنزيل</string>
|
||||
<string name="chat_room_ephemeral_message_disabled">غير مفعلة</string>
|
||||
|
|
|
@ -131,6 +131,9 @@ Vos amis pourront vous joindre plus facilement si vous associez votre compte à
|
|||
<string name="phone_number_link_info_content_already_account">Vous ne pouvez associer votre numéro qu\'à un seul compte Linphone.\n\nSi vous avez déjà associé votre numéro à un autre compte mais préférez utiliser ce compte-ci, suivez la procédure d\'association et votre numéro sera automatiquement transféré à ce compte.</string>
|
||||
<string name="phone_number_overuse">Trop de SMS ont été envoyés vers ce numéro en un court laps de temps, veuillez attendre 24h avant de réessayer.</string>
|
||||
<string name="account_doesnt_exist">Ce compte n\'existe pas</string>
|
||||
<string name="assistant_general_terms">les conditions d’utilisation</string>
|
||||
<string name="assistant_privacy_policy">la politique de confidentialité</string>
|
||||
<string name="assistant_read_and_agree_terms">J’accepte %1$s et %2$s de Belledonne Communications</string>
|
||||
<!--Status-->
|
||||
<string name="invalid_email">Mail non valide</string>
|
||||
<string name="account_already_exist">Ce compte existe déjà</string>
|
||||
|
@ -615,6 +618,7 @@ Disponible gratuitement ici : %s</string>
|
|||
<string name="content_description_exit_conference">Quitter la conférence</string>
|
||||
<string name="content_title_notification_service">Notification de service Linphone</string>
|
||||
<string name="content_title_notification">Notifications des messages Linphone</string>
|
||||
<string name="content_title_notification_missed_call">Notifications d\'appels Linphone manqués</string>
|
||||
<string name="content_description_conversation_subject">Sujet de la conversation de groupe</string>
|
||||
<string name="content_description_conversation_infos">Informations de la conversation de groupe</string>
|
||||
<string name="content_description_record_call">Enregistrer l\'appel</string>
|
||||
|
|
|
@ -70,7 +70,7 @@
|
|||
<string name="assistant_create_account">Fiók létrehozása</string>
|
||||
<string name="assistant_link_account">Fiók összekapcsolása</string>
|
||||
<string name="assistant_continue">Folytatás</string>
|
||||
<string name="assistant_activate">A fiók aktiválása</string>
|
||||
<string name="assistant_activate">A fiók indítása</string>
|
||||
<string name="assistant_finish">A konfiguráció befejezése</string>
|
||||
<string name="assistant_validate_account_1">A felhasználói fiókja elkészült. Kérjük, ellenőrizze e-mailjét, hogy érvényesítse a fiókját:</string>
|
||||
<string name="assistant_validate_account_2">Ha ez megtörtént, térjen vissza ide és kattintson a gombra.</string>
|
||||
|
@ -125,11 +125,14 @@
|
|||
<string name="use_email_for_validation">Használjon e-mail címet a fiók érvényesítéséhez</string>
|
||||
<string name="login_with_username">A telefonszám helyett használja a felhasználónevét és jelszavát</string>
|
||||
<string name="phone_number_info_title">Mire fogják használni a telefonszámomat?</string>
|
||||
<string name="phone_number_info_content">\nTelefonszámának köszönhetően barátai könnyebben megtalálják Önt.\n\n A címjegyzékben látni fogja, hogy ki használja a Linphone-t és a barátai tudni fogják, hogy Linphone-on is elérhetik Önt.\n</string>
|
||||
<string name="phone_number_info_content">\nTelefonszámának köszönhetően barátai könnyebben megtalálják Önt.\n\nA címjegyzékben látni fogja, hogy ki használja a Linphone-t és a barátai tudni fogják, hogy Linphone-on is elérhetik Önt.\n</string>
|
||||
<string name="phone_number_link_info_content">\nBarátai könnyebben megtalálják Önt, ha összekapcsolja fiókját a telefonszámával\n\nA címjegyzékben látni fogja, hogy ki használja a Linphone-t, és a barátaid tudni fogják, hogy Linphone-on is elérhetik Önt.\n</string>
|
||||
<string name="phone_number_link_info_content_already_account">A telefonszámát csak egy Linphone-fiókkal használhatja.\n\nHa már összekapcsolta telefonszámát egy másik fiókkal, de inkább ezt használja, egyszerűen kapcsolja össze, és a telefonszám önműködően átkerül ebbe a fiókba.</string>
|
||||
<string name="phone_number_overuse">Túl sok SMS-t küldtek erre a számra rövid idő alatt. Kérjük, várjon 24 órát, mielőtt újra megpróbálja.</string>
|
||||
<string name="account_doesnt_exist">Fiók nem létezik</string>
|
||||
<string name="assistant_general_terms">használati feltételek</string>
|
||||
<string name="assistant_privacy_policy">adatvédelmi szabályzat</string>
|
||||
<string name="assistant_read_and_agree_terms">Elfogadom a Belledonne Communications %1$s és %2$s</string>
|
||||
<!--Status-->
|
||||
<string name="invalid_email">Érvénytelen e-mail</string>
|
||||
<string name="account_already_exist">Fiók már létezik</string>
|
||||
|
@ -144,7 +147,7 @@
|
|||
<string name="phone_number_too_long">Túl hosszú a telefonszám</string>
|
||||
<string name="phone_number_too_short">Túl rövid a telefonszám</string>
|
||||
<string name="phone_number_invalid">Érvénytelen telefonszám</string>
|
||||
<string name="activation_code_invalid">Érvénytelen aktiválási kód</string>
|
||||
<string name="activation_code_invalid">Érvénytelen indítási kód</string>
|
||||
<string name="password_too_short">Jelszó túl rövid</string>
|
||||
<string name="password_too_long">Jelszó túl hosszú</string>
|
||||
<string name="request_failed">Nem sikerült lekérdezni a kiszolgálót. Kérjük, próbálja újra később.</string>
|
||||
|
@ -284,7 +287,7 @@
|
|||
<string name="incoming_call">Bejövő hívás</string>
|
||||
<string name="outgoing_call">Kimenő hívás</string>
|
||||
<string name="add_video_dialog">A hívó be szeretné kapcsolni a videót</string>
|
||||
<string name="no_current_call">Nincs aktív hívás</string>
|
||||
<string name="no_current_call">Nincs jelenlegi hívás</string>
|
||||
<string name="call_paused_by_remote">Távoli felhasználó várakoztatja a hívását.</string>
|
||||
<string name="couldnt_accept_call">Hiba történt a hívás elfogadása közben</string>
|
||||
<string name="zrtp_local_sas">Mond:</string>
|
||||
|
@ -466,7 +469,7 @@
|
|||
<string name="lime_encryption_entry_disabled">Tiltva</string>
|
||||
<string name="lime_encryption_entry_mandatory">Kötelező</string>
|
||||
<string name="lime_encryption_entry_preferred">Elsődleges</string>
|
||||
<string name="lime_encryption_enable_zrtp"> LIME ZRTP titkosítást igényel. \ LIME aktiválásával automatikusan aktiválja a ZRTP adathordozó titkosítást.</string>
|
||||
<string name="lime_encryption_enable_zrtp">LIME ZRTP titkosítást igényel.\nLIME indításával önműködően indítja a ZRTP adathordozó titkosítást.</string>
|
||||
<string name="pref_auto_download_policy_title">A bejövő fájlok önműködő letöltése szabályzat</string>
|
||||
<string name="pref_auto_download_max_size_title">Max. méret (bájtban)</string>
|
||||
<string name="pref_auto_download_disabled">Soha</string>
|
||||
|
@ -613,6 +616,7 @@
|
|||
<string name="content_description_exit_conference">Konferencia elhagyása</string>
|
||||
<string name="content_title_notification_service">Linphone szolgáltatás-értesítés</string>
|
||||
<string name="content_title_notification">Linphone csevegőüzenetek értesítések</string>
|
||||
<string name="content_title_notification_missed_call">Linphone nem fogadott hívások értesítései</string>
|
||||
<string name="content_description_conversation_subject">Csoportos csevegőszoba tárgya</string>
|
||||
<string name="content_description_conversation_infos">Csoportos csevegőszoba tájékoztatás</string>
|
||||
<string name="content_description_record_call">Hívás felvétele</string>
|
||||
|
|
|
@ -130,6 +130,9 @@
|
|||
<string name="phone_number_link_info_content_already_account">Puoi utilizzare il tuo numero di telefono solo con un account Linphone.\n\nSe avevi già collegato il tuo numero a un altro account ma preferisci utilizzare questo, collegalo semplicemente ora e il tuo numero verrà automaticamente spostato su questo account.</string>
|
||||
<string name="phone_number_overuse">Troppi SMS sono stati inviati a questo numero in un breve periodo di tempo, riprova tra 24 ore.</string>
|
||||
<string name="account_doesnt_exist">L\'account non esiste</string>
|
||||
<string name="assistant_general_terms">termini di utilizzo</string>
|
||||
<string name="assistant_privacy_policy">informativa privacy</string>
|
||||
<string name="assistant_read_and_agree_terms">Accetto %1$s e %2$s di Belledonne Communications</string>
|
||||
<!--Status-->
|
||||
<string name="invalid_email">E-mail non valida</string>
|
||||
<string name="account_already_exist">Account già esistente</string>
|
||||
|
@ -613,6 +616,7 @@
|
|||
<string name="content_description_exit_conference">Esci dalla conferenza</string>
|
||||
<string name="content_title_notification_service">Notifica del servizio Linphone</string>
|
||||
<string name="content_title_notification">Notifiche di messaggi istantanei Linphone</string>
|
||||
<string name="content_title_notification_missed_call">Notifiche di chiamate Linphone perse</string>
|
||||
<string name="content_description_conversation_subject">Oggetto della chat room di gruppo</string>
|
||||
<string name="content_description_conversation_infos">Informazioni sulla chat room di gruppo</string>
|
||||
<string name="content_description_record_call">Registra chiamata</string>
|
||||
|
|
|
@ -6,15 +6,26 @@
|
|||
<string name="addressbook_label">Linphone</string>
|
||||
<string name="notification_title">Linphone</string>
|
||||
<string name="wait_dialog_text">მიმდინარეობს გაშვება</string>
|
||||
<string name="notification_registered">%s დაკავშირებულია</string>
|
||||
<string name="notification_register_failure">%s ვერ დაკავშირდა</string>
|
||||
<string name="tunnel_host"></string>
|
||||
<string name="about_version">Linphone Android %s</string>
|
||||
<string name="about_liblinphone_version">Linphone ბირთვი %s</string>
|
||||
<string name="about_liblinphone_sdk_version">Linphone SDK %s</string>
|
||||
<string name="about_privacy_policy">ნახეთ ჩვენი პირადი უსაფრთხოების პოლიტიკა</string>
|
||||
<string name="sync_account_name">linphone კონტაქტები</string>
|
||||
<!--Notifications-->
|
||||
<string name="notification_reply_label">პასუხი</string>
|
||||
<string name="notification_replied_label">პასუხის გაგზავნა: %s</string>
|
||||
<string name="notification_call_hangup_label">დაკიდება</string>
|
||||
<string name="notification_call_answer_label">პასუხი</string>
|
||||
<string name="notification_mark_as_read_label">წაკითხულად მონიშვნა</string>
|
||||
<!--Common-->
|
||||
<string name="username">მომხმარებლის სახელი</string>
|
||||
<string name="userid">User-id (არასავალდებულო)</string>
|
||||
<string name="phone_number">ტელეფონის ნომერი</string>
|
||||
<string name="confirmation_code">დადასტურების კოდი</string>
|
||||
<string name="international_prefix">საერთაშორისო ტელეფონის ნომერის პრეფიქსი</string>
|
||||
<string name="display_name">სახელი</string>
|
||||
<string name="password">პაროლი</string>
|
||||
<string name="confirm_password">პრაოლის დასტური</string>
|
||||
|
@ -40,6 +51,7 @@
|
|||
<string name="decline">უარყოფა</string>
|
||||
<string name="conference">კონფერენცია</string>
|
||||
<string name="link">ბმული</string>
|
||||
<string name="link_account_popup">გსურთ მიაბათ ანგარიში %s თქვენს ტელეფონის ნომერს?</string>
|
||||
<string name="maybe_later">შესაძლოა მოგვიანებით</string>
|
||||
<string name="later">მოგვიანებით</string>
|
||||
<string name="no">არა</string>
|
||||
|
@ -47,6 +59,9 @@
|
|||
<string name="yes">დიახ</string>
|
||||
<string name="link_account">ანგარიშის მიბმა</string>
|
||||
<string name="update_available">ხელმისაწვდომია განახლება</string>
|
||||
<string name="do_not_ask_again">აღარ მაჩვენო</string>
|
||||
<string name="delete_contacts_text">დარწმუნებილი ხართ, რომ გსურთ ამ კონტაქტების წაშლა?\nისინი თქვენი ტელეფონიდანაც წაიშელბა!</string>
|
||||
<string name="logs_url_copied_to_clipboard">ჟურნალების ბმული კოპირებულია ბუფერში</string>
|
||||
<!--Launch screen-->
|
||||
<string name="app_description"><i>თავისუფალი</i> SIP კლიენტი</string>
|
||||
<!--Assistant-->
|
||||
|
@ -77,24 +92,30 @@
|
|||
<string name="assistant_generic_account">SIP ანგარიშის გამოყენება</string>
|
||||
<string name="assistant_remote_provisioning_title">დაშორებული კონფიგურაციის მიღება</string>
|
||||
<string name="assistant_fetch_apply">გადმოწერა და მიღება</string>
|
||||
<string name="assistant_launch_qrcode">QRკოდი</string>
|
||||
<string name="assistant_login">შესვლა</string>
|
||||
<string name="assistant_ec_calibration">მიმდინარეობს ექოს გამაუქმებელის კალიბრაცია</string>
|
||||
<string name="assistant_remote_provisioning_login">შეიყვანეთ თქვენი მომხმარებლის სახელი</string>
|
||||
<string name="assistant_account_not_validated">თქვენი ანგარიში ჯერ არ იქნა დადასტურებული.</string>
|
||||
<string name="assistant_error_confirmation_code">დადასტურების კოდი არასწორია.\nსცადეთ თავიდან.</string>
|
||||
<string name="assistant_account_validated">თქვენი ანგარიში იქნა დადასტურებული</string>
|
||||
<string name="assistant_error_bad_credentials">არასწორი მომხმარებლის სახელი ან პაროლი</string>
|
||||
<string name="assistant_codec_down_question">ეთანხმებით Cisco Systems, Inc. მოერ მოწოდებული OpenH264 ვიდეო კოდეკის გადმოწერას?</string>
|
||||
<string name="assistant_codec_downloading">მიმდინარეობს Cisco Systems, Inc. მიერ მოწოდებული OpenH264 ვიდეო კოდეკის გადმოწერა</string>
|
||||
<string name="assistant_openh264_downloading">მიმდინარეობს OpenH264-ს გადმოწერა</string>
|
||||
<string name="assistant_openh264_restart">სანამ შეძლებთ OpenH264 კოდეკის გამოყენებას, უნდა გადატვირთოთ %s.</string>
|
||||
<string name="assistant_openh264_error">ბოდიში, მოხდა შეცდომა.</string>
|
||||
<string name="assistant_codec_downloaded">Cisco Systems, Inc. მიერ მოწოდებული OpenH264 ვიდეო კოდეკის იქნა გადმოწერილი.</string>
|
||||
<string name="wizard_failed">მოხდა შეცდომა, გთხოვთ, სცადოთ მოგვიანებით.</string>
|
||||
<string name="wizard_server_unavailable">სერვისი მიუეწვდომელია, შეამოწმეთ თქვენი ქსელური კავშირი.</string>
|
||||
<string name="wizard_username_unavailable">ეს მომხმარებლის სახელი უკვე დაკავებულია.</string>
|
||||
<string name="assistant_phone_number_unavailable">ტელეფონის ნომერი უკვე გამოიყენება.\nგთხოვთ, აკრიფოთ სხვა ნომერი.\nშეგიძლიათ წაშალოთ თქვენი არსებული ანგარიში, თუ გსურთ თქვენი ტელეფონის ნომრის ისევ გამოყენება.</string>
|
||||
<string name="wizard_username_incorrect">თქვენი მომხმარებლის სახელი არასწორია.</string>
|
||||
<string name="assistant_phone_number_incorrect">თქვენი ტელეფონის ნომერი არასწორია.</string>
|
||||
<string name="wizard_email_incorrect">თქვენი ელფოსტა არასწორია.</string>
|
||||
<string name="wizard_password_incorrect">თქვენი პაროლი არასწორია</string>
|
||||
<string name="wizard_passwords_unmatched">პაროლები არ ემთხვევა.</string>
|
||||
<string name="setup_confirm_username">თქვენი მომხმარებლის სახელი იქნება %s.\n\nიგი შეიძლება იყოს თქვენს მიერ შეყვანილისგან განსხვავებული, რომ დაემთხვეს მოთხოვნებს.\nეთანხმებით?</string>
|
||||
<string name="first_launch_no_login_password">გთხოვთ, შეიყვანოთ თქვენი მომხმარებლის სახელი და პაროლი</string>
|
||||
<string name="forgot_password">დაგავიწყდათ პაროლი?</string>
|
||||
<string name="assistant_choose_country">აირჩიეთ ქვეყანა</string>
|
||||
|
@ -107,6 +128,8 @@
|
|||
<string name="phone_number_info_content">\nთქვენი ტელეფონის ნომრის დახმარებით, თქვენი მეგობრები შეძლებენ გიპოვონ უფრო მარტივად.\n\nთქვენ დაინახავთ თქვენს მისამართები წიგნში ვინ იყენებს Linphone-ს და თქვენს მეგობრებს ეცოდინებათ, რომ შეუძლიათ ასევე დაგიკავშირდნენ Linphone-ით.\n</string>
|
||||
<string name="phone_number_link_info_content">\nთქვენი მეგობრები გიპოვიან უფრო მარტივად, თუ მიაბამთ თქვენს ანგარიშს თქვენს ტელფონის ნომერზე.\n\nთქვენ დაინახავთ თქვენს მისამართები წიგნში ვინ იყენებს Linphone-ს და თქვენს მეგობრებს ეცოდინებათ, რომ შეუძლიათ ასევე დაგიკავშირდნენ Linphone-ით.\n</string>
|
||||
<string name="phone_number_link_info_content_already_account">თქვენ შეგიძლიათ გამოიყენოთ თქვენი ტელეფონის ნომერი მხოლოდ ერთ Linphone ანგარიშთან.\n\nთუ უკვე მიბმული გაქვთ თქვენი ნომერი სხვა ანგარიშზე, მაგრამ გსურთ ამის გამოყენება, უბრალოდ მიაბით იგი ახლა და თქვენი ნომერი იქნება ავტომატურად გადმოტანილი ამ ანგარიშზე.</string>
|
||||
<string name="phone_number_overuse">ნამეტანი ბევრი სმს იყო გამოგზავნილი ამ ნომერზე მოკლე დროის განმავლობაში, სცადეთ თავიდან 24 საათში.</string>
|
||||
<string name="account_doesnt_exist">ანგარიში არ არსებობს</string>
|
||||
<!--Status-->
|
||||
<string name="invalid_email">არასწორი ელფოსტა</string>
|
||||
<string name="account_already_exist">ანგარიში უკვე არსებობს</string>
|
||||
|
@ -121,14 +144,17 @@
|
|||
<string name="phone_number_too_long">ტელეფონის ნომერი ნამეტანი გრძელია</string>
|
||||
<string name="phone_number_too_short">ტელეფონის ნომერი ნამეტანი მოკლეა</string>
|
||||
<string name="phone_number_invalid">არასწორი ტელეფონის ნომერი</string>
|
||||
<string name="activation_code_invalid">არასწორი აქტივაციის კოდი</string>
|
||||
<string name="password_too_short">პაროლი ნამეტანი მოკლეა</string>
|
||||
<string name="password_too_long">პაროლი ნამეტანი გრძელია</string>
|
||||
<string name="request_failed">სერვერის გამოკითხვა ვერ მოხერხდა. გთხოვთ, სცადოთ მოგვიანებით</string>
|
||||
<string name="transport_unsupported">ტრანსპორტი არ არის მხარდაჭერილი</string>
|
||||
<string name="country_code_invalid">ქვეყნის კოდი არასწორი</string>
|
||||
<string name="invalid_characters">მოიძებნა არასწორი სიმბოლო</string>
|
||||
<!--In-app-->
|
||||
<string name="inapp">პროგრამის-შიდა</string>
|
||||
<string name="inapp_notification_title">პროგრამის-შიდა შესყიდვა</string>
|
||||
<string name="inapp_notification_trial_expire">საცდელ პერიოდს გასდის ვადა %s</string>
|
||||
<string name="inapp_notification_account_expire">გამოწერის პერიოდი მთავრდება %s-ს</string>
|
||||
<!--Dailer-->
|
||||
<string name="address_bar_hint">შეიყვანეთ ნომერი ან მისამართი</string>
|
||||
|
@ -138,6 +164,7 @@
|
|||
<string name="delete_history_log">გსურთ არჩეული ზარების ჟურნალის წაშლა?</string>
|
||||
<string name="today">დღეს</string>
|
||||
<string name="yesterday">გუშინ</string>
|
||||
<string name="calls">ზარები</string>
|
||||
<!--Contacts-->
|
||||
<string name="no_contact">თქვენს მისამართების წიგნში არ არის კონტაქტები</string>
|
||||
<string name="no_sip_contact">თქვენს მისამართების წიგნში არ არის SIP კონტაქტები</string>
|
||||
|
@ -147,10 +174,16 @@
|
|||
<string name="contact_first_name">სახელი</string>
|
||||
<string name="contact_last_name">გვარი</string>
|
||||
<string name="contact_organization">ორგანიზაცია</string>
|
||||
<string name="invite_friend">მოწვევა</string>
|
||||
<string name="invite_friend_text">გამარჯობა, შემომიერთდი Linphone-ზე! შეგიძლია გადმოიწერო უფასოდ აქ %s</string>
|
||||
<string name="toast_choose_contact_for_edition">აირჩიეთ კონტაქტი ან შექმენით ახალი</string>
|
||||
<!--Chat-->
|
||||
<string name="no_chat_history">მიმოწერა არ არის</string>
|
||||
<string name="delete_conversation">გსურთ არჩეული მიმოწერის წაშლა?</string>
|
||||
<string name="delete_message">გსურთ არჩეული შეტყობინების წაშლა?</string>
|
||||
<string name="remote_composing">დაშორებული წერს...</string>
|
||||
<string name="remote_composing_single">%s წერს...</string>
|
||||
<string name="remote_composing_multiple">%s წერენ...</string>
|
||||
<string name="share_picture_size_small">პატარა</string>
|
||||
<string name="share_picture_size_medium">საშუალო</string>
|
||||
<string name="share_picture_size_large">დიდი</string>
|
||||
|
@ -160,6 +193,7 @@
|
|||
<string name="image_picker_title">წყაროს არჩევა</string>
|
||||
<string name="image_saved">სურათი შენახულია</string>
|
||||
<string name="image_not_saved">შეცდომა, სურათი ვერ შეინახა</string>
|
||||
<string name="wait">გთხოვთ, დაელოდოთ...</string>
|
||||
<string name="image_transfert_error">ფაილისი გზავნის დროს მოხდა შეცდომა</string>
|
||||
<string name="message_not_encrypted">ეს შეტყობინება არ არის დაშიფრული</string>
|
||||
<string name="message_cant_be_decrypted">თქვენ მიიღეთ დაშიფრული შეტყობინება, რომლის განშიფრვაც %s-დან არ შეგიძლიათ\nუნდა დაუკავშერდეთ თქვენს კორესპონდენტს იმისათვის, რომ გაცვალოთ ZRTP გასაღებები, თუ გსურთ მომავალი მიღებული შეტყობინებების განშიფრვა.</string>
|
||||
|
@ -171,6 +205,7 @@
|
|||
<string name="undelivered">არა მისული</string>
|
||||
<string name="sent">გაგზავნილი</string>
|
||||
<string name="resend">თავიდან გაგზავნა</string>
|
||||
<string name="error_opening_file">ამ ფაილის გახსნისას მოხდა შეცდომა.</string>
|
||||
<string name="conversation_information">ინფო</string>
|
||||
<string name="administrator">ადმინი</string>
|
||||
<string name="conversation_subject_hint">დაარქვით სახელი ჯგუფს</string>
|
||||
|
@ -192,16 +227,57 @@
|
|||
<string name="chat_room_you_are_now_admin">თქვენ აწი ადმინი ხართ</string>
|
||||
<string name="chat_room_you_are_no_longer_admin">თქვენ აღარ ხართ ადმინი</string>
|
||||
<string name="chat_room_creation_failed">ჩატის ოთახის შექმნა ვერ მოხერხდა</string>
|
||||
<string name="chat_room_leave_dialog">გსურთ ამ საუბრის დატოვება?</string>
|
||||
<string name="chat_room_leave_button">დატოვება</string>
|
||||
<string name="chat_room_delete_dialog">გსურთ წაშალოთ და დატოვოთ არჩეული საუბრები?</string>
|
||||
<string name="separator">: </string>
|
||||
<string name="imdn_info">მიწოდების სტატუსი</string>
|
||||
<string name="chat_room_devices">%s-ს მოწყობილობები</string>
|
||||
<string name="group_chat_room_devices">საუბრის მოწყობილობები</string>
|
||||
<string name="add_to_contacts">კონტაქტებში დამატება</string>
|
||||
<string name="lime_security_popup">სასწრაფო შეტყობინება არის \"ბოლო ბოლოში\" დაშიფრული დაცულ საუბარში. შესაძლებელია საუბრის დაცვის დონის გაუმჯობესება მონაწილეთა აუთენტიფიკაციით. ამისათვის, დაურეკეთ კონტაქტს და მიყევით აუთენტიფიკაციის პროცესს.</string>
|
||||
<string name="lime_identity_key_changed">LIME პირადობის გასაღები შეიცვალა %s-ზე</string>
|
||||
<string name="man_in_the_middle_detected">%s-სთვის აღმოჩენილია კაცი-შუაში თავდასხმა</string>
|
||||
<string name="security_level_downgraded">დაცვის დონე დაიწია %s-ს გამო</string>
|
||||
<string name="participant_max_count_exceeded">მონაწილეთა მაქსიმალური რაოდენობა გადაჭარბებულია %s-თ</string>
|
||||
<string name="unexpected_event">მოულოდნელი შემთხვევა %i %s-სთვის</string>
|
||||
<string name="download_file">გადმოწერა</string>
|
||||
<string name="toast_choose_chat_room_for_sharing">აირჩიეთ საუბარი ან შექმენით ახალი</string>
|
||||
<string name="trust_denied">ნდობა უარყოფილია. წამოიწყეთ ზარი აუთენტიფიკაციის პროცეს თავიდან დასაწყებად.</string>
|
||||
<string name="cant_open_file_no_app_found">ფაილის გახსნა ვერ მოხერხდა, ამ ფორმატისთვის არცერთი აპლიკაცია არ არის მისაწვდომი.</string>
|
||||
<string name="chat_message_forwarded">გადაგზავნილი</string>
|
||||
<string name="chat_room_context_menu_group_info">ჯგუფის ინფო</string>
|
||||
<string name="chat_room_context_menu_participants_devices">საუბრის მოწყობილობები</string>
|
||||
<string name="chat_message_context_menu_ephemeral_messages">ეფემერული შეტყობინებები</string>
|
||||
<string name="chat_message_context_menu_delete_messages">შეტყობინებების წაშლა</string>
|
||||
<string name="chat_message_context_menu_forward">გადაგზავნა</string>
|
||||
<string name="chat_room_ephemeral_fragment_title">ეფემერული შეტყობინებები</string>
|
||||
<string name="chat_room_ephemeral_messages_desc">ეს შეტყობინება იქნება წაშლილი ორივე მხარეს, როდესაც იქნება წაკითხული და არჩეული ვადის გასვლის შემდეგ.</string>
|
||||
<string name="chat_room_ephemeral_message_disabled">გათიშულია</string>
|
||||
<string name="chat_room_ephemeral_message_one_minute">1 წუთი</string>
|
||||
<string name="chat_room_ephemeral_message_one_hour">1 საათი</string>
|
||||
<string name="chat_room_ephemeral_message_one_day">1 დღე</string>
|
||||
<string name="chat_room_ephemeral_message_three_days">3 დღე</string>
|
||||
<string name="chat_room_ephemeral_message_one_week">1 კვირა</string>
|
||||
<plurals name="days">
|
||||
<item quantity="one">%d დღე</item>
|
||||
<item quantity="other">%d დღე</item>
|
||||
</plurals>
|
||||
<string name="chat_event_ephemeral_disabled">თქვენ გათიშეთ ეფემერული შეტყობინებები</string>
|
||||
<string name="chat_event_ephemeral_enabled">თქვენ ჩართეთ ეფემერული შეტყობინებები: %s</string>
|
||||
<string name="chat_event_ephemeral_lifetime_changed">ეფემერული შეტყობინებების ვადა: %s</string>
|
||||
<string name="chat_message_forward_confirmation_dialog">გსურთ ამ შეტყობინების გადაგზავნა ამ ოთახში?</string>
|
||||
<!--Status Bar-->
|
||||
<string name="status_connected">დაკავშირებული</string>
|
||||
<string name="status_not_connected">არ არის დაკავშირებული</string>
|
||||
<string name="status_in_progress">კავშირი მიმდინარეობს</string>
|
||||
<string name="status_error">დაკავშირება ვერ მოხერხდა</string>
|
||||
<string name="voicemail_unread">წაუკითხავი შეტყობინება</string>
|
||||
<!--Side Menu-->
|
||||
<string name="menu_logout">გამოსვლა</string>
|
||||
<string name="menu_assistant">ასისტენტი</string>
|
||||
<string name="menu_settings">პარამეტრები</string>
|
||||
<string name="menu_recordings">ჩანაწერები</string>
|
||||
<string name="menu_about">შესახებ</string>
|
||||
<string name="quit">გასვლა</string>
|
||||
<!--Call-->
|
||||
|
@ -211,6 +287,9 @@
|
|||
<string name="no_current_call">აქტიური ზარი არ არის</string>
|
||||
<string name="call_paused_by_remote">თქვენმა მხმობლემა შეაჩერა ზარი</string>
|
||||
<string name="couldnt_accept_call">ზარის მიღებისას მოხდა შეცდომა</string>
|
||||
<string name="zrtp_local_sas">თქმა:</string>
|
||||
<string name="zrtp_remote_sas">დაადასტურეთ, რომ თქვენი მოსაუბრე ამბობს:</string>
|
||||
<string name="zrtp_dialog_title">კავშირის უსაფრთხოება</string>
|
||||
<string name="zrtp_notification_title">SAS</string>
|
||||
<string name="zrtp_notification_message">დაადასტურეთ წინა SAS კოდი თქვენს მოკავშირესთან</string>
|
||||
<string name="unknown_incoming_call_name">უცნობი</string>
|
||||
|
@ -231,8 +310,14 @@
|
|||
<string name="call_stats_jitter_buffer">ჯიტერის ბუფერი:</string>
|
||||
<string name="call_stats_encoder_name">ენკოდერი:</string>
|
||||
<string name="call_stats_decoder_name">დეკოდერი:</string>
|
||||
<string name="call_stats_player_filter">დამკვრელის ფილტრი:</string>
|
||||
<string name="call_stats_display_filter">ჩვენების ფილტრი:</string>
|
||||
<string name="call_stats_capture_filter">ჩაწერის ფილტრი:</string>
|
||||
<string name="call">ზარი</string>
|
||||
<string name="call_log_delete_dialog">გსურთ არჩეული ზარების ჟურნალის წაშლა?</string>
|
||||
<!--Recordings-->
|
||||
<string name="no_recordings">ჩანაწერი ვერ მოიძებნა</string>
|
||||
<string name="recordings_delete_dialog">გსურთ არჩეული ჩანაწერების წაშლა?</string>
|
||||
<!--About-->
|
||||
<string name="menu_send_log">ჟურნალის გაგზავნა</string>
|
||||
<string name="menu_reset_log">ჟურნალის ჩამოგდება</string>
|
||||
|
@ -240,6 +325,8 @@
|
|||
<string name="incall_notif_active">მიმდინარეობს აუდიო ზარი</string>
|
||||
<string name="incall_notif_paused">მიმდინარე ზარი შეჩერებულია</string>
|
||||
<string name="incall_notif_video">მიმდინარეობს ზარის ვიდეო ჩაწერა</string>
|
||||
<string name="incall_notif_incoming">შემომავალი ზარი</string>
|
||||
<string name="incall_notif_outgoing">გამავალი ზარი</string>
|
||||
<string name="notification_started">დაწყებულია</string>
|
||||
<string name="unread_messages">%i წაუკითხავი შეტყობინება</string>
|
||||
<string name="missed_calls_notif_title">გამოტოვებული ზარი</string>
|
||||
|
@ -260,6 +347,7 @@
|
|||
<string name="error_unauthorized">არაავტორიზებული</string>
|
||||
<string name="error_io_error">ქსელის შეცდომა</string>
|
||||
<string name="download_image_failed">გადმოწერა ვერ მოხერხდა. გთხოვთ, შეამოწმოთ თქვენი ქსელური კავშირი ან სცადოთ მოგვიანებით.</string>
|
||||
<string name="remote_provisioning_failure">დაშორებული მომარაგების ფროფილის გადმოწერა ან დაყენება ვერ მოხერხდა...</string>
|
||||
<string name="remote_provisioning_again_title">დაშორებული პროვიზია</string>
|
||||
<string name="remote_provisioning_again_message">გსურთ პროვიზიის URI-ს შეცვლა?</string>
|
||||
<!--Account Settings-->
|
||||
|
@ -286,6 +374,7 @@
|
|||
<string name="pref_display_name">სახელი</string>
|
||||
<string name="pref_help_display_name">შეიყვანეთ სახელი (არა სავალდებულო)</string>
|
||||
<string name="pref_prefix">პრეფიქსი</string>
|
||||
<string name="pref_prefix_desc">თქვენი ქვეყნის პრეფიქსი (+-ის გარეშე)</string>
|
||||
<string name="pref_transport">ტრანსპორტი</string>
|
||||
<string name="pref_transport_udp">UDP</string>
|
||||
<string name="pref_transport_tcp">TCP</string>
|
||||
|
@ -303,6 +392,9 @@
|
|||
<string name="pref_tunnel_title">გვირაბი</string>
|
||||
<string name="pref_tunnel_host">ჰოსტის სახელ</string>
|
||||
<string name="pref_tunnel_port">პორტი</string>
|
||||
<string name="pref_tunnel_dual_mode">ორმაგი რეჟიმის ჩართვა</string>
|
||||
<string name="pref_tunnel_host_2">ჰოსტის სახელი (მე-2 სერვერი ორმაგი რეჟიმისთვის)</string>
|
||||
<string name="pref_tunnel_port_2">პორტი (მე-2 სერვერი ორმაგი რეჟიმისთვის)</string>
|
||||
<string name="pref_tunnel_mode">რეჟიმი</string>
|
||||
<!--do not change order without changing corresponding entry_values in non_localizable_strings.xml-->
|
||||
<string-array name="tunnel_mode_entries">
|
||||
|
@ -313,6 +405,7 @@
|
|||
</string-array>
|
||||
<string name="pref_none">არცერთი</string>
|
||||
<string name="pref_preferences_title">პარამეტრები</string>
|
||||
<string name="pref_video_enable_title">ვიდეოს ჩართვა</string>
|
||||
<!--Audio settings-->
|
||||
<string name="pref_audio_title">ხმა</string>
|
||||
<string name="pref_echo_cancellation">ექოს გაუქმება</string>
|
||||
|
@ -325,9 +418,12 @@
|
|||
<string name="failed">ვერ მოხერხდა</string>
|
||||
<string name="pref_adaptive_rate_control">ადაპტიური სიხშირის კონტროლი</string>
|
||||
<string name="pref_codec_bitrate_limit">კოდეკის ბიტრეიტის შეზღუდვა</string>
|
||||
<string name="pref_mic_gain_db">მიკროფონის ნამატი (დბ-ში)</string>
|
||||
<string name="pref_playback_gain_db">დაკვრის ნამატი (დბ-ში)</string>
|
||||
<string name="pref_codecs">კოდეკები</string>
|
||||
<!--Video settings-->
|
||||
<string name="pref_video_title">ვიდეო</string>
|
||||
<string name="pref_video_camera_device">კამერა</string>
|
||||
<string name="pref_overlay">ვიდეოს გადაფარვა</string>
|
||||
<string name="pref_overlay_summary">ზარის ვიდეოს გამოჩენა გადაფარვაში, როდესაც იმყოფებით პროგრამის გარეთ</string>
|
||||
<string name="pref_video_use_front_camera_title">წინა კამერის გამოყენება</string>
|
||||
|
@ -338,15 +434,30 @@
|
|||
<string name="pref_video_preset">ვიდეოს წინასწარი პარამეტრები</string>
|
||||
<string name="pref_preferred_video_size">არჩეული ვიდეოს ზომა</string>
|
||||
<string name="pref_preferred_fps">არჩეული კადრი/წმ</string>
|
||||
<string name="pref_preview_video">კამერის წინასწარი ხედის ჩვენება ამკრეფში</string>
|
||||
<string name="pref_bandwidth_limit">გამტარი უნარის შეზღუდვა კბიტ/წმ-ში</string>
|
||||
<string name="pref_video_codecs_title">კოდეკები</string>
|
||||
<!--Contact settings-->
|
||||
<string name="pref_contact_sync_title">დასწრების ინფორმაცია ნატიურ კონტაქტში</string>
|
||||
<string name="pref_contact_sync_subtitle">ინფორმაციის იარლიყების ჩასმა Linphone-ს კონტაქტიდან Android-ს ნატიურ კონტაქტებში</string>
|
||||
<string name="pref_contact_title">კონტაქტი</string>
|
||||
<string name="pref_contact_display_contact_organization_title">კონტაქტის ორგანიზაციის ჩვენება</string>
|
||||
<string name="pref_create_contact_shortcuts">იარლიყის შექმნა გამშვებში</string>
|
||||
<!--Call settings-->
|
||||
<string name="pref_call_title">ზარი</string>
|
||||
<string name="pref_device_ringtone">მოწყობილობის რეკვის ხმის გამოყენება</string>
|
||||
<string name="pref_vibrate_on_incoming_calls">ვიბრირება შემომავალი ზარის რეკვისას</string>
|
||||
<string name="pref_auto_answer">შემომავალ პასუხებზე ავტო-პასუხი</string>
|
||||
<string name="pref_auto_answer_time">ავტო-პასუხის დრო (მილიწამებში)</string>
|
||||
<string name="pref_rfc2833_dtmf">დია[აზონის შიდა DTMF-ის (RFC2833) გაგზავნა</string>
|
||||
<string name="pref_sipinfo_dtmf">დიაპაზონის გარე DTMF-ის (SIP INFO) გაგზავნა</string>
|
||||
<string name="pref_call_timeout_title">ზარის ვადა (წამებში)</string>
|
||||
<string name="pref_voice_mail">ხმოვანი ფოსტის URI</string>
|
||||
<string name="pref_dialer_call">Linphone-ის გამოყენება ნაგულისხმევი ტელეფონის აპლიკაციად</string>
|
||||
<string name="pref_accept_early_media">ადრინდელი მედიის მიღება</string>
|
||||
<string name="pref_grant_read_dnd_settings_permission_title">\"არ შემაწუხო\"-ს პარამეტრები</string>
|
||||
<string name="pref_grant_read_dnd_settings_permission_desc">ჩვენ გვჭირდება, რომ მოგვცეთ წვდომა \"არ შემაწუხო\"-ს პარამეტრების გამოყენებაზე, რომ სწორად დავრეკოთ (ან არა), მიმდინარე პოლიტიკის მიხედვით</string>
|
||||
<string name="pref_media_encryption_mandatory_title">აუცილებებლი მედიის დაშიფრვა</string>
|
||||
<!--Chat settings-->
|
||||
<string name="pref_chat_title">ჩატი</string>
|
||||
<string name="pref_image_sharing_server_title">მიმდინარეობს სერვერის გაზიარება</string>
|
||||
|
@ -356,6 +467,17 @@
|
|||
<string name="lime_encryption_entry_mandatory">სავალდებულო</string>
|
||||
<string name="lime_encryption_entry_preferred">არჩეული</string>
|
||||
<string name="lime_encryption_enable_zrtp">LIME-ს სჭირდება ZRTP დაშიფრვა.\nLIME-ს აქტივაციით, თქვენ ავტომატურად ააქტიურებთ ZRTP მედიის დაშიფრვას.</string>
|
||||
<string name="pref_auto_download_policy_title">შემომავალი ფაილების ავტომატური გადმოწერის პოლიტიკა</string>
|
||||
<string name="pref_auto_download_max_size_title">მაქს ზომა (ბაიტებში)</string>
|
||||
<string name="pref_auto_download_disabled">არასდროს</string>
|
||||
<string name="pref_auto_download_always">ყოველთვის</string>
|
||||
<string name="pref_auto_download_under_size">თუ მაქს ზომაზე მცირეა</string>
|
||||
<string name="pref_android_app_hide_empty_chat_rooms_title">ცარიელი ჩატის ოთახების დამალვა</string>
|
||||
<string name="pref_android_app_hide_chat_rooms_from_removed_proxies_title">პროქსის კონფიგურაციიდან ამოშლილი ჩატის ოთახების დამალვა</string>
|
||||
<string name="pref_android_app_hide_chat_rooms_from_removed_proxies_desc">თუ გაქვთ გამოტოვებული ჩატის ოთახები, სცადე ამ პარამეტრის გამორთვა</string>
|
||||
<string name="pref_android_app_make_downloaded_images_visible_in_native_gallery_title">გადმოწერილი სურათების ჩვენება ნატიურ გალერეაში</string>
|
||||
<string name="pref_android_app_make_downloaded_images_visible_in_native_gallery_desc">სურათები ეფემერულ შეტყობინებებში არ იქნება</string>
|
||||
<string name="pref_android_app_enable_ephemeral_messages_beta">ეფემერული შეტყობინებების ჩართვა (ბეტა)</string>
|
||||
<!--Network settings-->
|
||||
<string name="pref_network_title">ქსელი</string>
|
||||
<string name="pref_wifi_only">მხოლოდ WiFi-ს გამოყენება</string>
|
||||
|
@ -375,22 +497,31 @@
|
|||
<string name="pref_media_encryption">მედია კოდირება</string>
|
||||
<string name="pref_push_notification">ბიძგი შეტყობინებების ჩართვა</string>
|
||||
<string name="pref_ipv6_title">IPv6-ის ნებართვა</string>
|
||||
<string name="pref_protected_settings_title">დაცული ბატარეის აპების პარამეტრები</string>
|
||||
<string name="pref_protected_settings_desc">ეს აპი უნდა იყოს ჩართული, რომ მიიღოს push შეტყობინებები</string>
|
||||
<!--Advanced settings-->
|
||||
<string name="pref_advanced_title">გაფართოებული</string>
|
||||
<string name="pref_dark_mode">ბნელი რეჟიმი</string>
|
||||
<string name="pref_debug_title">დებაგი</string>
|
||||
<string name="pref_debug">დებაგი</string>
|
||||
<string name="pref_java_debug">Java-ს ჟურნალის გამოყენება</string>
|
||||
<string name="pref_friendlist_subscribe">მეგობრების სიის გამოწერა</string>
|
||||
<string name="pref_background_mode">ფონის რეჟიმი</string>
|
||||
<string name="pref_background_mode_desc">შეტყობინების ჩვენება აპის ცოცხლად შესანარჩუნებლად</string>
|
||||
<string name="pref_background_mode_warning_desc">Linphone იქნა შეზღუდული ფონზე გამოყენებისგან, გთხოვთ ჯერ მისცეთ უფლება</string>
|
||||
<string name="pref_animation_enable_title">ანიმაციების ჩართვა</string>
|
||||
<string name="pref_service_notification">სერვისის შეტყობინების ჩართვა</string>
|
||||
<string name="pref_autostart">დაწყება გაშვების დროს</string>
|
||||
<string name="pref_incoming_call_timeout_title">შემომავალი ზარის დაკიდება (წამებში)</string>
|
||||
<string name="pref_device_name">მოწყობილობის სახელი</string>
|
||||
<string name="pref_display_name_subtitle">ცვლილებები იქნება მიღებული შემდეგ გაშვებაზე</string>
|
||||
<string name="pref_remote_provisioning_title">დაშორებული პროვიზია</string>
|
||||
<string name="pref_android_app_settings_title">Android-ის პროგრამის პარამეტრები</string>
|
||||
<string name="pref_android_app_notif_settings_title">Android-ის შეტყობინებების პარამეტრები</string>
|
||||
<string name="pref_primary_account_title">პირველადი ანგარიში</string>
|
||||
<string name="pref_display_name_title">სახელი</string>
|
||||
<string name="pref_user_name_title">მომხმარებლის სახელი</string>
|
||||
<string name="pref_log_collection_sharing_server_title">ჟურნალების ატვირთვის სერვერი</string>
|
||||
<string name="pref_log_collection_sharing_server_desc">არ დაარედაკტიროთ, თუ არ იცით, რას აკეთებთ!</string>
|
||||
<!--Audio hack settings-->
|
||||
<string name="pref_audio_hacks_title">ხმის ჰაკები</string>
|
||||
|
@ -399,10 +530,15 @@
|
|||
<string name="pref_audio_hacks_use_routing_api_title">მარშრუტირების API ჰაკის გამოყენება</string>
|
||||
<string name="pref_audio_hacks_use_galaxys_hack_title">Galaxy S-ს ხმის ჰაკის გამოყენება</string>
|
||||
<!--Device specifics-->
|
||||
<string name="device_power_saver_dialog_title">აღმოჩენილია კვების შემნახველი!</string>
|
||||
<string name="device_power_saver_dialog_message">თითქოს თქვენს მოწყობილობას აქვს კვების შემნახველი. იმისათვის, რომ აპმა მიიღოს ზარები და შეტყობინებეი, როდესაც ფონზეა, push შეტყობინებების გამოყენებით, აპი უნდა იყოს დამატებული თეთრ სიაში.</string>
|
||||
<string name="device_power_saver_dialog_button_go_to_settings">პარამეტრები</string>
|
||||
<string name="device_power_saver_dialog_button_later">მოგვიანებით</string>
|
||||
<!--Debug popup-->
|
||||
<string name="debug_popup_title">დებაგი</string>
|
||||
<string name="debug_popup_enable_logs">ჟურნალების ჩართვა</string>
|
||||
<string name="debug_popup_disable_logs">ჟურნალების გათიშვა</string>
|
||||
<string name="debug_popup_send_logs">ჟურნალების გაგზავნა</string>
|
||||
<!--Content description-->
|
||||
<string name="content_description_back">უკან</string>
|
||||
<string name="content_description_dialer">ამკრეფი</string>
|
||||
|
@ -475,6 +611,9 @@
|
|||
<string name="content_description_call_options">ზარის პარამეტრები</string>
|
||||
<string name="content_description_audio_route">ხმის მარშრუტი</string>
|
||||
<string name="content_description_exit_conference">კონფერენციიდან გამოსვლა</string>
|
||||
<string name="content_title_notification_service">Linphone-ის სერვისის შეტყობინება</string>
|
||||
<string name="content_title_notification">Linphone-ს სწრაფი შეტყობინებების შეტყობინებები</string>
|
||||
<string name="content_description_conversation_subject">ჯგუფური ჩატის ოთახის თემა</string>
|
||||
<string name="content_description_conversation_infos">ჯგუფური ჩატის ოთახის ინფო</string>
|
||||
<string name="content_description_record_call">ზარის ჩაწერა</string>
|
||||
</resources>
|
||||
|
|
|
@ -130,6 +130,9 @@
|
|||
<string name="phone_number_link_info_content_already_account">Номер телефона можно использовать только с одним аккаунтом Linphone.\n\nЕсли ваш номер уже был связан с другим аккаунтом, но вы предпочитаете использовать его, просто свяжите его сейчас, и ваш номер будет автоматически перенесен в этот аккаунт.</string>
|
||||
<string name="phone_number_overuse">Слишком много SMS было отправлено на этот номер за короткий промежуток времени, повторите попытку через 24 часа.</string>
|
||||
<string name="account_doesnt_exist">Аккаунт не существует</string>
|
||||
<string name="assistant_general_terms">условия использования</string>
|
||||
<string name="assistant_privacy_policy">политику конфиденциальности</string>
|
||||
<string name="assistant_read_and_agree_terms">Я принимаю %1$s and %2$s Belledonne Communications\'</string>
|
||||
<!--Status-->
|
||||
<string name="invalid_email">Недопустимый адрес электронной почты</string>
|
||||
<string name="account_already_exist">Аккаунт уже существует</string>
|
||||
|
@ -615,6 +618,7 @@
|
|||
<string name="content_description_exit_conference">Выйти из конференции</string>
|
||||
<string name="content_title_notification_service">Сервисное уведомление Linphone</string>
|
||||
<string name="content_title_notification">Уведомления мгновенных сообщений Linphone</string>
|
||||
<string name="content_title_notification_missed_call">Уведомления о пропущенных звонках Linphone</string>
|
||||
<string name="content_description_conversation_subject">Тема группового чата</string>
|
||||
<string name="content_description_conversation_infos">Информация о групповом чате</string>
|
||||
<string name="content_description_record_call">Запись звонка</string>
|
||||
|
|
|
@ -613,6 +613,7 @@
|
|||
<string name="content_description_exit_conference">Avsluta konferens</string>
|
||||
<string name="content_title_notification_service">Linphone-tjänstavisering</string>
|
||||
<string name="content_title_notification">Linphone-chattaviseringar</string>
|
||||
<string name="content_title_notification_missed_call">Missade Linphone-samtalsaviseringar</string>
|
||||
<string name="content_description_conversation_subject">Ämne för gruppchattrum</string>
|
||||
<string name="content_description_conversation_infos">Info för gruppchattrum</string>
|
||||
<string name="content_description_record_call">Spela in samtal</string>
|
||||
|
|
|
@ -83,10 +83,10 @@
|
|||
<string name="assistant_login_linphone">Linphone hesabı kullan</string>
|
||||
<string name="assistant_login_generic">SIP hesabı kullan</string>
|
||||
<string name="assistant_remote_provisioning">Uzaktan yapılandırma al</string>
|
||||
<string name="assistant_create_account_part_1">Lütfen ülke kodunuzu doğrulayın ve telefon numaranızı girin</string>
|
||||
<string name="assistant_create_account_part_2">Telefon numaranıza SMS ile bir doğrulama kodu gönderdik:</string>
|
||||
<string name="assistant_create_account_part_3">Telefon numarası doğrulamayı tamamlamak için, lütfen 4 haneli kodu aşağı girin:\n</string>
|
||||
<string name="assistant_create_account_part_email">Lütfen Linphone hesabınız için bir kullanıcı adı, e-posta ve parola girin</string>
|
||||
<string name="assistant_create_account_part_1">Lütfen ülke kodunuzu doğrulayın ve telefon numaranızı girin</string>
|
||||
<string name="assistant_create_account_part_2">Telefon numaranıza SMS ile doğrulama kodu gönderdik:</string>
|
||||
<string name="assistant_create_account_part_3">Telefon numarası doğrulamayı tamamlamak için lütfen 4 haneli kodu aşağı girin:\n</string>
|
||||
<string name="assistant_create_account_part_email">Lütfen Linphone hesabınız için kullanıcı adı, e-posta ve parola girin</string>
|
||||
<string name="assistant_display_name_optional">Görünen ad (isteğe bağlı)</string>
|
||||
<string name="assistant_linphone_account">Linphone hesabını kullan</string>
|
||||
<string name="assistant_generic_account">SIP hesabı kullan</string>
|
||||
|
@ -104,10 +104,10 @@
|
|||
<string name="assistant_codec_downloading">Cisco Systems, Inc. tarafından sağlanan OpenH264 Video çözücüsü indiriliyor.</string>
|
||||
<string name="assistant_openh264_downloading">OpenH264 indiriliyor</string>
|
||||
<string name="assistant_openh264_restart">OpenH264 çözücüyü kullanmadan önce %s yeniden başlatılmalı.</string>
|
||||
<string name="assistant_openh264_error">Üzgünüz bir hata oluştu.</string>
|
||||
<string name="assistant_openh264_error">Üzgünüz hata oluştu.</string>
|
||||
<string name="assistant_codec_downloaded">Cisco Systems, Inc. tarafından sağlanan OpenH264 Video çözücüsü indirildi.</string>
|
||||
<string name="wizard_failed">Bir hata oluştu, daha sonra yeniden deneyin.</string>
|
||||
<string name="wizard_server_unavailable">Sunucuya ulaşılamıyor,ağ bağlantınızı kontrol edin.</string>
|
||||
<string name="wizard_failed">Hata oluştu, daha sonra yeniden deneyin.</string>
|
||||
<string name="wizard_server_unavailable">Sunucuya ulaşılamıyor, ağ bağlantınızı gözden geçirin.</string>
|
||||
<string name="wizard_username_unavailable">Bu kullanıcı adı alınmış.</string>
|
||||
<string name="assistant_phone_number_unavailable">Bu telefon numarası zaten kullanılıyor.\nLütfen başka numara girin.\nEğer telefon numaranızı yeniden kullanmak istiyorsanız var olan hesabınızı silebilirsiniz.</string>
|
||||
<string name="wizard_username_incorrect">Kullanıcı adınız geçersiz.</string>
|
||||
|
@ -127,9 +127,12 @@
|
|||
<string name="phone_number_info_title">Telefon numaram ne için kullanılacak?</string>
|
||||
<string name="phone_number_info_content">\nTelefon numaranız sayesinde arkadaşlarınız sizi daha kolay bulacak.\n\n Adres defterinizde kimlerin Linphone kullandığını göreceksiniz ve arkadaşlarınız da size Linphone\'dan ulaşabileceklerini bilecek.\n</string>
|
||||
<string name="phone_number_link_info_content">\nEğer hesabını telefon numarana bağlarsan arkadaşların seni daha kolay bulacak\n\nAdres listende kimlerin Linphone kullandığını göreceksin ve arkadaşların da sana Linphone üzerinden ulaşabileceğini bilecek.\n</string>
|
||||
<string name="phone_number_link_info_content_already_account">Telefon numaranı yalnızca tek Linphone hesabıyla kullanabilirsin.\n\nEğer hesabını zaten başka bir hesaba bağladıysan ama bunu kullanmak istiyorsan, şimdi bağla ve numaran kendiliğinden bu hesaba taşınsın.</string>
|
||||
<string name="phone_number_link_info_content_already_account">Telefon numaranı yalnızca tek Linphone hesabıyla kullanabilirsin.\n\nEğer hesabını zaten başka hesaba bağladıysan ama bunu kullanmak istiyorsan, şimdi bağla ve numaran kendiliğinden bu hesaba taşınsın.</string>
|
||||
<string name="phone_number_overuse">Bu numaraya kısa zamanda birçok SMS gönderildi, 24 saat içinde yeniden deneyin.</string>
|
||||
<string name="account_doesnt_exist">Hesap yok</string>
|
||||
<string name="assistant_general_terms">kullanım koşullarını</string>
|
||||
<string name="assistant_privacy_policy">gizlilik ilkesini</string>
|
||||
<string name="assistant_read_and_agree_terms">Belledonne Communications\'ın %1$s ve %2$s kabul ediyorum</string>
|
||||
<!--Status-->
|
||||
<string name="invalid_email">Geçersiz e-posta</string>
|
||||
<string name="account_already_exist">Hesap zaten var</string>
|
||||
|
@ -192,9 +195,9 @@
|
|||
<string name="copy_text">Metni kopyalama</string>
|
||||
<string name="image_picker_title">Kaynak seç</string>
|
||||
<string name="image_saved">Resim kaydedildi</string>
|
||||
<string name="image_not_saved">Hata,resim kaydedilmedi</string>
|
||||
<string name="image_not_saved">Hata, resim kaydedilmedi</string>
|
||||
<string name="wait">Lütfen bekle…</string>
|
||||
<string name="image_transfert_error">Dosya aktarımı sırasında bir hata oluştu</string>
|
||||
<string name="image_transfert_error">Dosya aktarımında hata oluştu</string>
|
||||
<string name="message_not_encrypted">Bu ileti şifrelenmemiş</string>
|
||||
<string name="message_cant_be_decrypted">%s\'den şifresi çözülemeyen bir şifrelenmiş ileti aldınız.\nEğer gelecekte alacağınız iletileri çözmek istiyorsanız, ZRTP anahtarlarınızın değiş tokuşu için eşinizi aramanız gerekiyor.</string>
|
||||
<string name="message_cant_be_decrypted_notif">Bu iletinin şifresini çözemezsiniz.</string>
|
||||
|
@ -235,7 +238,7 @@
|
|||
<string name="chat_room_devices">%s aygıtları</string>
|
||||
<string name="group_chat_room_devices">Konuşmanın aygıtları</string>
|
||||
<string name="add_to_contacts">Bağlantılara ekle</string>
|
||||
<string name="lime_security_popup">Anlık iletiler, güvenli konuşmalarda uçtan uca şifrelenmiştir. Katılımcıların kimliğini doğrulayarak konuşmanın güvenlik düzeyi artırılabilir. Bunu yapmak için kişiyi arayın ve yetkilendirme sürecini takip edin.</string>
|
||||
<string name="lime_security_popup">Anlık iletiler, güvenli konuşmalarda uçtan uca şifrelenmiştir. Katılımcıların kimliğini doğrulayarak konuşmanın güvenlik düzeyi artırılabilir. Bunu yapmak için kişiyi arayın ve yetkilendirme sürecini izleyin.</string>
|
||||
<string name="lime_identity_key_changed">%s için LIME kimlik anahtarı değiştirildi</string>
|
||||
<string name="man_in_the_middle_detected">%s için Man-in-the-middle saldırısı saptandı</string>
|
||||
<string name="security_level_downgraded">%s olduğundan güvenlik düzeyi düşürüldü</string>
|
||||
|
@ -272,7 +275,7 @@
|
|||
<string name="status_not_connected">Bağlanmadı</string>
|
||||
<string name="status_in_progress">Bağlantı sürüyor</string>
|
||||
<string name="status_error">Bağlantı başarısız</string>
|
||||
<string name="voicemail_unread">okunmamış iletiler</string>
|
||||
<string name="voicemail_unread">okunmamış ileti</string>
|
||||
<!--Side Menu-->
|
||||
<string name="menu_logout">Oturumu kapat</string>
|
||||
<string name="menu_assistant">Yardımcı</string>
|
||||
|
@ -286,7 +289,7 @@
|
|||
<string name="add_video_dialog">Görüştüğünüz kişi görüntüyü açmak istiyor</string>
|
||||
<string name="no_current_call">Etkin çağrı yok</string>
|
||||
<string name="call_paused_by_remote">Görüştüğünüz kişi çağrıyı duraklattı</string>
|
||||
<string name="couldnt_accept_call">Gelen aramanın kabulünde bir hata oluştu</string>
|
||||
<string name="couldnt_accept_call">Gelen aramanın kabulünde hata oluştu</string>
|
||||
<string name="zrtp_local_sas">Söyle:</string>
|
||||
<string name="zrtp_remote_sas">Muhatabınızın şunu söylediğini doğrulayın:</string>
|
||||
<string name="zrtp_dialog_title">İletişim güvenliği</string>
|
||||
|
@ -299,7 +302,7 @@
|
|||
<string name="call_stats_ip">IP Ailesi:</string>
|
||||
<string name="call_stats_upload">Karşıya yükleme hızı:</string>
|
||||
<string name="call_stats_download">İndirme hızı:</string>
|
||||
<string name="call_stats_estimated_download">Tahmini indirme bant genişliği:</string>
|
||||
<string name="call_stats_estimated_download">Öngörülen indirme bant genişliği:</string>
|
||||
<string name="call_stats_ice">İCE bağlanılabilirliği:</string>
|
||||
<string name="call_stats_video_resolution_sent">Giden görüntü çözünürlüğü:</string>
|
||||
<string name="call_stats_video_resolution_received">Alınan görüntü çözünürlüğü:</string>
|
||||
|
@ -335,7 +338,7 @@
|
|||
<string name="skipable_error_service_not_ready">Uyarı: hizmet hazır değil</string>
|
||||
<string name="error">Hata</string>
|
||||
<string name="file_transfer_error">Dosya aktarım hatası</string>
|
||||
<string name="warning_wrong_destination_address">%s dan gidilecek adres inşa edilemiyor</string>
|
||||
<string name="warning_wrong_destination_address">%s konumundan hedef adres inşa edilemiyor</string>
|
||||
<string name="error_unknown">Tanımlanmayan hata</string>
|
||||
<string name="error_call_declined">Reddedilen çağrı</string>
|
||||
<string name="error_user_busy">Kullanıcı meşgul</string>
|
||||
|
@ -361,12 +364,12 @@
|
|||
<string name="pref_enable_outbound_proxy">Giden vekil sunucu</string>
|
||||
<string name="pref_help_proxy">SIP vekil sunucu makine adı veya ip adresi (isteğe bağlı)</string>
|
||||
<string name="pref_help_outbound_proxy">Tüm çağrıları SIP vekil sunucuya yönlendir</string>
|
||||
<string name="pref_help_username">Eğer hesabınız john@sip.example.org ise örneğin: john</string>
|
||||
<string name="pref_help_domain">Eğer hesabınız john@sip.example.org ise sip.example.org</string>
|
||||
<string name="pref_help_username">Eğer hesabınız inci@sip.ornek.org ise örneğin: inci</string>
|
||||
<string name="pref_help_domain">Eğer hesabınız inci@sip.ornek.org ise sip.ornek.org</string>
|
||||
<string name="pref_help_password">Eğer kullanıcı adınızı ve/veya alan adınızı değiştirdiyseniz parolanızı yeniden girmeniz gerekir</string>
|
||||
<string name="pref_expire_title">Süre dolumu</string>
|
||||
<string name="pref_avpf">AVPF</string>
|
||||
<string name="pref_avpf_rr_interval">AVPF düzenli RTCP aralığında ( 1 ile 5 saniye arasında)</string>
|
||||
<string name="pref_avpf_rr_interval">Saniye türünde AVPF düzenli RTCP aralığı (1 ile 5 saniye arasında)</string>
|
||||
<string name="pref_escape_plus">+\'yı 00 ile değiştir</string>
|
||||
<string name="pref_link_account">Hesabını bağla</string>
|
||||
<string name="pref_auth_userid">Yetkilendirme kullanıcı kimliği</string>
|
||||
|
@ -466,12 +469,12 @@
|
|||
<string name="lime_encryption_entry_disabled">Devre dışı</string>
|
||||
<string name="lime_encryption_entry_mandatory">Zorunlu</string>
|
||||
<string name="lime_encryption_entry_preferred">Yeğlenen</string>
|
||||
<string name="lime_encryption_enable_zrtp">LIME, ZRTP şifreleme gerektiriyor.\nLIME\'ı etkinleştirerek ZRTP ortam şifrelemeyi kendiliğinden etkinleştirmiş olacaksınız.</string>
|
||||
<string name="lime_encryption_enable_zrtp">LIME, ZRTP şifreleme gerektiriyor.\nLIME\'ı etkinleştirerek ZRTP ortam şifrelemeyi kendiliğinden etkinleştireceksiniz.</string>
|
||||
<string name="pref_auto_download_policy_title">Gelen dosyaları kendiliğinden indirme ilkesi</string>
|
||||
<string name="pref_auto_download_max_size_title">Azami boyut (bayt)</string>
|
||||
<string name="pref_auto_download_disabled">Asla</string>
|
||||
<string name="pref_auto_download_always">Daima</string>
|
||||
<string name="pref_auto_download_under_size">Eğer azami boyuttan hafifse</string>
|
||||
<string name="pref_auto_download_under_size">Eğer azami boyuttan azsa</string>
|
||||
<string name="pref_android_app_hide_empty_chat_rooms_title">Boş konuşma odalarını gizle</string>
|
||||
<string name="pref_android_app_hide_chat_rooms_from_removed_proxies_title">Kaldırılan vekil yapılandırmalarından olan konuşma odalarını gizle</string>
|
||||
<string name="pref_android_app_hide_chat_rooms_from_removed_proxies_desc">Eğer eksik konuşma odalarınız varsa, bu seçeneğin imini kaldırmayı deneyin</string>
|
||||
|
@ -506,13 +509,13 @@
|
|||
<string name="pref_debug">Hata ayıklama</string>
|
||||
<string name="pref_java_debug">Java günlükleyici kullan</string>
|
||||
<string name="pref_friendlist_subscribe">Arkadaş listesi aboneliği</string>
|
||||
<string name="pref_background_mode">Artalan kipi</string>
|
||||
<string name="pref_background_mode">Art alan kipi</string>
|
||||
<string name="pref_background_mode_desc">Uygulamayı uyanık tutmak için bildirim göster</string>
|
||||
<string name="pref_background_mode_warning_desc">Linphone\'un arka plan kullanımı kısıtlandı, lütfen öncelikle yetkilendirin</string>
|
||||
<string name="pref_animation_enable_title">Animasyonlar etkin</string>
|
||||
<string name="pref_service_notification">Hizmet bildirimi etkin</string>
|
||||
<string name="pref_autostart">Başlangıçta çalıştır</string>
|
||||
<string name="pref_incoming_call_timeout_title">Gelen çağrı kapandı (anında)</string>
|
||||
<string name="pref_incoming_call_timeout_title">Gelen çağrı kapandı (saniye)</string>
|
||||
<string name="pref_device_name">Aygıt adı</string>
|
||||
<string name="pref_display_name_subtitle">Değişiklikler sonraki başlatımda uygulanacak</string>
|
||||
<string name="pref_remote_provisioning_title">Uzaktan yetkilendirme</string>
|
||||
|
@ -524,11 +527,11 @@
|
|||
<string name="pref_log_collection_sharing_server_title">Günlük gönderim sunucusu</string>
|
||||
<string name="pref_log_collection_sharing_server_desc">Ne yaptığınızı bilmiyorsanız değiştirmeyin!</string>
|
||||
<!--Audio hack settings-->
|
||||
<string name="pref_audio_hacks_title">Ses kesme</string>
|
||||
<string name="pref_audio_use_specific_mode_title">Özgün kesme kipi kullan</string>
|
||||
<string name="pref_audio_use_specific_mode_summary">0=NORMAL_KİP (öntanımlı), 2=GELEN_ÇAĞRI_KİPİ</string>
|
||||
<string name="pref_audio_hacks_use_routing_api_title">API hack yönlendirmesini kullanın</string>
|
||||
<string name="pref_audio_hacks_use_galaxys_hack_title">Galaxy S ses kesmeyi kullan</string>
|
||||
<string name="pref_audio_hacks_title">Ses ayarları</string>
|
||||
<string name="pref_audio_use_specific_mode_title">Özgün kip ayarı kullan</string>
|
||||
<string name="pref_audio_use_specific_mode_summary">0=MODE_NORMAL (öntanımlı), 2=MODE_IN_CALL</string>
|
||||
<string name="pref_audio_hacks_use_routing_api_title">Yönlendirme API\'si ayarını kullan</string>
|
||||
<string name="pref_audio_hacks_use_galaxys_hack_title">Galaxy S ses ayarını kullan</string>
|
||||
<!--Device specifics-->
|
||||
<string name="device_power_saver_dialog_title">Güç koruyucu algılandı!</string>
|
||||
<string name="device_power_saver_dialog_message">Aygıtınızın güç koruyucusu var. Uygulama, anlık bildirimler kullanarak arka planda ileti ve aramaları almak için beyaz listeye eklenmeli.</string>
|
||||
|
@ -601,7 +604,7 @@
|
|||
<string name="content_description_contact_last_name">Soyadı</string>
|
||||
<string name="content_description_contact_organization">Kuruluş</string>
|
||||
<string name="content_description_back_call">Çağrıya dön</string>
|
||||
<string name="content_description_send_file">Bir dosya gönder</string>
|
||||
<string name="content_description_send_file">Dosya gönder</string>
|
||||
<string name="content_description_incoming_file">Gelen dosya</string>
|
||||
<string name="content_description_message">İleti</string>
|
||||
<string name="content_description_unread_chat_message">Okunmamış konuşma iletisi</string>
|
||||
|
@ -612,7 +615,8 @@
|
|||
<string name="content_description_audio_route">Ses yolu</string>
|
||||
<string name="content_description_exit_conference">Görüşmeden çık</string>
|
||||
<string name="content_title_notification_service">Linphone hizmet bildirimi</string>
|
||||
<string name="content_title_notification">Linphone anında iletiler bildirimleri</string>
|
||||
<string name="content_title_notification">Linphone anında ileti bildirimleri</string>
|
||||
<string name="content_title_notification_missed_call">Linphone yanıtsız çağrı bildirimleri</string>
|
||||
<string name="content_description_conversation_subject">Küme konuşma odası konusu</string>
|
||||
<string name="content_description_conversation_infos">Küme konuşma odası bilgisi</string>
|
||||
<string name="content_description_record_call">Çağrı kaydet</string>
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<string name="about_version">Linphone Android %s</string>
|
||||
<string name="about_liblinphone_version">Linphone ядро %s</string>
|
||||
<string name="about_liblinphone_sdk_version">Linphone SDK %s</string>
|
||||
<string name="about_privacy_policy">Відвідайте нашу політику конфіденційності</string>
|
||||
<string name="about_privacy_policy">Відвідайте нашу політику конфіденційности</string>
|
||||
<string name="sync_account_name">контакти linphone</string>
|
||||
<!--Notifications-->
|
||||
<string name="notification_reply_label">Відповідь</string>
|
||||
|
@ -25,7 +25,7 @@
|
|||
<string name="userid">Ідентифікатор користувача (необов\'язково)</string>
|
||||
<string name="phone_number">Номер телефону</string>
|
||||
<string name="confirmation_code">Код підтвердження</string>
|
||||
<string name="international_prefix">Префікс міжнародного номеру телефону</string>
|
||||
<string name="international_prefix">Префікс міжнародного номера телефону</string>
|
||||
<string name="display_name">Показуване ім\'я</string>
|
||||
<string name="password">Пароль</string>
|
||||
<string name="confirm_password">Схвалення паролю</string>
|
||||
|
@ -130,6 +130,9 @@
|
|||
<string name="phone_number_link_info_content_already_account">Номер телефону можна використовувати лише з однією обліківкою Linphone.\n\nЯкщо ваш номер вже був зв\'язаний з иншою обліківкою, але ви волієте використовувати його, просто зв\'яжіть його зараз, й ваш номер буде автоматично перенесено в цю обліківку.</string>
|
||||
<string name="phone_number_overuse">Забагато SMS було відправлено на цей номер за короткий проміжок часу, повторіть спробу через 24 години.</string>
|
||||
<string name="account_doesnt_exist">Обліківки не існує</string>
|
||||
<string name="assistant_general_terms">умови використання</string>
|
||||
<string name="assistant_privacy_policy">політика конфіденційности</string>
|
||||
<string name="assistant_read_and_agree_terms">Я приймаю %1$s та %2$s Belledonne Communications\'</string>
|
||||
<!--Status-->
|
||||
<string name="invalid_email">Неприпустима адреса електронної пошти</string>
|
||||
<string name="account_already_exist">Обліківка вже існує</string>
|
||||
|
@ -615,6 +618,7 @@
|
|||
<string name="content_description_exit_conference">Вийти з конференції</string>
|
||||
<string name="content_title_notification_service">Сервісне сповіщення Linphone</string>
|
||||
<string name="content_title_notification">Сповіщення миттєвих повідомлень Linphone</string>
|
||||
<string name="content_title_notification_missed_call">Сповіщення про пропущені дзвінки Linphone</string>
|
||||
<string name="content_description_conversation_subject">Тема групового чату</string>
|
||||
<string name="content_description_conversation_infos">Інформація про груповий чат</string>
|
||||
<string name="content_description_record_call">Запис дзвінка</string>
|
||||
|
|
|
@ -187,10 +187,14 @@
|
|||
<string name="contact_organization">组织</string>
|
||||
<string name="invite_friend">邀请</string>
|
||||
<string name="invite_friend_text">您好,在 Linphone 上加入我吧!您可以在 %s 免费下载。</string>
|
||||
<string name="toast_choose_contact_for_edition">选择一个联系人或创建一个新的联系人</string>
|
||||
<!--Chat-->
|
||||
<string name="no_chat_history">无对话</string>
|
||||
<string name="delete_conversation">您想删除所选对话吗?</string>
|
||||
<string name="delete_message">您想删除所选信息吗?</string>
|
||||
<string name="remote_composing">远程正在写入...</string>
|
||||
<string name="remote_composing_single">%s 正在写</string>
|
||||
<string name="remote_composing_multiple">%s 正在写</string>
|
||||
<string name="share_picture_size_small">小</string>
|
||||
<string name="share_picture_size_medium">中</string>
|
||||
<string name="share_picture_size_large">大</string>
|
||||
|
@ -200,6 +204,7 @@
|
|||
<string name="image_picker_title">选择源</string>
|
||||
<string name="image_saved">图片已保存</string>
|
||||
<string name="image_not_saved">错误,图片保存失败</string>
|
||||
<string name="wait">请稍候...</string>
|
||||
<string name="image_transfert_error">文件传输出错</string>
|
||||
<string name="message_not_encrypted">此消息未加密</string>
|
||||
<string name="message_cant_be_decrypted">您收到了一个加密的消息,但您无法从%s中解密。如果您想要解密之后的消息,需要使用ZRTP密钥。</string>
|
||||
|
@ -208,14 +213,80 @@
|
|||
<string name="processing_image">根据文件的大小,处理图像可能需要几秒钟的时间</string>
|
||||
<string name="displayed">读取</string>
|
||||
<string name="delivered">已发送</string>
|
||||
<string name="undelivered">未交付</string>
|
||||
<string name="sent">已发送</string>
|
||||
<string name="resend">重发</string>
|
||||
<string name="error_opening_file">打开此文件时发生错误。</string>
|
||||
<string name="conversation_information">信息</string>
|
||||
<string name="administrator">管理者</string>
|
||||
<string name="conversation_subject_hint">为组命名</string>
|
||||
<string name="chat_room_infos_title">信息</string>
|
||||
<string name="chat_room_infos_admin">管理者</string>
|
||||
<string name="chat_room_participants">参与者</string>
|
||||
<string name="chat_room_leave_group">离开群组</string>
|
||||
<string name="chat_room_creation_filter_hint">搜索联系人</string>
|
||||
<string name="conference_created">您已加入群组</string>
|
||||
<string name="conference_destroyed">您已离开群组</string>
|
||||
<string name="participant_added">%s 已加入</string>
|
||||
<string name="participant_removed">%s 以离开</string>
|
||||
<string name="device_added">%s 的新设备</string>
|
||||
<string name="device_removed">%s 的设备已删除</string>
|
||||
<string name="subject_changed">新主题:%s</string>
|
||||
<string name="admin_set">%s 是管理者</string>
|
||||
<string name="admin_unset">%s 不再是管理者</string>
|
||||
<string name="group_chat_notif" formatted="false">% 1:% 2</string>
|
||||
<string name="chat_room_you_are_now_admin">您现在是管理员</string>
|
||||
<string name="chat_room_you_are_no_longer_admin">您不再是管理员</string>
|
||||
<string name="chat_room_creation_failed">聊天室创建失败</string>
|
||||
<string name="chat_room_leave_dialog">你想离开这个对话吗?</string>
|
||||
<string name="chat_room_leave_button">离开</string>
|
||||
<string name="chat_room_delete_dialog">是否要删除并保留选定的对话?</string>
|
||||
<string name="separator">:</string>
|
||||
<string name="imdn_info">配送状态</string>
|
||||
<string name="chat_room_devices">%s 的设备</string>
|
||||
<string name="group_chat_room_devices">对话设备</string>
|
||||
<string name="add_to_contacts">添加联系人</string>
|
||||
<string name="lime_security_popup">即时消息在安全的对话中进行端到端加密。可以通过对参与者进行身份验证来升级对话的安全级别。为此,请致电联系人并按照身份验证过程进行操作。</string>
|
||||
<string name="lime_identity_key_changed">%s 的LIME身份密钥已更改</string>
|
||||
<string name="man_in_the_middle_detected">%s 监测到中间人攻击</string>
|
||||
<string name="security_level_downgraded">%s 造成安全级别下降</string>
|
||||
<string name="participant_max_count_exceeded">参加人数上限超过 %s 人</string>
|
||||
<string name="download_file">下载</string>
|
||||
<string name="toast_choose_chat_room_for_sharing">选择一个对话或创建一个新的对话</string>
|
||||
<string name="trust_denied">信任被拒绝。拨打电话以重新启动身份验证过程。</string>
|
||||
<string name="cant_open_file_no_app_found">无法打开文件,没有适用于此格式的应用程序。</string>
|
||||
<string name="chat_message_forwarded">已转发</string>
|
||||
<string name="chat_room_context_menu_group_info">组信息</string>
|
||||
<string name="chat_room_context_menu_participants_devices">对话设备</string>
|
||||
<string name="chat_message_context_menu_ephemeral_messages">短暂消息</string>
|
||||
<string name="chat_message_context_menu_delete_messages">删除信息</string>
|
||||
<string name="chat_message_context_menu_forward">前进</string>
|
||||
<string name="chat_room_ephemeral_fragment_title">短暂消息</string>
|
||||
<string name="chat_room_ephemeral_messages_desc">读取此消息后和选定的超时后,将在两端删除。</string>
|
||||
<string name="chat_room_ephemeral_message_disabled">已禁用</string>
|
||||
<string name="chat_room_ephemeral_message_one_minute">1 分钟</string>
|
||||
<string name="chat_room_ephemeral_message_one_hour">1 小时</string>
|
||||
<string name="chat_room_ephemeral_message_one_day">1 天</string>
|
||||
<string name="chat_room_ephemeral_message_three_days">3 天</string>
|
||||
<string name="chat_room_ephemeral_message_one_week">1周</string>
|
||||
<plurals name="days">
|
||||
<item quantity="other">%d 天</item>
|
||||
</plurals>
|
||||
<string name="chat_event_ephemeral_disabled">您禁用了短暂消息</string>
|
||||
<string name="chat_event_ephemeral_enabled">您启用了短暂信息:%s</string>
|
||||
<string name="chat_event_ephemeral_lifetime_changed">短暂信息到期日:%s </string>
|
||||
<string name="chat_message_forward_confirmation_dialog">是否要在此会议室转发信息?</string>
|
||||
<!--Status Bar-->
|
||||
<string name="status_connected">已连接</string>
|
||||
<string name="status_not_connected">未连接</string>
|
||||
<string name="status_in_progress">连接正在进行</string>
|
||||
<string name="status_error">连接失败</string>
|
||||
<string name="voicemail_unread">未读消息</string>
|
||||
<!--Side Menu-->
|
||||
<string name="menu_logout">注销</string>
|
||||
<string name="menu_assistant">助手</string>
|
||||
<string name="menu_settings">设置</string>
|
||||
<string name="menu_recordings">录音</string>
|
||||
<string name="menu_about">关于</string>
|
||||
<string name="quit">退出</string>
|
||||
<!--Call-->
|
||||
|
@ -225,6 +296,11 @@
|
|||
<string name="no_current_call">没有来电</string>
|
||||
<string name="call_paused_by_remote">对方已结束电话</string>
|
||||
<string name="couldnt_accept_call">来电接通出错</string>
|
||||
<string name="zrtp_local_sas">说:</string>
|
||||
<string name="zrtp_remote_sas">确认您的对话者说:</string>
|
||||
<string name="zrtp_dialog_title">通信安全</string>
|
||||
<string name="zrtp_notification_title">SAS</string>
|
||||
<string name="zrtp_notification_message">与您的代理确认之前的 SAS 代码</string>
|
||||
<string name="unknown_incoming_call_name">未知</string>
|
||||
<string name="call_stats_audio">请提供您配置文件的URL地址</string>
|
||||
<string name="call_stats_video">视频</string>
|
||||
|
@ -232,16 +308,25 @@
|
|||
<string name="call_stats_ip">IP Family:</string>
|
||||
<string name="call_stats_upload">上传带宽</string>
|
||||
<string name="call_stats_download">上传带宽</string>
|
||||
<string name="call_stats_estimated_download">估计下载带宽:</string>
|
||||
<string name="call_stats_ice">ICE connectivity:</string>
|
||||
<string name="call_stats_video_resolution_sent">发送视频分辨率</string>
|
||||
<string name="call_stats_video_resolution_received">接受视频分辨率</string>
|
||||
<string name="call_stats_video_fps_sent">已发送视频 fps:</string>
|
||||
<string name="call_stats_video_fps_received">收到的视频 fps:</string>
|
||||
<string name="call_stats_sender_loss_rate">发送损失率</string>
|
||||
<string name="call_stats_receiver_loss_rate">接收损失率</string>
|
||||
<string name="call_stats_jitter_buffer">回音消除校正</string>
|
||||
<string name="call_stats_encoder_name">编码器:</string>
|
||||
<string name="call_stats_decoder_name">解码器:</string>
|
||||
<string name="call_stats_player_filter">播放器过滤器:</string>
|
||||
<string name="call_stats_display_filter">显示筛选器:</string>
|
||||
<string name="call_stats_capture_filter">捕获过滤器:</string>
|
||||
<string name="call">电话</string>
|
||||
<string name="call_log_delete_dialog">是否要删除选定的呼叫日志?</string>
|
||||
<!--Recordings-->
|
||||
<string name="no_recordings">无录音</string>
|
||||
<string name="recordings_delete_dialog">是否要删除选定的录音?</string>
|
||||
<!--About-->
|
||||
<string name="menu_send_log">发送日志</string>
|
||||
<string name="menu_reset_log">清除记录</string>
|
||||
|
@ -249,6 +334,8 @@
|
|||
<string name="incall_notif_active">音频调用正在进行</string>
|
||||
<string name="incall_notif_paused">暂停通话</string>
|
||||
<string name="incall_notif_video">视频捕获调用正在进行</string>
|
||||
<string name="incall_notif_incoming">来电</string>
|
||||
<string name="incall_notif_outgoing">拨打电话</string>
|
||||
<string name="notification_started">开始</string>
|
||||
<string name="unread_messages">%i未读消息</string>
|
||||
<string name="missed_calls_notif_title">未接来电</string>
|
||||
|
@ -256,6 +343,7 @@
|
|||
<!--Errors-->
|
||||
<string name="skipable_error_service_not_ready">警告:服务未准备</string>
|
||||
<string name="error">出错</string>
|
||||
<string name="file_transfer_error">文件传输错误</string>
|
||||
<string name="warning_wrong_destination_address">无法从%s建立地址</string>
|
||||
<string name="error_unknown">未知错误</string>
|
||||
<string name="error_call_declined">拒接来电</string>
|
||||
|
@ -268,6 +356,7 @@
|
|||
<string name="error_unauthorized">未授权</string>
|
||||
<string name="error_io_error">网络错误</string>
|
||||
<string name="download_image_failed">下载失败,请检查您的网络连接货稍后再试</string>
|
||||
<string name="remote_provisioning_failure">无法下载或应用远程配置文件...</string>
|
||||
<string name="remote_provisioning_again_title">移除配置文件</string>
|
||||
<string name="remote_provisioning_again_message">您想更换配置文件URI吗?</string>
|
||||
<!--Account Settings-->
|
||||
|
@ -294,6 +383,7 @@
|
|||
<string name="pref_display_name">显示名</string>
|
||||
<string name="pref_help_display_name">输入显示名(可选)</string>
|
||||
<string name="pref_prefix">前缀</string>
|
||||
<string name="pref_prefix_desc">您所在国家的前缀(不包含 +)</string>
|
||||
<string name="pref_transport">传输</string>
|
||||
<string name="pref_transport_udp">UDP</string>
|
||||
<string name="pref_transport_tcp">TCP</string>
|
||||
|
@ -302,6 +392,7 @@
|
|||
<string name="pref_change_password">更换密码</string>
|
||||
<string name="pref_default_account">默认使用</string>
|
||||
<string name="pref_password_changed">密码已更换</string>
|
||||
<string name="pref_proxy_push_notif">允许推送通知</string>
|
||||
<!--Settings-->
|
||||
<string name="pref_sipaccounts">SIP帐户</string>
|
||||
<string name="default_account_flag">默认账户</string>
|
||||
|
@ -310,6 +401,9 @@
|
|||
<string name="pref_tunnel_title">Tunnel隧道</string>
|
||||
<string name="pref_tunnel_host">主机名</string>
|
||||
<string name="pref_tunnel_port">端口</string>
|
||||
<string name="pref_tunnel_dual_mode">启用双模式</string>
|
||||
<string name="pref_tunnel_host_2">主机名(双模式的第二台服务器)</string>
|
||||
<string name="pref_tunnel_port_2">端口(双模式的第二台服务器)</string>
|
||||
<string name="pref_tunnel_mode">模式</string>
|
||||
<!--do not change order without changing corresponding entry_values in non_localizable_strings.xml-->
|
||||
<string-array name="tunnel_mode_entries">
|
||||
|
@ -320,6 +414,7 @@
|
|||
</string-array>
|
||||
<string name="pref_none">没有</string>
|
||||
<string name="pref_preferences_title">偏好</string>
|
||||
<string name="pref_video_enable_title">启用视频</string>
|
||||
<!--Audio settings-->
|
||||
<string name="pref_audio_title">音频</string>
|
||||
<string name="pref_echo_cancellation">回声消除</string>
|
||||
|
@ -332,9 +427,12 @@
|
|||
<string name="failed">失败</string>
|
||||
<string name="pref_adaptive_rate_control">自适应速率控制</string>
|
||||
<string name="pref_codec_bitrate_limit">编解码的比特率限制</string>
|
||||
<string name="pref_mic_gain_db">麦克风增益(以 dB 为单位)</string>
|
||||
<string name="pref_playback_gain_db">播放增益(以 dB 为单位)</string>
|
||||
<string name="pref_codecs">编解码器</string>
|
||||
<!--Video settings-->
|
||||
<string name="pref_video_title">视频</string>
|
||||
<string name="pref_video_camera_device">摄像头</string>
|
||||
<string name="pref_overlay">Video overlay</string>
|
||||
<string name="pref_overlay_summary">在应用程序外显示视频</string>
|
||||
<string name="pref_video_use_front_camera_title">使用前置摄像头</string>
|
||||
|
@ -345,14 +443,30 @@
|
|||
<string name="pref_video_preset">视频预设</string>
|
||||
<string name="pref_preferred_video_size">视频尺寸偏好</string>
|
||||
<string name="pref_preferred_fps">FPS优先</string>
|
||||
<string name="pref_preview_video">在拨号器上显示相机预览</string>
|
||||
<string name="pref_bandwidth_limit">带宽限制在kbits/s</string>
|
||||
<string name="pref_video_codecs_title">编解码器</string>
|
||||
<!--Contact settings-->
|
||||
<string name="pref_contact_sync_title">本机联系人中的状态信息</string>
|
||||
<string name="pref_contact_sync_subtitle">从 Linphone 联系人插入信息快捷方式到本机 Android 联系人</string>
|
||||
<string name="pref_contact_title">联系人</string>
|
||||
<string name="pref_contact_display_contact_organization_title">显示联系人组织</string>
|
||||
<string name="pref_create_contact_shortcuts">在启动器中创建快捷方式</string>
|
||||
<!--Call settings-->
|
||||
<string name="pref_call_title">聊天</string>
|
||||
<string name="pref_device_ringtone">使用手机铃声</string>
|
||||
<string name="pref_vibrate_on_incoming_calls">来电振铃时振动</string>
|
||||
<string name="pref_auto_answer">来电自动回复</string>
|
||||
<string name="pref_auto_answer_time">自动应答时间(以毫秒为单位)</string>
|
||||
<string name="pref_rfc2833_dtmf">发送带内 DTMF (RFC2833)</string>
|
||||
<string name="pref_sipinfo_dtmf">发送带外 DTMF(SIP 信息)</string>
|
||||
<string name="pref_call_timeout_title">呼叫超时(以秒为单位)</string>
|
||||
<string name="pref_voice_mail">语音邮箱URI</string>
|
||||
<string name="pref_dialer_call">使用 Linphone 作为默认手机应用程序</string>
|
||||
<string name="pref_accept_early_media">接受早期介质</string>
|
||||
<string name="pref_grant_read_dnd_settings_permission_title">请勿打扰设置</string>
|
||||
<string name="pref_grant_read_dnd_settings_permission_desc">我们需要您授予使用 “请勿打扰” 设置的访问权限,以便根据当前政策正确响铃或不响应</string>
|
||||
<string name="pref_media_encryption_mandatory_title">强制介质加密</string>
|
||||
<!--Chat settings-->
|
||||
<string name="pref_chat_title">聊天</string>
|
||||
<string name="pref_image_sharing_server_title">分享服务器</string>
|
||||
|
@ -362,11 +476,26 @@
|
|||
<string name="lime_encryption_entry_mandatory">强制的</string>
|
||||
<string name="lime_encryption_entry_preferred">优先</string>
|
||||
<string name="lime_encryption_enable_zrtp">LIME需要ZRTP加密。通过激活LIME,你可以自动激活ZRTP媒体加密</string>
|
||||
<string name="pref_auto_download_policy_title">自动下载传入文件策略</string>
|
||||
<string name="pref_auto_download_max_size_title">最大(以字节为单位)</string>
|
||||
<string name="pref_auto_download_disabled">永不</string>
|
||||
<string name="pref_auto_download_always">总是</string>
|
||||
<string name="pref_auto_download_under_size">如果比最大尺寸轻</string>
|
||||
<string name="pref_android_app_hide_empty_chat_rooms_title">隐藏空聊天室</string>
|
||||
<string name="pref_android_app_hide_chat_rooms_from_removed_proxies_title">隐藏已删除的代理配置中的聊天室</string>
|
||||
<string name="pref_android_app_hide_chat_rooms_from_removed_proxies_desc">如果您有缺少聊天室,请尝试取消选中此设置</string>
|
||||
<string name="pref_android_app_make_downloaded_images_visible_in_native_gallery_title">使下载的图像在本机图库中可见</string>
|
||||
<string name="pref_android_app_make_downloaded_images_visible_in_native_gallery_desc">短暂消息中的图像将不会</string>
|
||||
<string name="pref_android_app_enable_ephemeral_messages_beta">启用短暂消息(测试版)</string>
|
||||
<!--Network settings-->
|
||||
<string name="pref_network_title">网络连接</string>
|
||||
<string name="pref_wifi_only">只使用WiFi</string>
|
||||
<string name="pref_doze_mode">休眠模式</string>
|
||||
<string name="pref_stun_server">眩晕/转向服务器</string>
|
||||
<string name="pref_ice_enable">启用ICE</string>
|
||||
<string name="pref_turn_enable">启用转弯</string>
|
||||
<string name="pref_turn_username_title">晕眩/转弯用户名(可选)</string>
|
||||
<string name="pref_turn_passwd_title">眩晕/转动密码(可选)</string>
|
||||
<string name="pref_upnp_enable">启用UPNP</string>
|
||||
<string name="pref_transport_use_random_ports">使用随机端口</string>
|
||||
<string name="pref_sip_port_title">SIP端口</string>
|
||||
|
@ -377,30 +506,48 @@
|
|||
<string name="pref_media_encryption">媒介加密</string>
|
||||
<string name="pref_push_notification">允许推送通知</string>
|
||||
<string name="pref_ipv6_title">允许IPv6</string>
|
||||
<string name="pref_protected_settings_title">电池保护应用程序设置</string>
|
||||
<string name="pref_protected_settings_desc">必须启用此应用程序才能接收推送通知</string>
|
||||
<!--Advanced settings-->
|
||||
<string name="pref_advanced_title">高级</string>
|
||||
<string name="pref_dark_mode">深色模式</string>
|
||||
<string name="pref_debug_title">诊断</string>
|
||||
<string name="pref_debug">诊断</string>
|
||||
<string name="pref_java_debug">使用 Java 记录器</string>
|
||||
<string name="pref_friendlist_subscribe">订阅朋友列表</string>
|
||||
<string name="pref_background_mode">后台模式</string>
|
||||
<string name="pref_background_mode_desc">显示通知以使应用保持活动状态</string>
|
||||
<string name="pref_background_mode_warning_desc">LINphone 已被限制后台运作,请先授权</string>
|
||||
<string name="pref_animation_enable_title">允许动画</string>
|
||||
<string name="pref_service_notification">允许服务通知</string>
|
||||
<string name="pref_autostart">在开机时启动</string>
|
||||
<string name="pref_incoming_call_timeout_title">挂断来电 (几秒内)</string>
|
||||
<string name="pref_device_name">设备名称</string>
|
||||
<string name="pref_display_name_subtitle">更改将在下次启动时应用</string>
|
||||
<string name="pref_remote_provisioning_title">移除配置文件</string>
|
||||
<string name="pref_android_app_settings_title">安卓应用设置</string>
|
||||
<string name="pref_android_app_notif_settings_title">安卓通知设置</string>
|
||||
<string name="pref_primary_account_title">初始帐户</string>
|
||||
<string name="pref_display_name_title">显示名</string>
|
||||
<string name="pref_user_name_title">用户名</string>
|
||||
<string name="pref_log_collection_sharing_server_title">日志上传服务器</string>
|
||||
<string name="pref_log_collection_sharing_server_desc">请勿随意编辑</string>
|
||||
<!--Audio hack settings-->
|
||||
<string name="pref_audio_hacks_title">音频插件</string>
|
||||
<string name="pref_audio_use_specific_mode_title">使用特定的模式破解</string>
|
||||
<string name="pref_audio_use_specific_mode_summary">0= 模式 _ 正常(默认值),2= 模式 _ 进入 _ 呼叫</string>
|
||||
<string name="pref_audio_hacks_use_routing_api_title">使用路由 API 破解</string>
|
||||
<string name="pref_audio_hacks_use_galaxys_hack_title">使用银河 S 音频破解</string>
|
||||
<!--Device specifics-->
|
||||
<string name="device_power_saver_dialog_title">检测到节电程序!</string>
|
||||
<string name="device_power_saver_dialog_message">似乎您的设备有一个节能程序。为了使应用能够在后台运作推送通知接收来电和消息,应用程序必须被列入白名单。</string>
|
||||
<string name="device_power_saver_dialog_button_go_to_settings">设置</string>
|
||||
<string name="device_power_saver_dialog_button_later">稍后</string>
|
||||
<!--Debug popup-->
|
||||
<string name="debug_popup_title">诊断</string>
|
||||
<string name="debug_popup_enable_logs">启用日志</string>
|
||||
<string name="debug_popup_disable_logs">禁用日志</string>
|
||||
<string name="debug_popup_send_logs">发送日志</string>
|
||||
<!--Content description-->
|
||||
<string name="content_description_back">返回</string>
|
||||
<string name="content_description_dialer">拨号器</string>
|
||||
|
@ -416,6 +563,7 @@
|
|||
<string name="content_description_add_contact">添加联系人</string>
|
||||
<string name="content_description_new_contact">新的联系人</string>
|
||||
<string name="content_description_call">聊天</string>
|
||||
<string name="content_description_backspace">退格</string>
|
||||
<string name="content_description_chat">聊天</string>
|
||||
<string name="content_description_dial_back">回拨</string>
|
||||
<string name="content_description_dialer_back">返回拨号器</string>
|
||||
|
@ -472,4 +620,9 @@
|
|||
<string name="content_description_call_options">通话选项</string>
|
||||
<string name="content_description_audio_route">音频路由</string>
|
||||
<string name="content_description_exit_conference">退出会话</string>
|
||||
<string name="content_title_notification_service">Linphone 服务通知</string>
|
||||
<string name="content_title_notification">Linphone 即时简讯通知</string>
|
||||
<string name="content_description_conversation_subject">群聊天室主题</string>
|
||||
<string name="content_description_conversation_infos">群聊天室信息</string>
|
||||
<string name="content_description_record_call">通话录音</string>
|
||||
</resources>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
<string name="notification_title">Linphone</string>
|
||||
<string name="wait_dialog_text">啟動中</string>
|
||||
<string name="notification_registered">%s 已連線</string>
|
||||
<string name="notification_register_failure">%s 無法連線</string>
|
||||
<string name="notification_register_failure">%s 連線失敗</string>
|
||||
<string name="tunnel_host"></string>
|
||||
<string name="about_version">Linphone Android %s</string>
|
||||
<string name="about_liblinphone_version">Linphone Core %s</string>
|
||||
|
@ -58,7 +58,7 @@
|
|||
<string name="link_account">連結你的帳號</string>
|
||||
<string name="update_available">有更新可用</string>
|
||||
<string name="do_not_ask_again">不要再次顯示</string>
|
||||
<string name="delete_contacts_text">妳確定要刪除這些聯絡人嗎?\n他們也會從您的電話中刪除!</string>
|
||||
<string name="delete_contacts_text">您確定要刪除這些聯絡人嗎?\n他們將會從您的電話中刪除!</string>
|
||||
<string name="logs_url_copied_to_clipboard">記錄網址已複製到剪貼簿</string>
|
||||
<!--Launch screen-->
|
||||
<string name="app_description"><i>自由的</i> SIP 客戶端</string>
|
||||
|
@ -77,7 +77,7 @@
|
|||
<string name="assistant_login_desc">請輸入您 SIP 網域的使用者名稱與密碼</string>
|
||||
<string name="assistant_remote_provisioning_desc">請提供配置網址</string>
|
||||
<string name="transport">傳輸</string>
|
||||
<string name="assistant_create_account_phone_number_address">你的 SIP 位置是</string>
|
||||
<string name="assistant_create_account_phone_number_address">你的 SIP 地址是</string>
|
||||
<string name="assistant_login_linphone">使用 Linphone 帳號</string>
|
||||
<string name="assistant_login_generic">使用 SIP 帳號</string>
|
||||
<string name="assistant_remote_provisioning">擷取遠端設定</string>
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
<string name="about_bugreport_email" translatable="false">linphone-android@belledonne-communications.com</string>
|
||||
<string name="notification_service_channel_id" translatable="false">linphone_notification_service_id</string>
|
||||
<string name="notification_channel_id" translatable="false">linphone_notification_id</string>
|
||||
<string name="notification_missed_call_channel_id" translatable="false">linphone_notification_missed_call_id</string>
|
||||
|
||||
<!-- Push notification settings -->
|
||||
<bool name="enable_push_id">true</bool>
|
||||
|
@ -115,7 +116,7 @@
|
|||
<bool name="hide_non_linphone_contacts">false</bool>
|
||||
<bool name="hide_invite_contact">false</bool>
|
||||
<bool name="generate_text_avatar">true</bool>
|
||||
<bool name="only_show_address_username_if_matches_default_domain">true</bool>
|
||||
<bool name="only_show_address_username_if_matches_default_domain">false</bool>
|
||||
<bool name="fetch_contacts_from_default_directory">true</bool> <!-- Recommended -->
|
||||
<bool name="forbid_pure_linphone_contacts_edition">true</bool>
|
||||
|
||||
|
|
|
@ -135,6 +135,11 @@
|
|||
<string name="phone_number_link_info_content_already_account">You can only use your phone number with one Linphone account.\n\nIf you had already linked your number to an other account but you prefer to use this one, simply link it now and your number will automatically be moved to this account.</string>
|
||||
<string name="phone_number_overuse">Too much SMS have been sent to this number in a short period of time, try again in 24 hours.</string>
|
||||
<string name="account_doesnt_exist">Account doesn\'t exist</string>
|
||||
<string name="assistant_general_terms_link" translatable="false">https://www.linphone.org/general-terms</string>
|
||||
<string name="assistant_privacy_policy_link" translatable="false">https://www.linphone.org/privacy-policy</string>
|
||||
<string name="assistant_general_terms">terms of use</string>
|
||||
<string name="assistant_privacy_policy">privacy policy</string>
|
||||
<string name="assistant_read_and_agree_terms">I accept Belledonne Communications\' %1$s and %2$s</string>
|
||||
|
||||
<!-- Status -->
|
||||
<string name="invalid_email">Invalid email</string>
|
||||
|
@ -644,6 +649,7 @@
|
|||
<string name="content_description_exit_conference">Exit conference</string>
|
||||
<string name="content_title_notification_service">Linphone service notification</string>
|
||||
<string name="content_title_notification">Linphone instant messages notifications</string>
|
||||
<string name="content_title_notification_missed_call">Linphone missed calls notifications</string>
|
||||
<string name="content_description_conversation_subject">Group chat room subject</string>
|
||||
<string name="content_description_conversation_infos">Group chat room info</string>
|
||||
<string name="content_description_record_call">Record call</string>
|
||||
|
|
Loading…
Reference in a new issue