From 2917b1f0d7cd219d8a9d51d5d8606f4d5074c307 Mon Sep 17 00:00:00 2001 From: Jonathan Scott Date: Mon, 29 Apr 2019 18:03:58 +0100 Subject: [PATCH 1/7] [RESTRICT AUTOMERGE] Make LockTaskController default behaviour match ScreenPinningSettings. Fixes: 127605586 Test: atest LockTaskControllerTest Change-Id: I7d4c53fd6740f500d1a0ce18b47b83ed895300a5 (cherry picked from commit 5d6c1e8f451a920695e92fd321bbffe9c75f9aaa) --- .../android/server/am/LockTaskController.java | 24 +++--- .../server/am/LockTaskControllerTest.java | 78 ++++++++++++++++++- 2 files changed, 91 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/am/LockTaskController.java b/services/core/java/com/android/server/am/LockTaskController.java index 151ef4942432f..ab67b8a3f534d 100644 --- a/services/core/java/com/android/server/am/LockTaskController.java +++ b/services/core/java/com/android/server/am/LockTaskController.java @@ -777,18 +777,24 @@ public class LockTaskController { * leaves the pinned mode. */ private void lockKeyguardIfNeeded() { + if (shouldLockKeyguard()) { + mWindowManager.lockNow(null); + mWindowManager.dismissKeyguard(null /* callback */, null /* message */); + getLockPatternUtils().requireCredentialEntry(USER_ALL); + } + } + + private boolean shouldLockKeyguard() { + // This functionality should be kept consistent with + // com.android.settings.security.ScreenPinningSettings (see b/127605586) try { - boolean shouldLockKeyguard = Settings.Secure.getIntForUser( + return Settings.Secure.getIntForUser( mContext.getContentResolver(), - Settings.Secure.LOCK_TO_APP_EXIT_LOCKED, - USER_CURRENT) != 0; - if (shouldLockKeyguard) { - mWindowManager.lockNow(null); - mWindowManager.dismissKeyguard(null /* callback */, null /* message */); - getLockPatternUtils().requireCredentialEntry(USER_ALL); - } + Settings.Secure.LOCK_TO_APP_EXIT_LOCKED, USER_CURRENT) != 0; } catch (Settings.SettingNotFoundException e) { - // No setting, don't lock. + // Log to SafetyNet for b/127605586 + android.util.EventLog.writeEvent(0x534e4554, "127605586", -1, ""); + return mLockPatternUtils.isSecure(USER_CURRENT); } } diff --git a/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java b/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java index f46d712df65b2..35aa491885645 100644 --- a/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java @@ -389,7 +389,7 @@ public class LockTaskControllerTest { mLockTaskController.startLockTaskMode(tr1, false, TEST_UID); mLockTaskController.startLockTaskMode(tr2, false, TEST_UID); - // WHEN calling stopLockTaskMode on the root task + // WHEN calling clearLockedTasks on the root task mLockTaskController.clearLockedTasks("testClearLockedTasks"); // THEN the lock task mode should be inactive @@ -403,7 +403,81 @@ public class LockTaskControllerTest { } @Test - public void testUpdateLockTaskPackages() throws Exception { + public void testClearLockedTasks_noLockSetting_noPassword_deviceIsUnlocked() throws Exception { + // GIVEN There is no setting set for LOCK_TO_APP_EXIT_LOCKED + Settings.Secure.clearProviderForTest(); + + // AND no password is set + when(mLockPatternUtils.getKeyguardStoredPasswordQuality(anyInt())) + .thenReturn(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED); + + // AND there is a task record + TaskRecord tr1 = getTaskRecord(TaskRecord.LOCK_TASK_AUTH_WHITELISTED); + mLockTaskController.startLockTaskMode(tr1, true, TEST_UID); + + // WHEN calling clearLockedTasks on the root task + mLockTaskController.clearLockedTasks("testClearLockedTasks"); + + // THEN the device should not be locked + verify(mWindowManager, never()).lockNow(any()); + } + + @Test + public void testClearLockedTasks_noLockSetting_password_deviceIsLocked() throws Exception { + // GIVEN There is no setting set for LOCK_TO_APP_EXIT_LOCKED + Settings.Secure.clearProviderForTest(); + + // AND a password is set + when(mLockPatternUtils.isSecure(anyInt())) + .thenReturn(true); + + // AND there is a task record + TaskRecord tr1 = getTaskRecord(TaskRecord.LOCK_TASK_AUTH_WHITELISTED); + mLockTaskController.startLockTaskMode(tr1, true, TEST_UID); + + // WHEN calling clearLockedTasks on the root task + mLockTaskController.clearLockedTasks("testClearLockedTasks"); + + // THEN the device should be locked + verify(mWindowManager, times(1)).lockNow(any()); + } + + @Test + public void testClearLockedTasks_lockSettingTrue_deviceIsLocked() throws Exception { + // GIVEN LOCK_TO_APP_EXIT_LOCKED is set to 1 + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.LOCK_TO_APP_EXIT_LOCKED, 1, mContext.getUserId()); + + // AND there is a task record + TaskRecord tr1 = getTaskRecord(TaskRecord.LOCK_TASK_AUTH_WHITELISTED); + mLockTaskController.startLockTaskMode(tr1, true, TEST_UID); + + // WHEN calling clearLockedTasks on the root task + mLockTaskController.clearLockedTasks("testClearLockedTasks"); + + // THEN the device should be locked + verify(mWindowManager, times(1)).lockNow(any()); + } + + @Test + public void testClearLockedTasks_lockSettingFalse_doesNotRequirePassword() throws Exception { + // GIVEN LOCK_TO_APP_EXIT_LOCKED is set to 1 + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.LOCK_TO_APP_EXIT_LOCKED, 0, mContext.getUserId()); + + // AND there is a task record + TaskRecord tr1 = getTaskRecord(TaskRecord.LOCK_TASK_AUTH_WHITELISTED); + mLockTaskController.startLockTaskMode(tr1, true, TEST_UID); + + // WHEN calling clearLockedTasks on the root task + mLockTaskController.clearLockedTasks("testClearLockedTasks"); + + // THEN the device should be unlocked + verify(mWindowManager, never()).lockNow(any()); + } + + @Test + public void testUpdateLockTaskPackages() { String[] whitelist1 = {TEST_PACKAGE_NAME, TEST_PACKAGE_NAME_2}; String[] whitelist2 = {TEST_PACKAGE_NAME}; From 236b44274ebd1d7e3c706a24fd2a83d534d68ab0 Mon Sep 17 00:00:00 2001 From: Tyler Gunn Date: Tue, 14 May 2019 11:08:06 -0700 Subject: [PATCH 2/7] Update API docs for TelecomManager#endCall. Make it clear that ending an emergency call is not possible with this method. Test: Compile; this is a docs change. Bug: 132438333 Change-Id: I736b90e31723ee2055cedf16142c4d0f494bf49b (cherry picked from commit 3acf511895d8d19d5f9189d0159ae1d677a89a42) --- telecomm/java/android/telecom/TelecomManager.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index 573f7db6b20c3..18c170a2e330d 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -1317,6 +1317,9 @@ public class TelecomManager { * foreground call is ended. *

* Requires permission {@link android.Manifest.permission#ANSWER_PHONE_CALLS}. + *

+ * Note: this method CANNOT be used to end ongoing emergency calls and will return {@code false} + * if an attempt is made to end an emergency call. * * @return {@code true} if there is a call which will be rejected or terminated, {@code false} * otherwise. From 8a4b671f014c0ecf73742296d39ec877aeec651a Mon Sep 17 00:00:00 2001 From: Jonathan Scott Date: Mon, 13 May 2019 13:14:19 +0100 Subject: [PATCH 3/7] [RESTRICT AUTOMERGE] Fix NullPointerException when mLockPatternUtils is not set. Test: atest LockTaskControllerTest Bug: 132593073 Change-Id: I1bfacd5992569d67cdaa526b18d1c426a366babb (cherry picked from commit fa1b986746ad7d9ebab6a34a0bfafd0a93267d5b) --- .../core/java/com/android/server/am/LockTaskController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/am/LockTaskController.java b/services/core/java/com/android/server/am/LockTaskController.java index ab67b8a3f534d..bd0506b4b91e7 100644 --- a/services/core/java/com/android/server/am/LockTaskController.java +++ b/services/core/java/com/android/server/am/LockTaskController.java @@ -794,7 +794,7 @@ public class LockTaskController { } catch (Settings.SettingNotFoundException e) { // Log to SafetyNet for b/127605586 android.util.EventLog.writeEvent(0x534e4554, "127605586", -1, ""); - return mLockPatternUtils.isSecure(USER_CURRENT); + return getLockPatternUtils().isSecure(USER_CURRENT); } } From 1c2fcd62ec9162ecc12700493ee1e8182aa71896 Mon Sep 17 00:00:00 2001 From: Hui Yu Date: Fri, 17 May 2019 13:39:52 -0700 Subject: [PATCH 4/7] Clean up ProcessRecord when reuse a pid. When Zygote starts a process with a pid, system_server may have this pid associate with a old process which is killed by the OS but system_server has not finished cleanup. In this case, clean up the old ProcessRecord so the new process can use the pid. This problem is exposed because the asynchronous process start change. attachApplicationLocked() may happen before handleProcessStartedLocked() and the mPidsSelfLocked may still have the old ProcessRecord associate with the new process's pid. Bug: 131105245 Test: POC test steps in b/131105245. Change-Id: I775acda5147291d0cf9836b6ffb3f52d1bf9bffe Merged-In: I775acda5147291d0cf9836b6ffb3f52d1bf9bffe Merged-In: I5d421f6c68f6b3437d51c94f4aef77e08a7bf002 (cherry picked from commit 3d47e0ceca4e6528a1bec2a7e94a833b8951d93a) --- .../server/am/ActivityManagerService.java | 38 +++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index a1d42c0913342..32cc605867cef 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -4224,6 +4224,7 @@ public class ActivityManagerService extends IActivityManager.Stub } checkTime(startTime, "startProcess: done removing from pids map"); app.setPid(0); + app.startSeq = 0; } if (DEBUG_PROCESSES && mProcessesOnHold.contains(app)) Slog.v(TAG_PROCESSES, @@ -4414,6 +4415,14 @@ public class ActivityManagerService extends IActivityManager.Stub app.killedByAm = false; app.removed = false; app.killed = false; + if (app.startSeq != 0) { + Slog.wtf(TAG, "startProcessLocked processName:" + app.processName + + " with non-zero startSeq:" + app.startSeq); + } + if (app.pid != 0) { + Slog.wtf(TAG, "startProcessLocked processName:" + app.processName + + " with non-zero pid:" + app.pid); + } final long startSeq = app.startSeq = ++mProcStartSeqCounter; app.setStartParams(uid, hostingType, hostingNameStr, seInfo, startTime); if (mConstants.FLAG_PROCESS_START_ASYNC) { @@ -4599,8 +4608,11 @@ public class ActivityManagerService extends IActivityManager.Stub // If there is already an app occupying that pid that hasn't been cleaned up if (oldApp != null && !app.isolated) { // Clean up anything relating to this pid first - Slog.w(TAG, "Reusing pid " + pid - + " while app is still mapped to it"); + Slog.wtf(TAG, "handleProcessStartedLocked process:" + app.processName + + " startSeq:" + app.startSeq + + " pid:" + pid + + " belongs to another existing app:" + oldApp.processName + + " startSeq:" + oldApp.startSeq); cleanUpApplicationRecordLocked(oldApp, false, false, -1, true /*replacingPid*/); } @@ -7591,6 +7603,26 @@ public class ActivityManagerService extends IActivityManager.Stub synchronized (mPidsSelfLocked) { app = mPidsSelfLocked.get(pid); } + if (app != null && (app.startUid != callingUid || app.startSeq != startSeq)) { + String processName = null; + final ProcessRecord pending = mPendingStarts.get(startSeq); + if (pending != null) { + processName = pending.processName; + } + final String msg = "attachApplicationLocked process:" + processName + + " startSeq:" + startSeq + + " pid:" + pid + + " belongs to another existing app:" + app.processName + + " startSeq:" + app.startSeq; + Slog.wtf(TAG, msg); + // SafetyNet logging for b/131105245. + EventLog.writeEvent(0x534e4554, "131105245", app.startUid, msg); + // If there is already an app occupying that pid that hasn't been cleaned up + cleanUpApplicationRecordLocked(app, false, false, -1, + true /*replacingPid*/); + mPidsSelfLocked.remove(pid); + app = null; + } } else { app = null; } @@ -7599,7 +7631,7 @@ public class ActivityManagerService extends IActivityManager.Stub // update the internal state. if (app == null && startSeq > 0) { final ProcessRecord pending = mPendingStarts.get(startSeq); - if (pending != null && pending.startUid == callingUid + if (pending != null && pending.startUid == callingUid && pending.startSeq == startSeq && handleProcessStartedLocked(pending, pid, pending.usingWrapper, startSeq, true)) { app = pending; From 205e540a64745c6e0f9702469c9e4b14908037ea Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Tue, 9 Apr 2019 07:42:02 -0700 Subject: [PATCH 5/7] DO NOT MERGE SurfaceControl: Fix captureLayers JNI Missed a call-point in last refactoring. This CL should have been included in https://googleplex-android-review.git.corp.google.com/q/topic:%22bp-secure-screen-rotation%22+(status:open%20OR%20status:merged) Bug: 130211665 Bug: 133054270 Test: Manual Change-Id: I43fa93eea7d79f5b773497e3bb65750866eca2cb (cherry picked from commit bf9298f1c9b848ff0db4ae0be3913ad531bafa9e) (cherry picked from commit fbc22c2b6d54a8a9b589746be67d3992f01212cc) --- core/jni/android_view_SurfaceControl.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 614a8ff124ea1..04b06095b0225 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -308,7 +308,8 @@ static jobject nativeCaptureLayers(JNIEnv* env, jclass clazz, jobject layerHandl buffer->getHeight(), buffer->getPixelFormat(), (jint)buffer->getUsage(), - (jlong)buffer.get()); + (jlong)buffer.get(), + false /* capturedSecureLayers */); } static void nativeApplyTransaction(JNIEnv* env, jclass clazz, jlong transactionObj, jboolean sync) { From 1924f6d94debfe88fc4c81e3554e086c779158b9 Mon Sep 17 00:00:00 2001 From: Michael Wachenschwanz Date: Wed, 15 May 2019 22:58:15 -0700 Subject: [PATCH 6/7] Clear the Parcel before writing an exception during a transaction This prevents any object data from being accidentally overwritten by the exception, which could cause unexpected malformed objects to be sent across the transaction. Test: atest CtsOsTestCases:ParcelTest#testExceptionOverwritesObject Bug: 34175893 Change-Id: Iaf80a0ad711762992b8ae60f76d861c97a403013 Merged-In: Iaf80a0ad711762992b8ae60f76d861c97a403013 (cherry picked from commit f8ef5bcf21c87d8617f5e11810cc94350298d114) --- core/java/android/os/Binder.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index 8e8565c3574ca..4db8d1ea64d5b 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -740,6 +740,8 @@ public class Binder implements IBinder { Log.w(TAG, "Caught a RuntimeException from the binder stub implementation.", e); } } else { + // Clear the parcel before writing the exception + reply.setDataSize(0); reply.setDataPosition(0); reply.writeException(e); } From a37574256cc0706e23d2f4ef33b2be3fa64990a0 Mon Sep 17 00:00:00 2001 From: Chalard Jean Date: Mon, 20 May 2019 13:11:37 +0900 Subject: [PATCH 7/7] [RESTRICT AUTOMERGE] Protect VPN dialogs against overlay. Bug: 130568701 Test: manual. After this, can't display on top of it Change-Id: Ib032f800edb0416cc15f01a34954340d0d0ffa78 (cherry picked from commit 4e80dc2861614d25a1f957f50040a8cf04812d11) (cherry picked from commit 27d47340496580d66f36a734a115e47eaf550972) --- packages/VpnDialogs/AndroidManifest.xml | 1 + .../android/vpndialogs/AlwaysOnDisconnectedDialog.java | 10 +++++++--- .../src/com/android/vpndialogs/ConfirmDialog.java | 3 +++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/VpnDialogs/AndroidManifest.xml b/packages/VpnDialogs/AndroidManifest.xml index 8172e717850bd..05ce96ca7cb30 100644 --- a/packages/VpnDialogs/AndroidManifest.xml +++ b/packages/VpnDialogs/AndroidManifest.xml @@ -21,6 +21,7 @@ + diff --git a/packages/VpnDialogs/src/com/android/vpndialogs/AlwaysOnDisconnectedDialog.java b/packages/VpnDialogs/src/com/android/vpndialogs/AlwaysOnDisconnectedDialog.java index 846fcf867e328..ba4baf3419912 100644 --- a/packages/VpnDialogs/src/com/android/vpndialogs/AlwaysOnDisconnectedDialog.java +++ b/packages/VpnDialogs/src/com/android/vpndialogs/AlwaysOnDisconnectedDialog.java @@ -16,6 +16,10 @@ package com.android.vpndialogs; +import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; +import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; + import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -31,7 +35,6 @@ import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.util.Log; import android.view.View; -import android.view.WindowManager; import android.widget.TextView; import com.android.internal.app.AlertActivity; @@ -74,8 +77,9 @@ public class AlwaysOnDisconnectedDialog extends AlertActivity setupAlert(); getWindow().setCloseOnTouchOutside(false); - getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); - getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + getWindow().setType(TYPE_SYSTEM_ALERT); + getWindow().addFlags(FLAG_ALT_FOCUSABLE_IM); + getWindow().addPrivateFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); } @Override diff --git a/packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java b/packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java index 72ce9c4efdc06..09339743db5c5 100644 --- a/packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java +++ b/packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java @@ -16,6 +16,8 @@ package com.android.vpndialogs; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; + import android.content.Context; import android.content.DialogInterface; import android.content.pm.PackageManager; @@ -78,6 +80,7 @@ public class ConfirmDialog extends AlertActivity setupAlert(); getWindow().setCloseOnTouchOutside(false); + getWindow().addPrivateFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); Button button = mAlert.getButton(DialogInterface.BUTTON_POSITIVE); button.setFilterTouchesWhenObscured(true); }