diff options
author | twyen <twyen@google.com> | 2017-10-06 16:35:54 -0700 |
---|---|---|
committer | Eric Erfanian <erfanian@google.com> | 2017-10-09 08:41:07 -0700 |
commit | 8efb49584f732014076390093ad90e23dce2e3ba (patch) | |
tree | 109b16036e6ca27d5fe8d1fb3bc4373ed64cdb03 /java/com/android/incallui/InCallPresenter.java | |
parent | 30842b209934a98a0220673e2ab6b4bf500c15d3 (diff) |
Implement InCallUiLock
When any locks are acquired, the InCallActivity will not auto-finish when there are no active calls. The disconnected cause and reject with SMS dialogs are migrated to use this API, which prevents the activity form ending before the user has finished interacting with the dialogs.
Bug: 64215256
Test: InCallPresenterTest
PiperOrigin-RevId: 171362338
Change-Id: Ied07ebbf6bee056ea6b2314c57f3324561b1651a
Diffstat (limited to 'java/com/android/incallui/InCallPresenter.java')
-rw-r--r-- | java/com/android/incallui/InCallPresenter.java | 78 |
1 files changed, 65 insertions, 13 deletions
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java index 4cc03f3dd..a0069a629 100644 --- a/java/com/android/incallui/InCallPresenter.java +++ b/java/com/android/incallui/InCallPresenter.java @@ -22,6 +22,7 @@ import android.graphics.Point; import android.os.Bundle; import android.os.Handler; import android.os.Trace; +import android.support.annotation.MainThread; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; @@ -34,6 +35,7 @@ import android.telecom.TelecomManager; import android.telecom.VideoProfile; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; +import android.util.ArraySet; import android.view.Window; import android.view.WindowManager; import com.android.contacts.common.compat.CallCompat; @@ -41,6 +43,7 @@ import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler; import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener; import com.android.dialer.blocking.FilteredNumberCompat; import com.android.dialer.blocking.FilteredNumbersUtil; +import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; import com.android.dialer.common.concurrent.DefaultDialerExecutorFactory; import com.android.dialer.enrichedcall.EnrichedCallComponent; @@ -57,6 +60,7 @@ import com.android.incallui.call.DialerCall; import com.android.incallui.call.ExternalCallList; import com.android.incallui.call.TelecomAdapter; import com.android.incallui.disconnectdialog.DisconnectMessage; +import com.android.incallui.incalluilock.InCallUiLock; import com.android.incallui.latencyreport.LatencyReport; import com.android.incallui.legacyblocking.BlockedNumberContentObserver; import com.android.incallui.spam.SpamCallListListener; @@ -1190,18 +1194,6 @@ public class InCallPresenter implements CallList.Listener { return true; } - /** - * A dialog could have prevented in-call screen from being previously finished. This function - * checks to see if there should be any UI left and if not attempts to tear down the UI. - */ - public void onDismissDialog() { - LogUtil.i("InCallPresenter.onDismissDialog", "Dialog dismissed"); - if (mInCallState == InCallState.NO_CALLS) { - attemptFinishActivity(); - attemptCleanup(); - } - } - /** Clears the previous fullscreen state. */ public void clearFullscreen() { mIsFullScreen = false; @@ -1491,7 +1483,10 @@ public class InCallPresenter implements CallList.Listener { mOrientationListeners.clear(); mInCallEventListeners.clear(); mInCallUiListeners.clear(); - + if (!mInCallUiLocks.isEmpty()) { + LogUtil.e("InCallPresenter.attemptCleanup", "held in call locks: " + mInCallUiLocks); + mInCallUiLocks.clear(); + } LogUtil.d("InCallPresenter.attemptCleanup", "finished"); } } @@ -1784,4 +1779,61 @@ public class InCallPresenter implements CallList.Listener { void onUiShowing(boolean showing); } + + private class InCallUiLockImpl implements InCallUiLock { + private final String tag; + + private InCallUiLockImpl(String tag) { + this.tag = tag; + } + + @MainThread + @Override + public void release() { + Assert.isMainThread(); + releaseInCallUiLock(InCallUiLockImpl.this); + } + + @Override + public String toString() { + return "InCallUiLock[" + tag + "]"; + } + } + + @MainThread + public InCallUiLock acquireInCallUiLock(String tag) { + Assert.isMainThread(); + InCallUiLock lock = new InCallUiLockImpl(tag); + mInCallUiLocks.add(lock); + return lock; + } + + @MainThread + private void releaseInCallUiLock(InCallUiLock lock) { + Assert.isMainThread(); + LogUtil.i("InCallPresenter.releaseInCallUiLock", "releasing %s", lock); + mInCallUiLocks.remove(lock); + if (mInCallUiLocks.isEmpty()) { + LogUtil.i("InCallPresenter.releaseInCallUiLock", "all locks released"); + if (mInCallState == InCallState.NO_CALLS) { + LogUtil.i("InCallPresenter.releaseInCallUiLock", "no more calls, finishing UI"); + attemptFinishActivity(); + attemptCleanup(); + } + } + } + + @MainThread + public boolean isInCallUiLocked() { + Assert.isMainThread(); + if (mInCallUiLocks.isEmpty()) { + return false; + } + for (InCallUiLock lock : mInCallUiLocks) { + LogUtil.i("InCallPresenter.isInCallUiLocked", "still locked by %s", lock); + } + return true; + } + + private final Set<InCallUiLock> mInCallUiLocks = new ArraySet<>(); } |