diff options
author | Android Merger <noreply-android-build-merger@google.com> | 2019-08-13 21:44:36 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2019-08-13 21:44:36 +0000 |
commit | f60ea058a6015c82b6fbf622470437a3143eca4c (patch) | |
tree | 1bdde61fa96faf466e40f78c3d6580c8f54c6dd9 | |
parent | cf06c658375beed26678ab6555b59b5b57b56fb2 (diff) | |
parent | 0f571723399970a28ecc28fa0f9c9b371cad1a8a (diff) | |
download | base-pie-cuttlefish-testing.tar.gz |
Merge "Snap for 5674421 from ae0c2eeba3f60c62f63ec83b63d9c0593a0430fe to pi-platform-release am: 823838e9ef" into pie-cuttlefish-testingpie-cuttlefish-testing
10 files changed, 148 insertions, 22 deletions
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index 8e8565c3574c..4db8d1ea64d5 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); } diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 614a8ff124ea..04b06095b022 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) { diff --git a/packages/VpnDialogs/AndroidManifest.xml b/packages/VpnDialogs/AndroidManifest.xml index 8172e717850b..05ce96ca7cb3 100644 --- a/packages/VpnDialogs/AndroidManifest.xml +++ b/packages/VpnDialogs/AndroidManifest.xml @@ -21,6 +21,7 @@ <uses-permission android:name="android.permission.CONTROL_VPN" /> <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" /> + <uses-permission android:name="android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS"/> <application android:label="VpnDialogs" android:allowBackup="false"> diff --git a/packages/VpnDialogs/src/com/android/vpndialogs/AlwaysOnDisconnectedDialog.java b/packages/VpnDialogs/src/com/android/vpndialogs/AlwaysOnDisconnectedDialog.java index 846fcf867e32..ba4baf341991 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 72ce9c4efdc0..09339743db5c 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); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index a1d42c091334..32cc605867ce 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; diff --git a/services/core/java/com/android/server/am/LockTaskController.java b/services/core/java/com/android/server/am/LockTaskController.java index 151ef4942432..bd0506b4b91e 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 getLockPatternUtils().isSecure(USER_CURRENT); } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 3cde709bfeb2..c414abac12a7 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -8821,10 +8821,10 @@ public class PackageManagerService extends IPackageManager.Stub + " better than this " + pkg.getLongVersionCode()); } - // Verify certificates against what was last scanned. If it is an updated priv app, we will - // force re-collecting certificate. - final boolean forceCollect = PackageManagerServiceUtils.isApkVerificationForced( - disabledPkgSetting); + // Verify certificates against what was last scanned. If there was an upgrade or this is an + // updated priv app, we will force re-collecting certificate. + final boolean forceCollect = mIsUpgrade || + PackageManagerServiceUtils.isApkVerificationForced(disabledPkgSetting); // Full APK verification can be skipped during certificate collection, only if the file is // in verified partition, or can be verified on access (when apk verity is enabled). In both // cases, only data in Signing Block is verified instead of the whole file. 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 f46d712df65b..35aa49188564 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}; diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index 573f7db6b20c..18c170a2e330 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. * <p> * Requires permission {@link android.Manifest.permission#ANSWER_PHONE_CALLS}. + * <p> + * 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. |