From 937b9b8503ce921e891a1f64f355f6578e994141 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 12 Dec 2019 10:03:28 +0100 Subject: [PATCH] Fixes from play store reported crashes --- .../org/linphone/activities/MainActivity.java | 16 ++++++++++++---- .../org/linphone/call/AndroidAudioManager.java | 5 +++-- .../java/org/linphone/call/CallActivity.java | 4 ++-- .../org/linphone/call/CallIncomingActivity.java | 17 ++++++----------- .../linphone/call/CallStatusBarFragment.java | 9 ++++++--- .../org/linphone/contacts/AndroidContact.java | 5 ++++- .../org/linphone/contacts/ContactsManager.java | 2 +- .../linphone/fragments/StatusBarFragment.java | 9 ++++++--- .../org/linphone/menu/SideMenuFragment.java | 3 +++ .../NotificationBroadcastReceiver.java | 5 +++++ .../linphone/settings/CallSettingsFragment.java | 10 ++++++++-- .../linphone/settings/LinphonePreferences.java | 10 ++++++++++ 12 files changed, 66 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/MainActivity.java b/app/src/main/java/org/linphone/activities/MainActivity.java index 759cfc2de..a169abc9f 100644 --- a/app/src/main/java/org/linphone/activities/MainActivity.java +++ b/app/src/main/java/org/linphone/activities/MainActivity.java @@ -25,6 +25,7 @@ import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.app.KeyguardManager; +import android.content.ActivityNotFoundException; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; @@ -550,8 +551,10 @@ public abstract class MainActivity extends LinphoneGenericActivity if (permissions[i].equals(Manifest.permission.READ_CONTACTS) || permissions[i].equals(Manifest.permission.WRITE_CONTACTS)) { if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { - ContactsManager.getInstance().enableContactsAccess(); - ContactsManager.getInstance().initializeContactManager(); + if (LinphoneContext.isReady()) { + ContactsManager.getInstance().enableContactsAccess(); + ContactsManager.getInstance().initializeContactManager(); + } } } else if (permissions[i].equals(Manifest.permission.READ_EXTERNAL_STORAGE)) { boolean enableRingtone = grantResults[i] == PackageManager.PERMISSION_GRANTED; @@ -778,8 +781,13 @@ public abstract class MainActivity extends LinphoneGenericActivity new View.OnClickListener() { @Override public void onClick(View v) { - startActivity( - new Intent("android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS")); + try { + startActivity( + new Intent( + "android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS")); + } catch (ActivityNotFoundException anfe) { + Log.e("[Main Activity] Activity not found exception: ", anfe); + } dialog.dismiss(); } }); diff --git a/app/src/main/java/org/linphone/call/AndroidAudioManager.java b/app/src/main/java/org/linphone/call/AndroidAudioManager.java index 0bc609fe4..2e5ec00cb 100644 --- a/app/src/main/java/org/linphone/call/AndroidAudioManager.java +++ b/app/src/main/java/org/linphone/call/AndroidAudioManager.java @@ -40,6 +40,7 @@ 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; @@ -438,7 +439,7 @@ public class AndroidAudioManager { public synchronized void bluetoothHeadetConnectionChanged(boolean connected) { mIsBluetoothHeadsetConnected = connected; mAudioManager.setBluetoothScoOn(connected); - LinphoneManager.getCallManager().refreshInCallActions(); + if (LinphoneContext.isReady()) LinphoneManager.getCallManager().refreshInCallActions(); } public synchronized void bluetoothHeadetAudioConnectionChanged(boolean connected) { @@ -452,7 +453,7 @@ public class AndroidAudioManager { public synchronized void bluetoothHeadetScoConnectionChanged(boolean connected) { mIsBluetoothHeadsetScoConnected = connected; - LinphoneManager.getCallManager().refreshInCallActions(); + if (LinphoneContext.isReady()) LinphoneManager.getCallManager().refreshInCallActions(); } public synchronized boolean isUsingBluetoothAudioRoute() { diff --git a/app/src/main/java/org/linphone/call/CallActivity.java b/app/src/main/java/org/linphone/call/CallActivity.java index c3fdf5b65..bef10c1c4 100644 --- a/app/src/main/java/org/linphone/call/CallActivity.java +++ b/app/src/main/java/org/linphone/call/CallActivity.java @@ -487,7 +487,7 @@ public class CallActivity extends LinphoneGenericActivity finish(); } - LinphoneService.instance().destroyOverlay(); + if (LinphoneService.isReady()) LinphoneService.instance().destroyOverlay(); } @Override @@ -502,7 +502,7 @@ public class CallActivity extends LinphoneGenericActivity Call call = core.getCurrentCall(); if (call.getState() == Call.State.StreamsRunning) { // Prevent overlay creation if video call is paused by remote - LinphoneService.instance().createOverlay(); + if (LinphoneService.isReady()) LinphoneService.instance().createOverlay(); } } diff --git a/app/src/main/java/org/linphone/call/CallIncomingActivity.java b/app/src/main/java/org/linphone/call/CallIncomingActivity.java index a21d50187..c3696ce38 100644 --- a/app/src/main/java/org/linphone/call/CallIncomingActivity.java +++ b/app/src/main/java/org/linphone/call/CallIncomingActivity.java @@ -122,15 +122,8 @@ public class CallIncomingActivity extends LinphoneGenericActivity { @Override public void onCallStateChanged( Core core, Call call, State state, String message) { - if (call == mCall) { - if (state == State.Connected) { - // This is done by the LinphoneContext listener now - // startActivity(new Intent(CallOutgoingActivity.this, - // CallActivity.class)); - } - } - if (state == State.End || state == State.Released) { + mCall = null; finish(); } } @@ -176,7 +169,7 @@ public class CallIncomingActivity extends LinphoneGenericActivity { mNumber.setText(address.asStringUriOnly()); if (LinphonePreferences.instance().acceptIncomingEarlyMedia()) { - if (mCall.getCurrentParams().videoEnabled()) { + if (mCall.getCurrentParams() != null && mCall.getCurrentParams().videoEnabled()) { findViewById(R.id.avatar_layout).setVisibility(View.GONE); mCall.getCore().setNativeVideoWindowId(mVideoDisplay); } @@ -206,7 +199,8 @@ public class CallIncomingActivity extends LinphoneGenericActivity { @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (LinphoneContext.isReady() - && (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME)) { + && (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME) + && mCall != null) { mCall.terminate(); finish(); } @@ -231,7 +225,7 @@ public class CallIncomingActivity extends LinphoneGenericActivity { } mAlreadyAcceptedOrDeniedCall = true; - mCall.terminate(); + if (mCall != null) mCall.terminate(); finish(); } @@ -281,6 +275,7 @@ public class CallIncomingActivity extends LinphoneGenericActivity { } if (LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests() && mCall != null + && mCall.getRemoteParams() != null && mCall.getRemoteParams().videoEnabled()) { if (camera != PackageManager.PERMISSION_GRANTED) { Log.i("[Permission] Asking for camera"); diff --git a/app/src/main/java/org/linphone/call/CallStatusBarFragment.java b/app/src/main/java/org/linphone/call/CallStatusBarFragment.java index 16e6180b5..0724c3ae5 100644 --- a/app/src/main/java/org/linphone/call/CallStatusBarFragment.java +++ b/app/src/main/java/org/linphone/call/CallStatusBarFragment.java @@ -35,6 +35,7 @@ import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import androidx.core.content.ContextCompat; +import org.linphone.LinphoneContext; import org.linphone.LinphoneManager; import org.linphone.R; import org.linphone.core.Call; @@ -184,9 +185,11 @@ public class CallStatusBarFragment extends Fragment { public void onPause() { super.onPause(); - Core core = LinphoneManager.getCore(); - if (core != null) { - core.removeListener(mListener); + if (LinphoneContext.isReady()) { + Core core = LinphoneManager.getCore(); + if (core != null) { + core.removeListener(mListener); + } } if (mCallQualityUpdater != null) { diff --git a/app/src/main/java/org/linphone/contacts/AndroidContact.java b/app/src/main/java/org/linphone/contacts/AndroidContact.java index fba283b2c..0470a72d9 100644 --- a/app/src/main/java/org/linphone/contacts/AndroidContact.java +++ b/app/src/main/java/org/linphone/contacts/AndroidContact.java @@ -43,7 +43,7 @@ class AndroidContact implements Serializable { String mAndroidId; private String mAndroidRawId; private boolean isAndroidRawIdLinphone; - private final transient ArrayList mChangesToCommit; + private transient ArrayList mChangesToCommit; private byte[] mTempPicture; AndroidContact() { @@ -66,6 +66,9 @@ class AndroidContact implements Serializable { private void addChangesToCommit(ContentProviderOperation operation) { Log.i("[Contact] Added operation " + operation); + if (mChangesToCommit == null) { + mChangesToCommit = new ArrayList<>(); + } mChangesToCommit.add(operation); } diff --git a/app/src/main/java/org/linphone/contacts/ContactsManager.java b/app/src/main/java/org/linphone/contacts/ContactsManager.java index 1cedbcf05..4163b1a21 100644 --- a/app/src/main/java/org/linphone/contacts/ContactsManager.java +++ b/app/src/main/java/org/linphone/contacts/ContactsManager.java @@ -222,7 +222,7 @@ public class ContactsManager extends ContentObserver } public boolean hasReadContactsAccess() { - if (mContext == null) { + if (mContext == null || mContext.getPackageManager() == null) { return false; } diff --git a/app/src/main/java/org/linphone/fragments/StatusBarFragment.java b/app/src/main/java/org/linphone/fragments/StatusBarFragment.java index 9c7e53bb6..8b498b4a7 100644 --- a/app/src/main/java/org/linphone/fragments/StatusBarFragment.java +++ b/app/src/main/java/org/linphone/fragments/StatusBarFragment.java @@ -28,6 +28,7 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import org.linphone.LinphoneContext; import org.linphone.LinphoneManager; import org.linphone.R; import org.linphone.core.Content; @@ -162,9 +163,11 @@ public class StatusBarFragment extends Fragment { public void onPause() { super.onPause(); - Core core = LinphoneManager.getCore(); - if (core != null) { - core.removeListener(mListener); + if (LinphoneContext.isReady()) { + Core core = LinphoneManager.getCore(); + if (core != null) { + core.removeListener(mListener); + } } } diff --git a/app/src/main/java/org/linphone/menu/SideMenuFragment.java b/app/src/main/java/org/linphone/menu/SideMenuFragment.java index 7e6eabec4..059ce4087 100644 --- a/app/src/main/java/org/linphone/menu/SideMenuFragment.java +++ b/app/src/main/java/org/linphone/menu/SideMenuFragment.java @@ -36,6 +36,7 @@ import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.Fragment; import java.util.ArrayList; import java.util.List; +import org.linphone.LinphoneContext; import org.linphone.LinphoneManager; import org.linphone.R; import org.linphone.activities.AboutActivity; @@ -182,6 +183,8 @@ public class SideMenuFragment extends Fragment { TextView address = mDefaultAccount.findViewById(R.id.main_account_address); TextView displayName = mDefaultAccount.findViewById(R.id.main_account_display_name); + if (!LinphoneContext.isReady() || LinphoneManager.getCore() == null) return; + ProxyConfig proxy = LinphoneManager.getCore().getDefaultProxyConfig(); if (proxy == null) { displayName.setText(getString(R.string.no_account)); diff --git a/app/src/main/java/org/linphone/notifications/NotificationBroadcastReceiver.java b/app/src/main/java/org/linphone/notifications/NotificationBroadcastReceiver.java index 0ca8f1dc7..5d3fbc6a6 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationBroadcastReceiver.java +++ b/app/src/main/java/org/linphone/notifications/NotificationBroadcastReceiver.java @@ -42,6 +42,11 @@ public class NotificationBroadcastReceiver extends BroadcastReceiver { final int notifId = intent.getIntExtra(Compatibility.INTENT_NOTIF_ID, 0); final String localyIdentity = intent.getStringExtra(Compatibility.INTENT_LOCAL_IDENTITY); + if (!LinphoneContext.isReady()) { + Log.e("[Notification Broadcast Receiver] Context not ready, aborting..."); + return; + } + if (intent.getAction().equals(Compatibility.INTENT_REPLY_NOTIF_ACTION) || intent.getAction().equals(Compatibility.INTENT_MARK_AS_READ_ACTION)) { String remoteSipAddr = diff --git a/app/src/main/java/org/linphone/settings/CallSettingsFragment.java b/app/src/main/java/org/linphone/settings/CallSettingsFragment.java index 597af0fc1..743c5dcc3 100644 --- a/app/src/main/java/org/linphone/settings/CallSettingsFragment.java +++ b/app/src/main/java/org/linphone/settings/CallSettingsFragment.java @@ -20,6 +20,7 @@ package org.linphone.settings; import android.Manifest; +import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -223,8 +224,13 @@ public class CallSettingsFragment extends SettingsFragment { new SettingListenerBase() { @Override public void onClicked() { - startActivity( - new Intent("android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS")); + try { + startActivity( + new Intent( + "android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS")); + } catch (ActivityNotFoundException anfe) { + Log.e("[Call Settings] Activity not found: ", anfe); + } } }); diff --git a/app/src/main/java/org/linphone/settings/LinphonePreferences.java b/app/src/main/java/org/linphone/settings/LinphonePreferences.java index db442941d..a3b7b9af5 100644 --- a/app/src/main/java/org/linphone/settings/LinphonePreferences.java +++ b/app/src/main/java/org/linphone/settings/LinphonePreferences.java @@ -189,6 +189,7 @@ public class LinphonePreferences { // App settings public boolean isFirstLaunch() { + if (getConfig() == null) return true; return getConfig().getBool("app", "first_launch", true); } @@ -599,12 +600,14 @@ public class LinphonePreferences { public String getStunServer() { NatPolicy nat = getOrCreateNatPolicy(); + if (nat == null) return null; return nat.getStunServer(); } public void setStunServer(String stun) { if (getLc() == null) return; NatPolicy nat = getOrCreateNatPolicy(); + if (nat == null) return; nat.setStunServer(stun); getLc().setNatPolicy(nat); @@ -612,12 +615,14 @@ public class LinphonePreferences { public boolean isIceEnabled() { NatPolicy nat = getOrCreateNatPolicy(); + if (nat == null) return false; return nat.iceEnabled(); } public void setIceEnabled(boolean enabled) { if (getLc() == null) return; NatPolicy nat = getOrCreateNatPolicy(); + if (nat == null) return; nat.enableIce(enabled); if (enabled) nat.enableStun(true); getLc().setNatPolicy(nat); @@ -625,24 +630,28 @@ public class LinphonePreferences { public boolean isTurnEnabled() { NatPolicy nat = getOrCreateNatPolicy(); + if (nat == null) return false; return nat.turnEnabled(); } public void setTurnEnabled(boolean enabled) { if (getLc() == null) return; NatPolicy nat = getOrCreateNatPolicy(); + if (nat == null) return; nat.enableTurn(enabled); getLc().setNatPolicy(nat); } public String getTurnUsername() { NatPolicy nat = getOrCreateNatPolicy(); + if (nat == null) return null; return nat.getStunServerUsername(); } public void setTurnUsername(String username) { if (getLc() == null) return; NatPolicy nat = getOrCreateNatPolicy(); + if (nat == null) return; AuthInfo authInfo = getLc().findAuthInfo(null, nat.getStunServerUsername(), null); if (authInfo != null) { @@ -663,6 +672,7 @@ public class LinphonePreferences { public void setTurnPassword(String password) { if (getLc() == null) return; NatPolicy nat = getOrCreateNatPolicy(); + if (nat == null) return; AuthInfo authInfo = getLc().findAuthInfo(null, nat.getStunServerUsername(), null); if (authInfo != null) {