Fixes from play store reported crashes

This commit is contained in:
Sylvain Berfini 2019-12-12 10:03:28 +01:00
parent f88c3e3159
commit 937b9b8503
12 changed files with 66 additions and 29 deletions

View file

@ -25,6 +25,7 @@ import android.app.Fragment;
import android.app.FragmentManager; import android.app.FragmentManager;
import android.app.FragmentTransaction; import android.app.FragmentTransaction;
import android.app.KeyguardManager; import android.app.KeyguardManager;
import android.content.ActivityNotFoundException;
import android.content.ClipData; import android.content.ClipData;
import android.content.ClipboardManager; import android.content.ClipboardManager;
import android.content.Context; import android.content.Context;
@ -550,9 +551,11 @@ public abstract class MainActivity extends LinphoneGenericActivity
if (permissions[i].equals(Manifest.permission.READ_CONTACTS) if (permissions[i].equals(Manifest.permission.READ_CONTACTS)
|| permissions[i].equals(Manifest.permission.WRITE_CONTACTS)) { || permissions[i].equals(Manifest.permission.WRITE_CONTACTS)) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
if (LinphoneContext.isReady()) {
ContactsManager.getInstance().enableContactsAccess(); ContactsManager.getInstance().enableContactsAccess();
ContactsManager.getInstance().initializeContactManager(); ContactsManager.getInstance().initializeContactManager();
} }
}
} else if (permissions[i].equals(Manifest.permission.READ_EXTERNAL_STORAGE)) { } else if (permissions[i].equals(Manifest.permission.READ_EXTERNAL_STORAGE)) {
boolean enableRingtone = grantResults[i] == PackageManager.PERMISSION_GRANTED; boolean enableRingtone = grantResults[i] == PackageManager.PERMISSION_GRANTED;
LinphonePreferences.instance().enableDeviceRingtone(enableRingtone); LinphonePreferences.instance().enableDeviceRingtone(enableRingtone);
@ -778,8 +781,13 @@ public abstract class MainActivity extends LinphoneGenericActivity
new View.OnClickListener() { new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
try {
startActivity( startActivity(
new Intent("android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS")); new Intent(
"android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS"));
} catch (ActivityNotFoundException anfe) {
Log.e("[Main Activity] Activity not found exception: ", anfe);
}
dialog.dismiss(); dialog.dismiss();
} }
}); });

View file

@ -40,6 +40,7 @@ import android.view.KeyEvent;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import org.linphone.LinphoneContext;
import org.linphone.LinphoneManager; import org.linphone.LinphoneManager;
import org.linphone.R; import org.linphone.R;
import org.linphone.compatibility.Compatibility; import org.linphone.compatibility.Compatibility;
@ -438,7 +439,7 @@ public class AndroidAudioManager {
public synchronized void bluetoothHeadetConnectionChanged(boolean connected) { public synchronized void bluetoothHeadetConnectionChanged(boolean connected) {
mIsBluetoothHeadsetConnected = connected; mIsBluetoothHeadsetConnected = connected;
mAudioManager.setBluetoothScoOn(connected); mAudioManager.setBluetoothScoOn(connected);
LinphoneManager.getCallManager().refreshInCallActions(); if (LinphoneContext.isReady()) LinphoneManager.getCallManager().refreshInCallActions();
} }
public synchronized void bluetoothHeadetAudioConnectionChanged(boolean connected) { public synchronized void bluetoothHeadetAudioConnectionChanged(boolean connected) {
@ -452,7 +453,7 @@ public class AndroidAudioManager {
public synchronized void bluetoothHeadetScoConnectionChanged(boolean connected) { public synchronized void bluetoothHeadetScoConnectionChanged(boolean connected) {
mIsBluetoothHeadsetScoConnected = connected; mIsBluetoothHeadsetScoConnected = connected;
LinphoneManager.getCallManager().refreshInCallActions(); if (LinphoneContext.isReady()) LinphoneManager.getCallManager().refreshInCallActions();
} }
public synchronized boolean isUsingBluetoothAudioRoute() { public synchronized boolean isUsingBluetoothAudioRoute() {

View file

@ -487,7 +487,7 @@ public class CallActivity extends LinphoneGenericActivity
finish(); finish();
} }
LinphoneService.instance().destroyOverlay(); if (LinphoneService.isReady()) LinphoneService.instance().destroyOverlay();
} }
@Override @Override
@ -502,7 +502,7 @@ public class CallActivity extends LinphoneGenericActivity
Call call = core.getCurrentCall(); Call call = core.getCurrentCall();
if (call.getState() == Call.State.StreamsRunning) { if (call.getState() == Call.State.StreamsRunning) {
// Prevent overlay creation if video call is paused by remote // Prevent overlay creation if video call is paused by remote
LinphoneService.instance().createOverlay(); if (LinphoneService.isReady()) LinphoneService.instance().createOverlay();
} }
} }

