From 44259e5c1080978d4493276f0056e0f690ec53f0 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 14 Mar 2019 12:46:29 +0100 Subject: [PATCH] Fixed infinite loop of LinphoneActivity stop/start when screen is locked and incoming call is hung up by remote --- .../java/org/linphone/LinphoneActivity.java | 42 ++----------------- .../java/org/linphone/LinphoneManager.java | 10 ----- .../java/org/linphone/LinphoneService.java | 18 +++++--- .../java/org/linphone/call/CallActivity.java | 6 +-- .../linphone/call/CallIncomingActivity.java | 12 ++---- .../linphone/call/CallOutgoingActivity.java | 7 ---- .../linphone/chat/ChatMessagesAdapter.java | 3 +- .../settings/LinphonePreferences.java | 3 +- .../java/org/linphone/utils/IntentUtils.java | 7 +--- 9 files changed, 26 insertions(+), 82 deletions(-) diff --git a/app/src/main/java/org/linphone/LinphoneActivity.java b/app/src/main/java/org/linphone/LinphoneActivity.java index 0e5c8ee0a..11dc1904e 100644 --- a/app/src/main/java/org/linphone/LinphoneActivity.java +++ b/app/src/main/java/org/linphone/LinphoneActivity.java @@ -65,7 +65,6 @@ import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; -import java.util.Collection; import java.util.Date; import java.util.List; import org.linphone.LinphoneManager.AddressType; @@ -279,10 +278,7 @@ public class LinphoneActivity extends LinphoneGenericActivity public void onCallStateChanged( Core lc, Call call, Call.State state, String message) { if (state == State.IncomingReceived) { - startActivity( - new Intent( - LinphoneActivity.instance(), - CallIncomingActivity.class)); + // This case will be handled by the service listener } else if (state == State.OutgoingInit || state == State.OutgoingProgress) { startActivity( new Intent( @@ -1472,21 +1468,6 @@ public class LinphoneActivity extends LinphoneGenericActivity sInstance = null; super.onDestroy(); - - unbindDrawables(findViewById(R.id.topLayout)); - System.gc(); - } - - private void unbindDrawables(View view) { - if (view != null && view.getBackground() != null) { - view.getBackground().setCallback(null); - } - if (view instanceof ViewGroup && !(view instanceof AdapterView)) { - for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { - unbindDrawables(((ViewGroup) view).getChildAt(i)); - } - ((ViewGroup) view).removeAllViews(); - } } @Override @@ -1528,12 +1509,8 @@ public class LinphoneActivity extends LinphoneGenericActivity startIncallActivity(); } } else if (extras.getBoolean("StartCall", false)) { - if (CallActivity.isInstanciated()) { - CallActivity.instance().startIncomingCallActivity(); - } else { - addressWaitingToBeCalled = extras.getString("NumberToCall"); - goToDialerFragment(); - } + addressWaitingToBeCalled = extras.getString("NumberToCall"); + goToDialerFragment(); } else if (extras.getBoolean("Transfer", false)) { intent.putExtra("DoNotGoToCallActivity", true); } else if (extras.getBoolean("AddCall", false)) { @@ -1577,19 +1554,6 @@ public class LinphoneActivity extends LinphoneGenericActivity } } setIntent(intent); - - if (LinphoneManager.getLc().getCalls().length > 0) { - // If a call is ringing, start incomingcallactivity - Collection incoming = new ArrayList<>(); - incoming.add(Call.State.IncomingReceived); - if (LinphoneUtils.getCallsInState(LinphoneManager.getLc(), incoming).size() > 0) { - if (CallActivity.isInstanciated()) { - CallActivity.instance().startIncomingCallActivity(); - } else { - startActivity(new Intent(this, CallIncomingActivity.class)); - } - } - } } public boolean isOnBackground() { diff --git a/app/src/main/java/org/linphone/LinphoneManager.java b/app/src/main/java/org/linphone/LinphoneManager.java index 8cbed93c8..6272704df 100644 --- a/app/src/main/java/org/linphone/LinphoneManager.java +++ b/app/src/main/java/org/linphone/LinphoneManager.java @@ -1419,16 +1419,6 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou } } - public boolean hasLinphoneAccount() { - for (ProxyConfig proxyConfig : mCore.getProxyConfigList()) { - if (getString(R.string.default_domain) - .equals(proxyConfig.getIdentityAddress().getDomain())) { - return true; - } - } - return false; - } - /** @return false if already in video call. */ public boolean addVideo() { Call call = mCore.getCurrentCall(); diff --git a/app/src/main/java/org/linphone/LinphoneService.java b/app/src/main/java/org/linphone/LinphoneService.java index d87e4898d..dc2760bbf 100644 --- a/app/src/main/java/org/linphone/LinphoneService.java +++ b/app/src/main/java/org/linphone/LinphoneService.java @@ -22,6 +22,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import android.app.Activity; import android.app.Application; import android.app.Service; +import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; @@ -29,9 +30,11 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; +import android.os.PowerManager; import android.provider.ContactsContract; import android.view.WindowManager; import java.util.ArrayList; +import org.linphone.call.CallIncomingActivity; import org.linphone.contacts.ContactsManager; import org.linphone.core.Call; import org.linphone.core.Call.State; @@ -82,7 +85,7 @@ public final class LinphoneService extends Service { private Application.ActivityLifecycleCallbacks mActivityCallbacks; private NotificationsManager mNotificationManager; private String mIncomingReceivedActivityName; - private Class mIncomingReceivedActivity = LinphoneActivity.class; + private Class mIncomingReceivedActivity = CallIncomingActivity.class; private LoggingServiceListener mJavaLoggingService = new LoggingServiceListener() { @@ -429,10 +432,15 @@ public final class LinphoneService extends Service { private void onIncomingReceived() { // wakeup linphone - startActivity( - new Intent() - .setClass(this, mIncomingReceivedActivity) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + + PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); + Intent intent = new Intent().setClass(this, mIncomingReceivedActivity); + if (!pm.isInteractive()) { + // This is to workaround an infinite loop of pause/start in LinphoneActivity issue + // if incoming call is being stopped by caller while screen if off and locked + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); + } + startActivity(intent); } /*Believe me or not, but knowing the application visibility state on Android is a nightmare. diff --git a/app/src/main/java/org/linphone/call/CallActivity.java b/app/src/main/java/org/linphone/call/CallActivity.java index 71aca8b5f..8c98898f5 100644 --- a/app/src/main/java/org/linphone/call/CallActivity.java +++ b/app/src/main/java/org/linphone/call/CallActivity.java @@ -210,7 +210,7 @@ public class CallActivity extends LinphoneGenericActivity } if (state == State.IncomingReceived) { - startIncomingCallActivity(); + // This scenario will be handled by the Service listener return; } else if (state == State.Paused || state == State.PausedByRemote @@ -1190,10 +1190,6 @@ public class CallActivity extends LinphoneGenericActivity LinphoneManager.getLc().acceptCallUpdate(call, params); } - public void startIncomingCallActivity() { - startActivity(new Intent(this, CallIncomingActivity.class)); - } - private void hideStatusBar() { if (isTablet()) { return; diff --git a/app/src/main/java/org/linphone/call/CallIncomingActivity.java b/app/src/main/java/org/linphone/call/CallIncomingActivity.java index cc5d0c9c7..ae6f83bc6 100644 --- a/app/src/main/java/org/linphone/call/CallIncomingActivity.java +++ b/app/src/main/java/org/linphone/call/CallIncomingActivity.java @@ -80,19 +80,15 @@ public class CallIncomingActivity extends LinphoneGenericActivity { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + getWindow() + .addFlags( + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); setContentView(R.layout.call_incoming); mName = findViewById(R.id.contact_name); mNumber = findViewById(R.id.contact_number); - // set this flag so this activity will stay in front of the keyguard - int flags = - WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED - | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD - | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON; - getWindow().addFlags(flags); - mAccept = findViewById(R.id.answer_button); mDecline = findViewById(R.id.decline_button); mAcceptIcon = findViewById(R.id.acceptIcon); diff --git a/app/src/main/java/org/linphone/call/CallOutgoingActivity.java b/app/src/main/java/org/linphone/call/CallOutgoingActivity.java index c3fc8ccb8..398e4bfdb 100644 --- a/app/src/main/java/org/linphone/call/CallOutgoingActivity.java +++ b/app/src/main/java/org/linphone/call/CallOutgoingActivity.java @@ -81,13 +81,6 @@ public class CallOutgoingActivity extends LinphoneGenericActivity implements OnC mSpeaker = findViewById(R.id.speaker); mSpeaker.setOnClickListener(this); - // set this flag so this activity will stay in front of the keyguard - int flags = - WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED - | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD - | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON; - getWindow().addFlags(flags); - mHangUp = findViewById(R.id.outgoing_hang_up); mHangUp.setOnClickListener(this); diff --git a/app/src/main/java/org/linphone/chat/ChatMessagesAdapter.java b/app/src/main/java/org/linphone/chat/ChatMessagesAdapter.java index e5505016b..95eb0b0df 100644 --- a/app/src/main/java/org/linphone/chat/ChatMessagesAdapter.java +++ b/app/src/main/java/org/linphone/chat/ChatMessagesAdapter.java @@ -322,7 +322,8 @@ public class ChatMessagesAdapter extends SelectableAdapter= 0 && position < mHistory.size() - 1 + if (position >= 0 + && position < mHistory.size() - 1 && mContext.getResources() .getBoolean(R.bool.lower_space_between_chat_bubbles_if_same_person)) { EventLog nextEvent = (EventLog) getItem(position + 1); diff --git a/app/src/main/java/org/linphone/settings/LinphonePreferences.java b/app/src/main/java/org/linphone/settings/LinphonePreferences.java index e5a006fb0..15b73f40e 100644 --- a/app/src/main/java/org/linphone/settings/LinphonePreferences.java +++ b/app/src/main/java/org/linphone/settings/LinphonePreferences.java @@ -1310,7 +1310,8 @@ public class LinphonePreferences { public String getActivityToLaunchOnIncomingReceived() { return getConfig() - .getString("app", "incoming_call_activity", "org.linphone.LinphoneActivity"); + .getString( + "app", "incoming_call_activity", "org.linphone.call.CallIncomingActivity"); } public void setActivityToLaunchOnIncomingReceived(String name) { diff --git a/app/src/main/java/org/linphone/utils/IntentUtils.java b/app/src/main/java/org/linphone/utils/IntentUtils.java index 28c660185..6bb9a661e 100644 --- a/app/src/main/java/org/linphone/utils/IntentUtils.java +++ b/app/src/main/java/org/linphone/utils/IntentUtils.java @@ -25,7 +25,6 @@ import android.net.Uri; import java.util.ArrayList; import org.linphone.LinphoneActivity; import org.linphone.LinphoneManager; -import org.linphone.call.CallActivity; import org.linphone.contacts.ContactsManager; import org.linphone.core.tools.Log; @@ -71,11 +70,7 @@ public class IntentUtils { && (intent.getStringExtra("NumberToCall") != null)) { String numberToCall = intent.getStringExtra("NumberToCall"); Log.i("[Intent Utils] ACTION_CALL_LINPHONE with number: " + numberToCall); - if (CallActivity.isInstanciated()) { - CallActivity.instance().startIncomingCallActivity(); - } else { - LinphoneManager.getInstance().newOutgoingCall(numberToCall, null); - } + LinphoneManager.getInstance().newOutgoingCall(numberToCall, null); } else if (Intent.ACTION_CALL.equals(action)) { if (intent.getData() != null) { addressToCall = intent.getData().toString();