diff --git a/res/layout-sw533dp-land/assistant_login.xml b/res/layout-sw533dp-land/assistant_login.xml index 1708857cf..255446aad 100644 --- a/res/layout-sw533dp-land/assistant_login.xml +++ b/res/layout-sw533dp-land/assistant_login.xml @@ -146,6 +146,29 @@ android:gravity="center" android:layout_margin="10dp"> + + + + + + sip:voip-metrics@sip.linphone.org;transport=tls 1 180 - 600 + 31536000 sip:?@sip.linphone.org <sip:sip.linphone.org;transport=tls> 1 diff --git a/res/values/non_localizable_custom.xml b/res/values/non_localizable_custom.xml index 891c6eb1e..1879eedbe 100644 --- a/res/values/non_localizable_custom.xml +++ b/res/values/non_localizable_custom.xml @@ -93,6 +93,7 @@ linphone-android@belledonne-communications.com true true + linphone_notification_service_id linphone_notification_id 1000 7000 diff --git a/res/values/strings.xml b/res/values/strings.xml index 459fd769b..36a3d5242 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -487,5 +487,6 @@ Call options Audio route Exit conference + Linphone Service Linphone Notification diff --git a/src/android/org/linphone/LinphoneLauncherActivity.java b/src/android/org/linphone/LinphoneLauncherActivity.java index 4e80af67c..ec8ad85e5 100644 --- a/src/android/org/linphone/LinphoneLauncherActivity.java +++ b/src/android/org/linphone/LinphoneLauncherActivity.java @@ -25,9 +25,9 @@ import android.content.pm.ActivityInfo; import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.util.Log; import org.linphone.assistant.RemoteProvisioningActivity; -import org.linphone.mediastream.Log; import org.linphone.mediastream.Version; import static android.content.Intent.ACTION_MAIN; @@ -157,12 +157,12 @@ public class LinphoneLauncherActivity extends Activity { } if (uriToResolve != null) { addressToCall = ContactsManager.getInstance().getAddressOrNumberForAndroidContact(getContentResolver(), uriToResolve); - Log.i("Intent has uri to resolve : " + uriToResolve.toString()); + Log.i("LinphoneLauncher", "Intent has uri to resolve : " + uriToResolve.toString()); uriToResolve = null; } if (addressToCall != null) { newIntent.putExtra("SipUriOrNumber", addressToCall); - Log.i("Intent has address to call : " + addressToCall); + Log.i("LinphoneLauncher", "Intent has address to call : " + addressToCall); addressToCall = null; } startActivity(newIntent); diff --git a/src/android/org/linphone/LinphoneManager.java b/src/android/org/linphone/LinphoneManager.java index ed6bb86d7..1963b603f 100644 --- a/src/android/org/linphone/LinphoneManager.java +++ b/src/android/org/linphone/LinphoneManager.java @@ -186,7 +186,6 @@ public class LinphoneManager implements CoreListener, ChatMessageListener, Senso private IntentFilter mCallIntentFilter; private IntentFilter mNetworkIntentFilter; private Handler mHandler = new Handler(); - private WakeLock mIncallWakeLock; private WakeLock mProximityWakelock; private AccountCreator accountCreator; private static List mPendingChatFileMessage; @@ -1089,7 +1088,6 @@ public class LinphoneManager implements CoreListener, ChatMessageListener, Senso boolean wifiOnly = LinphonePreferences.instance().isWifiOnlyEnabled(); if (wifiOnly){ if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { - setDnsServers(); mLc.setNetworkReachable(true); } else { @@ -1105,7 +1103,6 @@ public class LinphoneManager implements CoreListener, ChatMessageListener, Senso Log.i("Connectivity has changed."); mLc.setNetworkReachable(false); } - setDnsServers(); mLc.setNetworkReachable(true); mLastNetworkType = curtype; } @@ -1492,12 +1489,6 @@ public class LinphoneManager implements CoreListener, ChatMessageListener, Senso routeAudioToReceiver(); } } - if (mIncallWakeLock != null && mIncallWakeLock.isHeld()) { - mIncallWakeLock.release(); - Log.i("Last call ended: releasing incall (CPU only) wake lock"); - } else { - Log.i("Last call ended: no incall (CPU only) wake lock were held"); - } } } if (state == State.UpdatedByRemote) { @@ -1520,15 +1511,6 @@ public class LinphoneManager implements CoreListener, ChatMessageListener, Senso if (state == State.StreamsRunning) { startBluetooth(); setAudioManagerInCallMode(); - if (mIncallWakeLock == null) { - mIncallWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "incall"); - } - if (!mIncallWakeLock.isHeld()) { - Log.i("New call active : acquiring incall (CPU only) wake lock"); - mIncallWakeLock.acquire(); - } else { - Log.i("New call active while incall (CPU only) wake lock already active"); - } } } @@ -1840,26 +1822,6 @@ public class LinphoneManager implements CoreListener, ChatMessageListener, Senso dozeModeEnabled = b; } - public void setDnsServers() { - if (mConnectivityManager == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.M) - return; - - if (mConnectivityManager.getActiveNetwork() == null - || mConnectivityManager.getLinkProperties(mConnectivityManager.getActiveNetwork()) == null) - return; - - int i = 0; - List inetServers = null; - inetServers = mConnectivityManager.getLinkProperties(mConnectivityManager.getActiveNetwork()).getDnsServers(); - - String[] servers = new String[inetServers.size()]; - - for (InetAddress address : inetServers) { - servers[i++] = address.getHostAddress(); - } - mLc.setDnsServers(servers); - } - public String getmDynamicConfigFile() { return mDynamicConfigFile; } diff --git a/src/android/org/linphone/LinphonePreferences.java b/src/android/org/linphone/LinphonePreferences.java index 45e10524b..54b3a0d05 100644 --- a/src/android/org/linphone/LinphonePreferences.java +++ b/src/android/org/linphone/LinphonePreferences.java @@ -360,9 +360,7 @@ public class LinphonePreferences { if (tempContactsParams != null) prxCfg.setContactUriParameters(tempContactsParams); if (tempExpire != null) { - try { - prxCfg.setExpires(Integer.parseInt(tempExpire)); - } catch (NumberFormatException nfe) { } + prxCfg.setExpires(Integer.parseInt(tempExpire)); } prxCfg.setAvpfMode(AVPFMode.Enabled); diff --git a/src/android/org/linphone/LinphoneService.java b/src/android/org/linphone/LinphoneService.java index c77c2e1d6..5398c3d64 100644 --- a/src/android/org/linphone/LinphoneService.java +++ b/src/android/org/linphone/LinphoneService.java @@ -308,6 +308,12 @@ public final class LinphoneService extends Service { dumpDeviceInformation(); dumpInstalledLinphoneInformation(); + //Disable service notification for Android O + if ((Version.sdkAboveOrEqual(Version.API26_O_80))) { + LinphonePreferences.instance().setServiceNotificationVisibility(false); + mDisableRegistrationStatus = true; + } + mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); mNM.cancel(INCALL_NOTIF_ID); // in case of crash the icon is not removed Compatibility.CreateChannel(this); @@ -316,10 +322,6 @@ public final class LinphoneService extends Service { notifIntent.putExtra("Notification", true); mNotifContentIntent = PendingIntent.getActivity(this, 0, notifIntent, PendingIntent.FLAG_UPDATE_CURRENT); - if (Version.sdkAboveOrEqual(Version.API26_O_80)) { - disableNotificationsAutomaticRegistrationStatusContent(); - } - Bitmap bm = null; try { bm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); @@ -398,7 +400,7 @@ public final class LinphoneService extends Service { @Override public void onGlobalStateChanged(Core lc,Core.GlobalState state, String message) { - if (state == Core.GlobalState.On && displayServiceNotification()) { + if (!mDisableRegistrationStatus && state == GlobalState.On && displayServiceNotification()) { sendNotification(IC_LEVEL_ORANGE, R.string.notification_started); } } @@ -753,10 +755,6 @@ public final class LinphoneService extends Service { } } - public void disableNotificationsAutomaticRegistrationStatusContent() { - mDisableRegistrationStatus = true; - } - private synchronized void sendNotification(int level, int textId) { String text = getString(textId); if (text.contains("%s") && LinphoneManager.getLc() != null) { diff --git a/src/android/org/linphone/StatusFragment.java b/src/android/org/linphone/StatusFragment.java index 0d1df0b4e..c37abb155 100644 --- a/src/android/org/linphone/StatusFragment.java +++ b/src/android/org/linphone/StatusFragment.java @@ -32,6 +32,7 @@ import org.linphone.mediastream.Log; import android.app.Activity; import android.app.Dialog; import android.app.Fragment; +import android.app.KeyguardManager; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; @@ -413,8 +414,12 @@ public class StatusFragment extends Fragment { zrtpToRead = token.substring(2); } - LinphoneService.instance().displaySasNotification(token); - + // Obiane specific dev : display sas notif only if screen locked + KeyguardManager myKM = (KeyguardManager) getActivity().getSystemService(Context.KEYGUARD_SERVICE); + if( myKM.inKeyguardRestrictedInputMode()) { + //Screen is locked + LinphoneService.instance().displaySasNotification(call.getAuthenticationToken()); + } TextView customText = (TextView) ZRTPdialog.findViewById(R.id.customText); String newText = getString(R.string.zrtp_dialog1).replace("%s", zrtpToRead) + getString(R.string.zrtp_dialog2).replace("%s", zrtpToListen); diff --git a/src/android/org/linphone/assistant/AssistantActivity.java b/src/android/org/linphone/assistant/AssistantActivity.java index 3040b2ab9..eb81c6a17 100644 --- a/src/android/org/linphone/assistant/AssistantActivity.java +++ b/src/android/org/linphone/assistant/AssistantActivity.java @@ -365,9 +365,6 @@ private static AssistantActivity instance; proxyConfig.setIdentityAddress(addr); - if (LinphonePreferences.instance() != null) - proxyConfig.setContactUriParameters(LinphonePreferences.instance().getPushNotificationRegistrationID()); - if (accountCreator.getPhoneNumber() != null && accountCreator.getPhoneNumber().length() > 0) proxyConfig.setDialPrefix(org.linphone.core.Utils.getPrefixFromE164(accountCreator.getPhoneNumber())); @@ -388,6 +385,9 @@ private static AssistantActivity instance; lc.setDefaultProxyConfig(proxyConfig); + if (LinphonePreferences.instance() != null) + LinphonePreferences.instance().setPushNotificationEnabled(true); + if (ContactsManager.getInstance() != null) ContactsManager.getInstance().fetchContactsAsync(); @@ -407,8 +407,8 @@ private static AssistantActivity instance; configureProxyConfig(accountCreator); } - public void genericLogIn(String username, String userid, String password, String prefix, String domain, TransportType transport) { - saveCreatedAccount(username, userid, password, null, prefix, domain, transport); + public void genericLogIn(String username, String userid, String password, String displayname, String prefix, String domain, TransportType transport) { + saveCreatedAccount(username, userid, password, displayname, null, prefix, domain, transport); } private void display(AssistantFragmentsEnum fragment) { @@ -504,7 +504,7 @@ private static AssistantActivity instance; return phoneNumberWithCountry; } - public void saveCreatedAccount(String username, String userid, String password, String ha1, String prefix, String domain, TransportType transport) { + public void saveCreatedAccount(String username, String userid, String password, String displayname, String ha1, String prefix, String domain, TransportType transport) { username = LinphoneUtils.getDisplayableUsernameFromAddress(username); domain = LinphoneUtils.getDisplayableUsernameFromAddress(domain); @@ -517,6 +517,7 @@ private static AssistantActivity instance; .setDomain(domain) .setHa1(ha1) .setUserid(userid) + .setDisplayName(displayname) .setPassword(password); if (prefix != null) { diff --git a/src/android/org/linphone/assistant/CreateAccountFragment.java b/src/android/org/linphone/assistant/CreateAccountFragment.java index 2c7dd3a05..213de7516 100644 --- a/src/android/org/linphone/assistant/CreateAccountFragment.java +++ b/src/android/org/linphone/assistant/CreateAccountFragment.java @@ -324,6 +324,7 @@ public class CreateAccountFragment extends Fragment implements CompoundButton.On } else { if (useEmail.isChecked()) accountCreator.setPhoneNumber(null, null); if (!getResources().getBoolean(R.bool.isTablet) || getUsername().length() > 0) { + LinphoneManager.getLc().getConfig().loadFromXmlFile(LinphoneManager.getInstance().getmDynamicConfigFile()); accountCreator.isAccountExist(); } else { LinphoneUtils.displayErrorAlert(LinphoneUtils.errorForUsernameStatus(AccountCreator.UsernameStatus.TooShort) @@ -590,6 +591,7 @@ public class CreateAccountFragment extends Fragment implements CompoundButton.On LinphoneUtils.displayErrorAlert(LinphoneUtils.errorForStatus(status) , AssistantActivity.instance()); } else { + LinphoneManager.getLc().getConfig().loadFromXmlFile(LinphoneManager.getInstance().getmDynamicConfigFile()); accountCreator.isAliasUsed(); } } else { diff --git a/src/android/org/linphone/assistant/LoginFragment.java b/src/android/org/linphone/assistant/LoginFragment.java index a85e6c550..2bd732c68 100644 --- a/src/android/org/linphone/assistant/LoginFragment.java +++ b/src/android/org/linphone/assistant/LoginFragment.java @@ -34,7 +34,7 @@ import android.widget.RadioGroup; import android.widget.Toast; public class LoginFragment extends Fragment implements OnClickListener, TextWatcher { - private EditText login, userid, password, domain; + private EditText login, userid, password, domain, displayName; private RadioGroup transports; private Button apply; @@ -45,6 +45,8 @@ public class LoginFragment extends Fragment implements OnClickListener, TextWatc login = (EditText) view.findViewById(R.id.assistant_username); login.addTextChangedListener(this); + displayName = (EditText) view.findViewById(R.id.assistant_display_name); + displayName.addTextChangedListener(this); userid = (EditText) view.findViewById(R.id.assistant_userid); userid.addTextChangedListener(this); password = (EditText) view.findViewById(R.id.assistant_password); @@ -83,7 +85,7 @@ public class LoginFragment extends Fragment implements OnClickListener, TextWatc if (domain.getText().toString().compareTo(getString(R.string.default_domain)) == 0) { AssistantActivity.instance().displayLoginLinphone(login.getText().toString(), password.getText().toString()); } else { - AssistantActivity.instance().genericLogIn(login.getText().toString(), userid.getText().toString(), password.getText().toString(), null, domain.getText().toString(), transport); + AssistantActivity.instance().genericLogIn(login.getText().toString(), userid.getText().toString(), password.getText().toString(), displayName.getText().toString(), null, domain.getText().toString(), transport); } } } diff --git a/src/android/org/linphone/compatibility/ApiTwentySixPlus.java b/src/android/org/linphone/compatibility/ApiTwentySixPlus.java index 53453cbdb..2360bd0c6 100644 --- a/src/android/org/linphone/compatibility/ApiTwentySixPlus.java +++ b/src/android/org/linphone/compatibility/ApiTwentySixPlus.java @@ -8,6 +8,7 @@ import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.graphics.Bitmap; +import android.media.AudioAttributes; import android.view.ViewTreeObserver; import org.linphone.R; @@ -37,12 +38,22 @@ public class ApiTwentySixPlus { public static void CreateChannel(Context context) { NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - String id = context.getString(R.string.notification_channel_id); - CharSequence name = context.getString(R.string.content_title_notification); - String description = context.getString(R.string.content_title_notification); - int importance = NotificationManager.IMPORTANCE_HIGH; + // Create service notification channel + String id = context.getString(R.string.notification_service_channel_id); + CharSequence name = context.getString(R.string.content_title_notification_service); + String description = context.getString(R.string.content_title_notification_service); + int importance = NotificationManager.IMPORTANCE_NONE; NotificationChannel mChannel = new NotificationChannel(id, name, importance); mChannel.setDescription(description); + mChannel.enableVibration(false); + notificationManager.createNotificationChannel(mChannel); + // Create message/call notification channel + id = context.getString(R.string.notification_channel_id); + name = context.getString(R.string.content_title_notification); + description = context.getString(R.string.content_title_notification); + importance = NotificationManager.IMPORTANCE_HIGH; + mChannel = new NotificationChannel(id, name, importance); + mChannel.setDescription(description); mChannel.enableLights(true); mChannel.setLightColor(context.getColor(R.color.notification_color_led)); mChannel.enableLights(true); @@ -103,7 +114,7 @@ public class ApiTwentySixPlus { Notification notif; if (largeIcon != null) { - notif = new Notification.Builder(context, context.getString(R.string.notification_channel_id)) + notif = new Notification.Builder(context, context.getString(R.string.notification_service_channel_id)) .setContentTitle(title) .setContentText(message) .setSmallIcon(icon, level) @@ -114,7 +125,7 @@ public class ApiTwentySixPlus { .setPriority(priority) .build(); } else { - notif = new Notification.Builder(context, context.getString(R.string.notification_channel_id)) + notif = new Notification.Builder(context, context.getString(R.string.notification_service_channel_id)) .setContentTitle(title) .setContentText(message) .setSmallIcon(icon, level) diff --git a/submodules/linphone b/submodules/linphone index f291076f8..49540f6b6 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit f291076f8816ca634b4e815eded9786a96e9f28a +Subproject commit 49540f6b6f5ab4553f52cae7bb998ebc167baecc diff --git a/submodules/mediastreamer2 b/submodules/mediastreamer2 index b7e4901fb..016e04c87 160000 --- a/submodules/mediastreamer2 +++ b/submodules/mediastreamer2 @@ -1 +1 @@ -Subproject commit b7e4901fb8bc4b1095b5dcddd691ae288cd86d0e +Subproject commit 016e04c878d6ef3c807180ec4413aa0bac265977