View file

@ -122,15 +122,8 @@ public class CallIncomingActivity extends LinphoneGenericActivity {
@Override @Override
public void onCallStateChanged( public void onCallStateChanged(
Core core, Call call, State state, String message) { 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) { if (state == State.End || state == State.Released) {
mCall = null;
finish(); finish();
} }
} }
@ -176,7 +169,7 @@ public class CallIncomingActivity extends LinphoneGenericActivity {
mNumber.setText(address.asStringUriOnly()); mNumber.setText(address.asStringUriOnly());
if (LinphonePreferences.instance().acceptIncomingEarlyMedia()) { if (LinphonePreferences.instance().acceptIncomingEarlyMedia()) {
if (mCall.getCurrentParams().videoEnabled()) { if (mCall.getCurrentParams() != null && mCall.getCurrentParams().videoEnabled()) {
findViewById(R.id.avatar_layout).setVisibility(View.GONE); findViewById(R.id.avatar_layout).setVisibility(View.GONE);
mCall.getCore().setNativeVideoWindowId(mVideoDisplay); mCall.getCore().setNativeVideoWindowId(mVideoDisplay);
} }
@ -206,7 +199,8 @@ public class CallIncomingActivity extends LinphoneGenericActivity {
@Override @Override
public boolean onKeyDown(int keyCode, KeyEvent event) { public boolean onKeyDown(int keyCode, KeyEvent event) {
if (LinphoneContext.isReady() if (LinphoneContext.isReady()
&& (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME)) { && (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME)
&& mCall != null) {
mCall.terminate(); mCall.terminate();
finish(); finish();
} }
@ -231,7 +225,7 @@ public class CallIncomingActivity extends LinphoneGenericActivity {
} }
mAlreadyAcceptedOrDeniedCall = true; mAlreadyAcceptedOrDeniedCall = true;
mCall.terminate(); if (mCall != null) mCall.terminate();
finish(); finish();
} }
@ -281,6 +275,7 @@ public class CallIncomingActivity extends LinphoneGenericActivity {
} }
if (LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests() if (LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()
&& mCall != null && mCall != null
&& mCall.getRemoteParams() != null
&& mCall.getRemoteParams().videoEnabled()) { && mCall.getRemoteParams().videoEnabled()) {
if (camera != PackageManager.PERMISSION_GRANTED) { if (camera != PackageManager.PERMISSION_GRANTED) {
Log.i("[Permission] Asking for camera"); Log.i("[Permission] Asking for camera");

View file

@ -35,6 +35,7 @@ import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import org.linphone.LinphoneContext;
import org.linphone.LinphoneManager; import org.linphone.LinphoneManager;
import org.linphone.R; import org.linphone.R;
import org.linphone.core.Call; import org.linphone.core.Call;
@ -184,10 +185,12 @@ public class CallStatusBarFragment extends Fragment {
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
if (LinphoneContext.isReady()) {
Core core = LinphoneManager.getCore(); Core core = LinphoneManager.getCore();
if (core != null) { if (core != null) {
core.removeListener(mListener); core.removeListener(mListener);
} }
}
if (mCallQualityUpdater != null) { if (mCallQualityUpdater != null) {
LinphoneUtils.removeFromUIThreadDispatcher(mCallQualityUpdater); LinphoneUtils.removeFromUIThreadDispatcher(mCallQualityUpdater);

View file

@ -43,7 +43,7 @@ class AndroidContact implements Serializable {
String mAndroidId; String mAndroidId;
private String mAndroidRawId; private String mAndroidRawId;
private boolean isAndroidRawIdLinphone; private boolean isAndroidRawIdLinphone;
private final transient ArrayList<ContentProviderOperation> mChangesToCommit; private transient ArrayList<ContentProviderOperation> mChangesToCommit;
private byte[] mTempPicture; private byte[] mTempPicture;
AndroidContact() { AndroidContact() {
@ -66,6 +66,9 @@ class AndroidContact implements Serializable {
private void addChangesToCommit(ContentProviderOperation operation) { private void addChangesToCommit(ContentProviderOperation operation) {
Log.i("[Contact] Added operation " + operation); Log.i("[Contact] Added operation " + operation);
if (mChangesToCommit == null) {
mChangesToCommit = new ArrayList<>();
}
mChangesToCommit.add(operation); mChangesToCommit.add(operation);
} }

View file

@ -222,7 +222,7 @@ public class ContactsManager extends ContentObserver
} }
public boolean hasReadContactsAccess() { public boolean hasReadContactsAccess() {
if (mContext == null) { if (mContext == null || mContext.getPackageManager() == null) {
return false; return false;
} }

View file

@ -28,6 +28,7 @@ import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.linphone.LinphoneContext;
import org.linphone.LinphoneManager; import org.linphone.LinphoneManager;
import org.linphone.R; import org.linphone.R;
import org.linphone.core.Content; import org.linphone.core.Content;
@ -162,11 +163,13 @@ public class StatusBarFragment extends Fragment {
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
if (LinphoneContext.isReady()) {
Core core = LinphoneManager.getCore(); Core core = LinphoneManager.getCore();
if (core != null) { if (core != null) {
core.removeListener(mListener); core.removeListener(mListener);
} }
} }
}
public void setMenuListener(MenuClikedListener listener) { public void setMenuListener(MenuClikedListener listener) {
mMenuListener = listener; mMenuListener = listener;

View file

@ -36,6 +36,7 @@ import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.linphone.LinphoneContext;
import org.linphone.LinphoneManager; import org.linphone.LinphoneManager;
import org.linphone.R; import org.linphone.R;
import org.linphone.activities.AboutActivity; import org.linphone.activities.AboutActivity;
@ -182,6 +183,8 @@ public class SideMenuFragment extends Fragment {
TextView address = mDefaultAccount.findViewById(R.id.main_account_address); TextView address = mDefaultAccount.findViewById(R.id.main_account_address);
TextView displayName = mDefaultAccount.findViewById(R.id.main_account_display_name); TextView displayName = mDefaultAccount.findViewById(R.id.main_account_display_name);
if (!LinphoneContext.isReady() || LinphoneManager.getCore() == null) return;
ProxyConfig proxy = LinphoneManager.getCore().getDefaultProxyConfig(); ProxyConfig proxy = LinphoneManager.getCore().getDefaultProxyConfig();
if (proxy == null) { if (proxy == null) {
displayName.setText(getString(R.string.no_account)); displayName.setText(getString(R.string.no_account));

View file

@ -42,6 +42,11 @@ public class NotificationBroadcastReceiver extends BroadcastReceiver {
final int notifId = intent.getIntExtra(Compatibility.INTENT_NOTIF_ID, 0); final int notifId = intent.getIntExtra(Compatibility.INTENT_NOTIF_ID, 0);
final String localyIdentity = intent.getStringExtra(Compatibility.INTENT_LOCAL_IDENTITY); 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) if (intent.getAction().equals(Compatibility.INTENT_REPLY_NOTIF_ACTION)
|| intent.getAction().equals(Compatibility.INTENT_MARK_AS_READ_ACTION)) { || intent.getAction().equals(Compatibility.INTENT_MARK_AS_READ_ACTION)) {
String remoteSipAddr = String remoteSipAddr =

View file

@ -20,6 +20,7 @@
package org.linphone.settings; package org.linphone.settings;
import android.Manifest; import android.Manifest;
import android.content.ActivityNotFoundException;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@ -223,8 +224,13 @@ public class CallSettingsFragment extends SettingsFragment {
new SettingListenerBase() { new SettingListenerBase() {
@Override @Override
public void onClicked() { public void onClicked() {
try {
startActivity( startActivity(
new Intent("android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS")); new Intent(
"android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS"));
} catch (ActivityNotFoundException anfe) {
Log.e("[Call Settings] Activity not found: ", anfe);
}
} }
}); });

View file

@ -189,6 +189,7 @@ public class LinphonePreferences {
// App settings // App settings
public boolean isFirstLaunch() { public boolean isFirstLaunch() {
if (getConfig() == null) return true;
return getConfig().getBool("app", "first_launch", true); return getConfig().getBool("app", "first_launch", true);
} }
@ -599,12 +600,14 @@ public class LinphonePreferences {
public String getStunServer() { public String getStunServer() {
NatPolicy nat = getOrCreateNatPolicy(); NatPolicy nat = getOrCreateNatPolicy();
if (nat == null) return null;
return nat.getStunServer(); return nat.getStunServer();
} }
public void setStunServer(String stun) { public void setStunServer(String stun) {
if (getLc() == null) return; if (getLc() == null) return;
NatPolicy nat = getOrCreateNatPolicy(); NatPolicy nat = getOrCreateNatPolicy();
if (nat == null) return;
nat.setStunServer(stun); nat.setStunServer(stun);
getLc().setNatPolicy(nat); getLc().setNatPolicy(nat);
@ -612,12 +615,14 @@ public class LinphonePreferences {
public boolean isIceEnabled() { public boolean isIceEnabled() {
NatPolicy nat = getOrCreateNatPolicy(); NatPolicy nat = getOrCreateNatPolicy();
if (nat == null) return false;
return nat.iceEnabled(); return nat.iceEnabled();
} }
public void setIceEnabled(boolean enabled) { public void setIceEnabled(boolean enabled) {
if (getLc() == null) return; if (getLc() == null) return;
NatPolicy nat = getOrCreateNatPolicy(); NatPolicy nat = getOrCreateNatPolicy();
if (nat == null) return;
nat.enableIce(enabled); nat.enableIce(enabled);
if (enabled) nat.enableStun(true); if (enabled) nat.enableStun(true);
getLc().setNatPolicy(nat); getLc().setNatPolicy(nat);
@ -625,24 +630,28 @@ public class LinphonePreferences {
public boolean isTurnEnabled() { public boolean isTurnEnabled() {
NatPolicy nat = getOrCreateNatPolicy(); NatPolicy nat = getOrCreateNatPolicy();
if (nat == null) return false;
return nat.turnEnabled(); return nat.turnEnabled();
} }
public void setTurnEnabled(boolean enabled) { public void setTurnEnabled(boolean enabled) {
if (getLc() == null) return; if (getLc() == null) return;
NatPolicy nat = getOrCreateNatPolicy(); NatPolicy nat = getOrCreateNatPolicy();
if (nat == null) return;
nat.enableTurn(enabled); nat.enableTurn(enabled);
getLc().setNatPolicy(nat); getLc().setNatPolicy(nat);
} }
public String getTurnUsername() { public String getTurnUsername() {
NatPolicy nat = getOrCreateNatPolicy(); NatPolicy nat = getOrCreateNatPolicy();
if (nat == null) return null;
return nat.getStunServerUsername(); return nat.getStunServerUsername();
} }
public void setTurnUsername(String username) { public void setTurnUsername(String username) {
if (getLc() == null) return; if (getLc() == null) return;
NatPolicy nat = getOrCreateNatPolicy(); NatPolicy nat = getOrCreateNatPolicy();
if (nat == null) return;
AuthInfo authInfo = getLc().findAuthInfo(null, nat.getStunServerUsername(), null); AuthInfo authInfo = getLc().findAuthInfo(null, nat.getStunServerUsername(), null);
if (authInfo != null) { if (authInfo != null) {
@ -663,6 +672,7 @@ public class LinphonePreferences {
public void setTurnPassword(String password) { public void setTurnPassword(String password) {
if (getLc() == null) return; if (getLc() == null) return;
NatPolicy nat = getOrCreateNatPolicy(); NatPolicy nat = getOrCreateNatPolicy();
if (nat == null) return;
AuthInfo authInfo = getLc().findAuthInfo(null, nat.getStunServerUsername(), null); AuthInfo authInfo = getLc().findAuthInfo(null, nat.getStunServerUsername(), null);
if (authInfo != null) { if (authInfo != null) {