diff options
| author | 2019-08-15 06:13:48 +0000 | |
|---|---|---|
| committer | 2019-08-15 06:13:48 +0000 | |
| commit | 5937562bfb3a23e5b63d687636c6cb54d89b846c (patch) | |
| tree | a08a4ef8542aab8c678455bc93604a3beccef2cf | |
| parent | 5f76164a65d0deb58d42fd880a40f00db9658d21 (diff) | |
| parent | 1702a9da19190418d645131bf9022d27d1c0f3b9 (diff) | |
Merge "DO NOT MERGE - Merge pie-platform-release (PPRL.190801.002) into master"
9 files changed, 146 insertions, 21 deletions
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index 3de11837bfd1..bf17671786af 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -752,6 +752,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/packages/VpnDialogs/AndroidManifest.xml b/packages/VpnDialogs/AndroidManifest.xml index 1d0b9b6d83db..1f49aa1015d3 100644 --- a/packages/VpnDialogs/AndroidManifest.xml +++ b/packages/VpnDialogs/AndroidManifest.xml @@ -22,6 +22,7 @@ <uses-permission android:name="android.permission.CONTROL_VPN" /> <uses-permission android:name="android.permission.CONTROL_ALWAYS_ON_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 78b2914b6653..e3cb5ad53a33 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -4202,6 +4202,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, @@ -4393,6 +4394,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) { @@ -4578,8 +4587,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*/); } @@ -7435,6 +7447,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; } @@ -7443,7 +7475,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 aac8dad52dd7..88a1ef3e84fa 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -8900,10 +8900,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 863a0d8d34a4..5fbf241d871c 100644 --- a/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java @@ -390,7 +390,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 @@ -404,7 +404,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 3b4b86807121..b40cca60f237 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -1442,6 +1442,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. |