diff --git a/CHANGELOG.md b/CHANGELOG.md index 38ff6b601..e51604cf2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ 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.1.0] - 2019-xx-xx +## [4.1.0] - 2019-05-03 ### Added - End-to-end encryption for instant messaging, for both one-to-one and group conversations. diff --git a/app/build.gradle b/app/build.gradle index f6ba9432e..362fa7292 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -72,7 +72,7 @@ android { defaultConfig { minSdkVersion 21 targetSdkVersion 28 - versionCode 4120 + versionCode 4124 versionName "4.1" applicationId getPackageName() multiDexEnabled true @@ -167,7 +167,7 @@ dependencies { debugImplementation project(path: ":linphone-sdk-android", configuration: 'debug') } } else { - implementation "org.linphone:linphone-sdk-android:4.1-366-g1b22291" + implementation "org.linphone:linphone-sdk-android:4.2" } } if (firebaseEnabled()) { diff --git a/app/src/main/java/org/linphone/LinphoneActivity.java b/app/src/main/java/org/linphone/LinphoneActivity.java index edd3ceaed..7b983d2ad 100644 --- a/app/src/main/java/org/linphone/LinphoneActivity.java +++ b/app/src/main/java/org/linphone/LinphoneActivity.java @@ -412,7 +412,6 @@ public class LinphoneActivity extends LinphoneGenericActivity if (lc != null) { lc.removeListener(mListener); } - mCallTransfer = false; mIsOnBackground = true; super.onPause(); @@ -534,6 +533,7 @@ public class LinphoneActivity extends LinphoneGenericActivity }*/ Bundle extras = intent.getExtras(); + mCallTransfer = false; if (extras != null) { if (extras.getBoolean("GoToChat", false)) { String localSipUri = extras.getString("LocalSipUri"); @@ -566,6 +566,12 @@ public class LinphoneActivity extends LinphoneGenericActivity goToDialerFragment(); } else if (extras.getBoolean("Transfer", false)) { intent.putExtra("DoNotGoToCallActivity", true); + mCallTransfer = true; + if (LinphoneManager.getLc().getCallsNb() > 0) { + initInCallMenuLayout(); + } else { + resetClassicMenuLayoutAndGoBackToCallIfStillRunning(); + } } else if (extras.getBoolean("AddCall", false)) { intent.putExtra("DoNotGoToCallActivity", true); } else if (intent.getStringExtra("msgShared") != null) { @@ -1382,7 +1388,12 @@ public class LinphoneActivity extends LinphoneGenericActivity AddressType address = new AddressText(this, null); address.setText(number); address.setDisplayedName(name); - LinphoneManager.getInstance().newOutgoingCall(address); + if (!mCallTransfer) { + LinphoneManager.getInstance().newOutgoingCall(address); + } else { + addressWaitingToBeCalled = number; + displayDialer(); + } } public void startIncallActivity() { diff --git a/app/src/main/java/org/linphone/LinphoneManager.java b/app/src/main/java/org/linphone/LinphoneManager.java index 75fe5b326..60510b113 100644 --- a/app/src/main/java/org/linphone/LinphoneManager.java +++ b/app/src/main/java/org/linphone/LinphoneManager.java @@ -193,6 +193,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou private MediaPlayer mRingerPlayer; private final Vibrator mVibrator; private boolean mIsRinging; + private boolean mHasLastCallSasBeenRejected; private LinphoneManager(Context c) { mUnreadChatsPerRoom = new HashMap(); @@ -220,6 +221,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou mSensorManager = (SensorManager) c.getSystemService(Context.SENSOR_SERVICE); mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); mRessources = c.getResources(); + mHasLastCallSasBeenRejected = false; File f = new File(mUserCertsPath); if (!f.exists()) { @@ -493,13 +495,42 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou newOutgoingCall(to, address.getDisplayedName()); } - public void newOutgoingCall(String to, String displayName) { - // if (mCore.inCall()) { - // listenerDispatcher.tryingNewOutgoingCallButAlreadyInCall(); - // return; - // } + public void newOutgoingCall(Address to) { if (to == null) return; + ProxyConfig lpc = mCore.getDefaultProxyConfig(); + if (mRessources.getBoolean(R.bool.forbid_self_call) + && lpc != null + && to.weakEqual(lpc.getIdentityAddress())) { + return; + } + + boolean isLowBandwidthConnection = + !LinphoneUtils.isHighBandwidthConnection( + LinphoneService.instance().getApplicationContext()); + + if (mCore.isNetworkReachable()) { + if (Version.isVideoCapable()) { + boolean prefVideoEnable = mPrefs.isVideoEnabled(); + boolean prefInitiateWithVideo = mPrefs.shouldInitiateVideoCall(); + CallManager.getInstance() + .inviteAddress( + to, + prefVideoEnable && prefInitiateWithVideo, + isLowBandwidthConnection); + } else { + CallManager.getInstance().inviteAddress(to, false, isLowBandwidthConnection); + } + } else if (LinphoneActivity.isInstanciated()) { + LinphoneActivity.instance() + .displayCustomToast( + getString(R.string.error_network_unreachable), Toast.LENGTH_LONG); + } else { + Log.e("[Manager] Error: " + getString(R.string.error_network_unreachable)); + } + } + + public void newOutgoingCall(String to, String displayName) { // If to is only a username, try to find the contact to get an alias if existing if (!to.startsWith("sip:") || !to.contains("@")) { LinphoneContact contact = ContactsManager.getInstance().findContactFromPhoneNumber(to); @@ -518,37 +549,9 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou return; } - ProxyConfig lpc = mCore.getDefaultProxyConfig(); - if (mRessources.getBoolean(R.bool.forbid_self_call) - && lpc != null - && lAddress.weakEqual(lpc.getIdentityAddress())) { - return; - } - lAddress.setDisplayName(displayName); + if (displayName != null) lAddress.setDisplayName(displayName); - boolean isLowBandwidthConnection = - !LinphoneUtils.isHighBandwidthConnection( - LinphoneService.instance().getApplicationContext()); - - if (mCore.isNetworkReachable()) { - if (Version.isVideoCapable()) { - boolean prefVideoEnable = mPrefs.isVideoEnabled(); - boolean prefInitiateWithVideo = mPrefs.shouldInitiateVideoCall(); - CallManager.getInstance() - .inviteAddress( - lAddress, - prefVideoEnable && prefInitiateWithVideo, - isLowBandwidthConnection); - } else { - CallManager.getInstance().inviteAddress(lAddress, false, isLowBandwidthConnection); - } - } else if (LinphoneActivity.isInstanciated()) { - LinphoneActivity.instance() - .displayCustomToast( - getString(R.string.error_network_unreachable), Toast.LENGTH_LONG); - } else { - Log.e("[Manager] Error: " + getString(R.string.error_network_unreachable)); - } + newOutgoingCall(lAddress); } private void resetCameraFromPreferences() { @@ -1471,15 +1474,30 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou } public void isAccountWithAlias() { + if (!LinphonePreferences.instance().isLinkPopupEnabled()) return; + if (LinphoneManager.getLc().getDefaultProxyConfig() != null) { + long now = new Timestamp(new Date().getTime()).getTime(); - if (mAccountCreator != null && LinphonePreferences.instance().getLinkPopupTime() == null - || Long.parseLong(LinphonePreferences.instance().getLinkPopupTime()) < now) { + if (LinphonePreferences.instance().getLinkPopupTime() != null + && Long.parseLong(LinphonePreferences.instance().getLinkPopupTime()) >= now) + return; + + long future = + new Timestamp( + LinphoneActivity.instance() + .getResources() + .getInteger(R.integer.popup_time_interval)) + .getTime(); + long newDate = now + future; + + if (mAccountCreator != null) { mAccountCreator.setUsername( LinphonePreferences.instance() .getAccountUsername( LinphonePreferences.instance().getDefaultAccountIndex())); mAccountCreator.isAccountExist(); + LinphonePreferences.instance().setLinkPopupTime(String.valueOf(newDate)); } } else { LinphonePreferences.instance().setLinkPopupTime(null); @@ -1489,20 +1507,6 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou 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; - - long future = - new Timestamp( - LinphoneActivity.instance() - .getResources() - .getInteger(R.integer.popup_time_interval)) - .getTime(); - long newDate = now + future; - - LinphonePreferences.instance().setLinkPopupTime(String.valueOf(newDate)); - final Dialog dialog = LinphoneActivity.instance() .displayDialog( @@ -1866,4 +1870,12 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou void setDisplayedName(String s); } + + public boolean hasLastCallSasBeenRejected() { + return mHasLastCallSasBeenRejected; + } + + public void lastCallSasRejected(boolean rejected) { + mHasLastCallSasBeenRejected = rejected; + } } diff --git a/app/src/main/java/org/linphone/assistant/CreateAccountActivationFragment.java b/app/src/main/java/org/linphone/assistant/CreateAccountActivationFragment.java index dc15184a9..c58cca092 100644 --- a/app/src/main/java/org/linphone/assistant/CreateAccountActivationFragment.java +++ b/app/src/main/java/org/linphone/assistant/CreateAccountActivationFragment.java @@ -31,6 +31,7 @@ import org.linphone.LinphoneManager; import org.linphone.R; import org.linphone.core.AccountCreator; import org.linphone.core.AccountCreatorListener; +import org.linphone.core.tools.Log; import org.linphone.settings.LinphonePreferences; public class CreateAccountActivationFragment extends Fragment @@ -57,6 +58,7 @@ public class CreateAccountActivationFragment extends Fragment mAccountCreator.setUsername(mUsername); mAccountCreator.setPassword(mPassword); + mAccountCreator.setDomain(getString(R.string.default_domain)); mEmail = view.findViewById(R.id.send_email); mEmail.setText(getArguments().getString("Email")); @@ -71,7 +73,7 @@ public class CreateAccountActivationFragment extends Fragment int id = v.getId(); if (id == R.id.assistant_check) { mCheckAccount.setEnabled(false); - mAccountCreator.isAccountActivated(); + AccountCreator.Status status = mAccountCreator.isAccountActivated(); } } @@ -111,6 +113,7 @@ public class CreateAccountActivationFragment extends Fragment AssistantActivity.instance().linphoneLogIn(accountCreator); AssistantActivity.instance().isAccountVerified(); } else { + Log.w("Unexpected error " + status.name()); Toast.makeText( getActivity(), getString(R.string.wizard_server_unavailable), diff --git a/app/src/main/java/org/linphone/assistant/CreateAccountFragment.java b/app/src/main/java/org/linphone/assistant/CreateAccountFragment.java index 37ac55e16..213adc89c 100644 --- a/app/src/main/java/org/linphone/assistant/CreateAccountFragment.java +++ b/app/src/main/java/org/linphone/assistant/CreateAccountFragment.java @@ -135,7 +135,8 @@ public class CreateAccountFragment extends Fragment mSkip = view.findViewById(R.id.assistant_skip); // Phone number - if (getResources().getBoolean(R.bool.use_phone_number_validation)) { + if (!getResources().getBoolean(R.bool.isTablet) + && getResources().getBoolean(R.bool.use_phone_number_validation)) { getActivity().getApplicationContext(); // Automatically get the country code from the phone TelephonyManager tm = @@ -179,12 +180,10 @@ public class CreateAccountFragment extends Fragment } addPhoneNumberHandler(mPhoneNumberEdit); addPhoneNumberHandler(mDialCode); - } - - // Password & email address - if (getResources().getBoolean(R.bool.isTablet) - || !getResources().getBoolean(R.bool.use_phone_number_validation)) { - mUseEmail.setVisibility(View.VISIBLE); + } else { + if (!getResources().getBoolean(R.bool.isTablet)) { + mUseEmail.setVisibility(View.VISIBLE); + } mUseEmail.setOnCheckedChangeListener(this); if (getResources().getBoolean(R.bool.pre_fill_email_in_assistant)) { diff --git a/app/src/main/java/org/linphone/call/CallActivity.java b/app/src/main/java/org/linphone/call/CallActivity.java index da23aeaff..fc0812e8a 100644 --- a/app/src/main/java/org/linphone/call/CallActivity.java +++ b/app/src/main/java/org/linphone/call/CallActivity.java @@ -240,10 +240,11 @@ public class CallActivity extends LinphoneGenericActivity mStatus.refreshStatusItems(call); } } else if (state == State.UpdatedByRemote) { - // If the correspondent proposes mVideo while audio call + // If the correspondent proposes video while audio call boolean videoEnabled = LinphonePreferences.instance().isVideoEnabled(); if (!videoEnabled) { acceptCallUpdate(false); + return; } boolean remoteVideo = call.getRemoteParams().videoEnabled(); @@ -1251,7 +1252,7 @@ public class CallActivity extends LinphoneGenericActivity : "denied")); if (camera == PackageManager.PERMISSION_GRANTED) { - CallActivity.instance().acceptCallUpdate(true); + acceptCallUpdate(true); } else { checkAndRequestPermission( Manifest.permission.CAMERA, PERMISSIONS_REQUEST_CAMERA); @@ -1266,9 +1267,7 @@ public class CallActivity extends LinphoneGenericActivity new OnClickListener() { @Override public void onClick(View view) { - if (CallActivity.isInstanciated()) { - CallActivity.instance().acceptCallUpdate(false); - } + acceptCallUpdate(false); mIsVideoAsk = false; mDialog.dismiss(); mDialog = null; diff --git a/app/src/main/java/org/linphone/chat/ChatMessagesFragment.java b/app/src/main/java/org/linphone/chat/ChatMessagesFragment.java index 0c34c6a93..ea81d0150 100644 --- a/app/src/main/java/org/linphone/chat/ChatMessagesFragment.java +++ b/app/src/main/java/org/linphone/chat/ChatMessagesFragment.java @@ -376,6 +376,11 @@ public class ChatMessagesFragment extends Fragment displayChatRoomHeader(); displayChatRoomHistory(); LinphoneManager.getInstance().setCurrentChatRoomAddress(mRemoteSipAddress); + + if (LinphoneManager.getInstance().hasLastCallSasBeenRejected()) { + LinphoneManager.getInstance().lastCallSasRejected(false); + LinphoneUtils.showTrustDeniedDialog(getActivity()); + } } public void changeDisplayedChat(String localSipUri, String remoteSipUri) { diff --git a/app/src/main/java/org/linphone/chat/DevicesFragment.java b/app/src/main/java/org/linphone/chat/DevicesFragment.java index d48950b2f..6f99c875b 100644 --- a/app/src/main/java/org/linphone/chat/DevicesFragment.java +++ b/app/src/main/java/org/linphone/chat/DevicesFragment.java @@ -145,6 +145,11 @@ public class DevicesFragment extends Fragment { } initValues(); + + if (LinphoneManager.getInstance().hasLastCallSasBeenRejected()) { + LinphoneManager.getInstance().lastCallSasRejected(false); + LinphoneUtils.showTrustDeniedDialog(getActivity()); + } } private void initChatRoom() { diff --git a/app/src/main/java/org/linphone/fragments/DialerFragment.java b/app/src/main/java/org/linphone/fragments/DialerFragment.java index 2dd72a331..2cc0d3587 100644 --- a/app/src/main/java/org/linphone/fragments/DialerFragment.java +++ b/app/src/main/java/org/linphone/fragments/DialerFragment.java @@ -20,9 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import android.app.Fragment; -import android.content.Intent; import android.content.res.Configuration; -import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -32,11 +30,8 @@ import android.widget.ImageView; import android.widget.LinearLayout; import org.linphone.LinphoneActivity; import org.linphone.LinphoneManager; -import org.linphone.LinphoneService; import org.linphone.R; -import org.linphone.contacts.ContactsManager; import org.linphone.core.Core; -import org.linphone.core.tools.Log; import org.linphone.views.AddressAware; import org.linphone.views.AddressText; import org.linphone.views.CallButton; @@ -178,8 +173,9 @@ public class DialerFragment extends Fragment { String addressWaitingToBeCalled = LinphoneActivity.instance().addressWaitingToBeCalled; if (addressWaitingToBeCalled != null) { mAddress.setText(addressWaitingToBeCalled); - if (getResources() - .getBoolean(R.bool.automatically_start_intercepted_outgoing_gsm_call)) { + if (!LinphoneActivity.instance().isCallTransfer() + && getResources() + .getBoolean(R.bool.automatically_start_intercepted_outgoing_gsm_call)) { newOutgoingCall(addressWaitingToBeCalled); } LinphoneActivity.instance().addressWaitingToBeCalled = null; @@ -208,6 +204,7 @@ public class DialerFragment extends Fragment { mAddContact.setImageResource(R.drawable.call_back); mAddContact.setOnClickListener(mCancelListener); } else { + mCall.resetClickListener(); if (LinphoneManager.getLc().getVideoActivationPolicy().getAutomaticallyInitiate()) { mCall.setImageResource(R.drawable.call_video_start); } else { @@ -235,33 +232,4 @@ public class DialerFragment extends Fragment { displayTextInAddressBar(numberOrSipAddress); LinphoneManager.getInstance().newOutgoingCall(mAddress); } - - public void newOutgoingCall(Intent intent) { - if (intent != null && intent.getData() != null) { - String scheme = intent.getData().getScheme(); - if (scheme.startsWith("imto")) { - mAddress.setText("sip:" + intent.getData().getLastPathSegment()); - } else if (scheme.startsWith("call") || scheme.startsWith("sip")) { - mAddress.setText(intent.getData().getSchemeSpecificPart()); - } else { - Uri contactUri = intent.getData(); - String address = - ContactsManager.getInstance() - .getAddressOrNumberForAndroidContact( - LinphoneService.instance().getContentResolver(), - contactUri); - if (address != null) { - mAddress.setText(address); - } else { - Log.e("Unknown scheme: ", scheme); - mAddress.setText(intent.getData().getSchemeSpecificPart()); - } - } - - mAddress.clearDisplayedName(); - intent.setData(null); - - LinphoneManager.getInstance().newOutgoingCall(mAddress); - } - } } diff --git a/app/src/main/java/org/linphone/fragments/StatusFragment.java b/app/src/main/java/org/linphone/fragments/StatusFragment.java index e80ddc749..a22cb413b 100644 --- a/app/src/main/java/org/linphone/fragments/StatusFragment.java +++ b/app/src/main/java/org/linphone/fragments/StatusFragment.java @@ -483,6 +483,7 @@ public class StatusFragment extends Fragment { @Override public void onClick(View view) { if (call != null) { + LinphoneManager.getInstance().lastCallSasRejected(true); call.setAuthenticationTokenVerified(false); if (mEncryption != null) { mEncryption.setImageResource(R.drawable.security_ko); diff --git a/app/src/main/java/org/linphone/settings/AccountSettingsFragment.java b/app/src/main/java/org/linphone/settings/AccountSettingsFragment.java index f89373c81..2a00614f6 100644 --- a/app/src/main/java/org/linphone/settings/AccountSettingsFragment.java +++ b/app/src/main/java/org/linphone/settings/AccountSettingsFragment.java @@ -203,6 +203,10 @@ public class AccountSettingsFragment extends Fragment { new SettingListenerBase() { @Override public void onTextValueChanged(String newValue) { + if (newValue.isEmpty()) { + return; + } + if (mAuthInfo != null) { mAuthInfo.setUsername(newValue); } else { @@ -229,6 +233,7 @@ public class AccountSettingsFragment extends Fragment { public void onTextValueChanged(String newValue) { if (mAuthInfo != null) { mAuthInfo.setUserid(newValue); + Core core = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); if (core != null) { core.refreshRegisters(); @@ -244,9 +249,12 @@ public class AccountSettingsFragment extends Fragment { @Override public void onTextValueChanged(String newValue) { if (mAuthInfo != null) { + mAuthInfo.setHa1(null); mAuthInfo.setPassword(newValue); + Core core = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); if (core != null) { + core.addAuthInfo(mAuthInfo); core.refreshRegisters(); } } else { @@ -259,6 +267,10 @@ public class AccountSettingsFragment extends Fragment { new SettingListenerBase() { @Override public void onTextValueChanged(String newValue) { + if (newValue.isEmpty()) { + return; + } + if (mAuthInfo != null) { mAuthInfo.setDomain(newValue); } else { @@ -601,6 +613,7 @@ public class AccountSettingsFragment extends Fragment { if (mProxyConfig != null) { Address identityAddress = mProxyConfig.getIdentityAddress(); mAuthInfo = mProxyConfig.findAuthInfo(); + NatPolicy natPolicy = mProxyConfig.getNatPolicy(); if (natPolicy == null) { natPolicy = core.createNatPolicy(); diff --git a/app/src/main/java/org/linphone/settings/LinphonePreferences.java b/app/src/main/java/org/linphone/settings/LinphonePreferences.java index 402a134ed..8e55c87ee 100644 --- a/app/src/main/java/org/linphone/settings/LinphonePreferences.java +++ b/app/src/main/java/org/linphone/settings/LinphonePreferences.java @@ -437,12 +437,12 @@ public class LinphonePreferences { // End of call settings public boolean isWifiOnlyEnabled() { - return getConfig().getBool("app", "wifi_only", false); + return getLc().wifiOnlyEnabled(); } // Network settings public void setWifiOnlyEnabled(Boolean enable) { - getConfig().setBool("app", "wifi_only", enable); + getLc().enableWifiOnly(enable); } public void useRandomPort(boolean enabled) { diff --git a/app/src/main/java/org/linphone/utils/LinphoneUtils.java b/app/src/main/java/org/linphone/utils/LinphoneUtils.java index 70d4fe5cd..7fac670e6 100644 --- a/app/src/main/java/org/linphone/utils/LinphoneUtils.java +++ b/app/src/main/java/org/linphone/utils/LinphoneUtils.java @@ -21,8 +21,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import android.app.Activity; import android.app.AlertDialog; +import android.app.Dialog; import android.content.Context; import android.content.Intent; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Handler; @@ -32,9 +35,14 @@ import android.text.Html; import android.text.Spanned; import android.view.KeyEvent; import android.view.View; +import android.view.Window; +import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; +import android.widget.Button; import android.widget.EditText; +import android.widget.ImageView; import android.widget.TextView; +import androidx.core.content.ContextCompat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; @@ -49,6 +57,7 @@ import org.linphone.core.AccountCreator; import org.linphone.core.Address; import org.linphone.core.Call; import org.linphone.core.Call.State; +import org.linphone.core.CallLog; import org.linphone.core.ChatRoom; import org.linphone.core.ChatRoomCapabilities; import org.linphone.core.Core; @@ -502,4 +511,65 @@ public final class LinphoneUtils { } return newRooms; } + + public static void showTrustDeniedDialog(Context context) { + final Dialog dialog = new Dialog(context); + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); + dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); + dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + Drawable d = new ColorDrawable(ContextCompat.getColor(context, R.color.dark_grey_color)); + d.setAlpha(200); + dialog.setContentView(R.layout.dialog); + dialog.getWindow() + .setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT); + dialog.getWindow().setBackgroundDrawable(d); + + TextView title = dialog.findViewById(R.id.dialog_title); + title.setVisibility(View.GONE); + + TextView message = dialog.findViewById(R.id.dialog_message); + message.setVisibility(View.VISIBLE); + message.setText(context.getString(R.string.trust_denied)); + + ImageView icon = dialog.findViewById(R.id.dialog_icon); + icon.setVisibility(View.VISIBLE); + icon.setImageResource(R.drawable.security_alert_indicator); + + Button delete = dialog.findViewById(R.id.dialog_delete_button); + delete.setVisibility(View.GONE); + Button cancel = dialog.findViewById(R.id.dialog_cancel_button); + cancel.setVisibility(View.VISIBLE); + Button call = dialog.findViewById(R.id.dialog_ok_button); + call.setVisibility(View.VISIBLE); + call.setText(R.string.call); + + cancel.setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + dialog.dismiss(); + } + }); + + call.setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View view) { + CallLog[] logs = + LinphoneManager.getLcIfManagerNotDestroyedOrNull().getCallLogs(); + CallLog lastLog = logs[0]; + Address addressToCall = + lastLog.getDir() == Call.Dir.Incoming + ? lastLog.getFromAddress() + : lastLog.getToAddress(); + LinphoneManager.getInstance() + .newOutgoingCall(addressToCall.asString(), null); + dialog.dismiss(); + } + }); + dialog.show(); + } } diff --git a/app/src/main/res/layout-sw533dp-land/assistant_account_creation.xml b/app/src/main/res/layout-sw533dp-land/assistant_account_creation.xml index 7504a14b4..514e3d450 100644 --- a/app/src/main/res/layout-sw533dp-land/assistant_account_creation.xml +++ b/app/src/main/res/layout-sw533dp-land/assistant_account_creation.xml @@ -46,7 +46,7 @@ android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical" - android:visibility="visible"> + android:visibility="gone"> + android:visibility="visible"> + android:visibility="visible"> + android:visibility="visible"> + android:visibility="visible"> + android:visibility="gone" /> + android:visibility="gone" /> diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7e35e22cc..8b4bffdd4 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -424,6 +424,7 @@ Dienstbenachrichtigung aktivieren Beim Einschalten starten Auflegen bei eingehendem Anruf (in Sekunden) + Gerätename Fernbereitstellung Android-App-Einstellungen Android-Benachrichtigungseinstellungen diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index f7b674d73..05c328513 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -29,7 +29,7 @@ Nom d\'affichage Mot de passe Confirmation du mot de passe - Domain + Domaine URL Email Voulez-vous supprimer votre sélection ? @@ -241,6 +241,7 @@ Disponible gratuitement ici : %s Evénement inattendu %i pour %s Télécharger Sélectionnez une conversation ou créez-en une nouvelle + La confiance a été retirée. Faites un appel pour relancer la procédure d’authentification. Connecté Déconnecté diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 668705283..67d899747 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -6,15 +6,26 @@ Linphone Linphone Avvio + %sè connesso + %s non è riuscito a connettersi Linphone Android %s Linphone Core %s + Linphone SDK %s + Leggi le nostre regole della privacy contatti linphone + Rispondi + Risposta inviata: %s + Interrompi + Rispondi + Segna come già letto Nome utente ID utente (facoltativo) Numero di telefono + Codice di conferma + Prefisso internazionale Nome visualizzato Password Conferma password @@ -48,6 +59,9 @@ Si Collega il tuo account È disponibile un aggiornamento + Non mostrarlo più + Sei sicuro di eliminare questi contatti?\nSaranno eliminati anche dal tuo telefono! + Log indirizzi copiati negli appunti the libre SIP client @@ -78,6 +92,7 @@ Usa l\'account SIP Recupera la configurazione remota Recupera ed applica + Codice QR Login Calibrazione del cancellatore dell\'eco in corso Inserisci il tuo login @@ -145,6 +160,7 @@ Vuoi cancellare il registro delle chiamate selezionato? Oggi Ieri + Chiamate Nessun contatto nella tua rubrica. Nessun contatto SIP nella tua rubrica. @@ -154,10 +170,16 @@ Nome Cognome Organizzazione + Invito + Ciao, chiamami con Linphone! Puoi scaricarlo gratuitamente a %s + Scegli un contatto o creane uno nuovo Nessuna conversazione Vuoi eliminare la conversazione selezionata? Vuoi eliminare il messaggio selezionato? + L\'interlocutore sta scrivendo... + %s sta scrivendo... + %s stanno scrivendo... Piccolo Medio Grande @@ -167,6 +189,7 @@ Seleziona la fonte Immagine salvata Errore, immagine non salvata + Attendere prego... Si è verificato un errore durante il trasferimento del file Questo messaggio non è cifrato Hai ricevuto un messaggio crittografato che non sei in grado di decodificare da %s\nDevi chiamare il tuo corrispondente per scambiare le tue chiavi ZRTP se vuoi decodificare i messaggi futuri che riceverai. @@ -200,17 +223,34 @@ Ora sei amministratore Non sei più amministratore Creazione della chat room fallita + Vuoi veramente lasciare questa conversazione? Lascia + Vuoi eliminare e lasciare le conversazioni selezionate? Stato della consegna Dispositivi di %s Dispositivi di conversazione Aggiungi ai contatti + I messaggi sono criptati in conversazioni sicure. È possibile aumentare il livello di sicurezza di una conversazione autentificando i partecipanti. Per farlo, chiama il contatto e segui il processo di autenticazione. + Chiave di identità LIME cambiata per %s + Attacco del tipo man-in-the-middle per %s + %sha fatto diminuire il livello di sicurezza + %sha superato il numero max partecipanti + Evento inaspettato %iper %s + Scarica + Scegli una conversazione o creane una nuova + Il trust è stato negato. Effettua una chiamata per avviare nuovamente la procedura di autenticazione. + Connesso + Non connesso + Registrazione in corso + Connessione difettosa messaggi non letti + Uscita Assistente Impostazioni + Registrazioni Informazioni Esci @@ -220,6 +260,9 @@ Nessuna chiamata attiva Il chiamante ha messo in pausa la chiamata Si è verificato un errore durante l\'accettazione della chiamata + Leggi: + Conferma che il tuo interlocutore dice: + Sicurezza della conversazione SAS Conferma il precedente codice SAS con il tuo corrispondente Sconosciuto @@ -242,7 +285,10 @@ Decoder: Filtro di visualizzazione: Chiamata + Vuoi cancellare il registro delle chiamate selezionate? + Nessuna registrazione + Vuoi eliminare le registrazioni selezionate? Invia log Cancella log @@ -250,6 +296,8 @@ Chiamata audio in corso Chiamata in pausa Chiamata video in corso + Chiamata in arrivo + Chiamata effettuata avviato %i messaggi non letti Chiamata persa @@ -270,6 +318,7 @@ Non autorizzato Errore di rete Scaricamento fallito. Controlla la connessione di rete o riprova più tardi. + Impossibile scaricare o applicare il profilo di provisioning remoto... Provisioning remoto Vuoi cambiare l\'URI di provisioning? @@ -336,6 +385,8 @@ non riuscito Controllo adattivo della velocità Limite bitrate del codec + Amplificazione microfono (in db) + Amplificazione ascolto (in db) Codec Video @@ -354,6 +405,7 @@ Chiamata Usa la suoneria del dispositivo + Vibrazione per chiamata in arrivo Rispondere automaticamente alle chiamate in arrivo Tempo di risposta automatica (in millisecondi) Invia DTMF in-band (RFC2833) @@ -361,6 +413,7 @@ Timeout della chiamata (in secondi) URI della segreteria telefonica Utilizza Linphone come app telefono predefinita + Accetta early-media Chat Server di condivisione @@ -370,6 +423,11 @@ Obbligatorio Preferito LIME richiede la cifratura ZRTP.\nAttivando LIME si attiva automaticamente la cifratura multimediale ZRTP. + Regole per scaricamento di file in arrivo + Grandezza max (in byte) + Mai + Sempre + Se minore della grandezza massima Rete Usa solo Wi-Fi @@ -389,17 +447,23 @@ Cifratura multimediale Abilita le notifiche push Consenti IPv6 + Impostazioni per protezione batteria + La app deve\'essere abilitata per ricevere notifiche push Avanzate + Modalità scura Debug Debug Utilizza il Java logger Iscrizione ad una lista di amici Modalità Background + Mostra una notifica per tenere la app aperta Abilita animazioni Abilita notifica di servizio Parti dell\'avvio Riaggancio delle chiamate in entrata (in secondi) + Nome dispositivo + I cambiamenti entrano in vigore alla prossima accensione Provisioning remoto Impostazioni dell\'app Android Impostazioni di notifica Android @@ -413,10 +477,15 @@ Usa la modifica delle API di instradamento Utilizza le modifiche audio per Galaxy S + Rilevato risparmio energetico + Sembra che il tuo dispositivo abbia il risparmio energetico. Se desideri ricevere chiamate e notifiche push mentre la app è chiusa devi abilitare tale funzione. Impostazioni Dopo Debug + Abilita registri attività + Disabilita registri attività + Invia registro attività Indietro Tastierino @@ -493,4 +562,5 @@ Notifiche di messaggi istantanei Linphone Oggetto della chat room di gruppo Informazioni sulla chat room di gruppo + Registra chiamata diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 5aee5cfeb..0a453cd80 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -239,6 +239,7 @@ Неожиданное событие %i для %s Скачать Выберите беседу или создайте новую + В доверии было отказано. Сделайте вызов, чтобы начать процесс аутентификации снова. Соединено Не соединено @@ -461,6 +462,8 @@ Включить сервисное уведомление Запуск во время загрузки Отклонение входящего вызова (в секундах) + Имя устройства + Изменения применятся при следующем запуске Удалённое конфигурирование Параметры приложения в Android Параметры уведомлений в Android diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 2685b4b25..a67b94d56 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -6,10 +6,13 @@ Linphone Linphone Завантажується + %s з\'єднано + %s з\'єднатися не вийшло Linphone Android %s Linphone ядро %s Linphone SDK %s + Відвідайте нашу політику конфіденційності контакти linphone Відповідь @@ -21,6 +24,8 @@ Ім\'я користувача Ідентифікатор користувача (необов\'язково) Номер телефону + Код підтвердження + Префікс міжнародного номеру телефону Показуване ім\'я Пароль Схвалення паролю @@ -56,6 +61,7 @@ Доступне оновлення Не показувати знову Ви впевнені, що волієте вилучити ці контакти?\nВони також будуть вилучені з вашого телефону! + URL-адресу журналів скопійовано до буферу обміну це безкоштовний SIP-клієнт @@ -154,6 +160,7 @@ Ви справді бажаєте вилучити обраний журнал викликів? Сьогодні Вчора + Виклики В адресній книзі немає контактів. В адресній книзі немає SIP контактів. @@ -164,10 +171,15 @@ Прізвище Організація Запросити + Вітаю! Приєднуйтеся до мене в Linphone! Ви можете завантажити його безкоштовно звідси: %s + Оберіть контакт або створіть новий Немає розмов Ви справді бажаєте вилучити обрану розмову? Ви справді бажаєте вилучити обране повідомлення? + Співрозмовник пише... + %s пише… + %s пишуть… Маленький Середній Великий @@ -177,6 +189,7 @@ Вибрати джерело Зображення збережено Помилка, зображення не збережено + Будь ласка зачекайте... При передачі файлу трапилася помилка Це повідомлення не зашифровано Від %sотримано зашифроване повідомлення, яке ви не можете розшифрувати.\nВи маєте зателефонувати своєму співрозмовнику для обміну ключами ZRTP. Це необхідно для розшифрування майбутніх повідомлень, які ви отримаєте. @@ -225,9 +238,16 @@ Щонайбільша кількість учасників перебільшена %s Несподівана подія %i для %s Стягнути + Оберіть бесіду або створіть нову + У довірі було відмовлено. Зробіть виклик, аби почати процес автентифікації знову. + З\'єднано + Не з\'єднано + Виконується з\'єднання + З\'єднання не відбулося непрочитаних повідомлень + Вийти Асистент Налаштування Записи @@ -265,6 +285,7 @@ Декодер Відображуваний фільтр: Виклик + Ви справді волієте вилучити обрані журнали викликів? Немає записів Ви бажаєте вилучити обрані записи? @@ -275,6 +296,8 @@ Встановлено авдіоз\'єднання Виклик на павзі Встановлено відеоз\'єднання + Вхідний виклик + Вихідний виклик почато %i непрочитаних повідомлень Пропущений виклик @@ -295,6 +318,7 @@ Не авторизований Помилка мережі Завантаження не вдалося. Перевірте мережеве з\'єднання або повторіть спробу пізніше. + Не вдалося завантажити або застосувати профіль віддаленої конфігурації... Віддалене конфігурування Ви бажаєте змінити URI конфігурування? @@ -361,6 +385,8 @@ не вдалося Адаптивний контроль швидкости Гранична межа кодеку + Підсилення мікрофону (в дБ) + Підсилення відтворення (в дБ) Кодеки Відео @@ -387,6 +413,7 @@ Час очікування виклику (у секундах) URI голосової пошти Використовувати Linphone у якости типового застосунку для дзвінків. + Приймати ранній потік Чат Сервер обміну @@ -424,15 +451,19 @@ Цей застосунок має бути увімкнений для отримання push-сповіщень Додатково + Темний режим Зневадження Зневадження Використовувати Java-реєстратор Підписка Тловий режим + Показувати сповіщення, аби зберегти застосунок робочим Увімкнути анімацію Увімкнути сервісне сповіщення Запуск під час завантаження Відхилення вхідного виклику (у секундах) + Ім\'я пристрою + Зміни буде застосовано при наступному запуску Віддалене конфігурування Параметри додатку в Android Параметри сповіщень в Android @@ -452,6 +483,9 @@ Пізніше Зневадження + Увімкнути журнали + Вимкнути журнали + Відправити журнали Назад Номеронабирач diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 73274c74e..7c725b8c1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -250,6 +250,7 @@ Unexpected event %i for %s Download Select a conversation or create a new one + Trust has been denied. Make a call to start the authentication process again. Connected