Merge "Set app-op for restricted pre-22 apps" into qt-dev
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index e50ab6c..74c89d6 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -511,7 +511,6 @@
* @param appDataDir null-ok the data directory of the app.
* @param invokeWith null-ok the command to invoke with.
* @param packageName null-ok the name of the package this process belongs to.
- * @param useSystemGraphicsDriver whether the process uses system graphics driver.
*
* @param zygoteArgs Additional arguments to supply to the zygote process.
* @return An object that describes the result of the attempt to start the process.
@@ -531,13 +530,11 @@
@Nullable String appDataDir,
@Nullable String invokeWith,
@Nullable String packageName,
- boolean useSystemGraphicsDriver,
@Nullable String[] zygoteArgs) {
return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids,
runtimeFlags, mountExternal, targetSdkVersion, seInfo,
abi, instructionSet, appDataDir, invokeWith, packageName,
- /*useUsapPool=*/ true,
- useSystemGraphicsDriver, zygoteArgs);
+ /*useUsapPool=*/ true, zygoteArgs);
}
/** @hide */
@@ -553,13 +550,11 @@
@Nullable String appDataDir,
@Nullable String invokeWith,
@Nullable String packageName,
- boolean useSystemGraphicsDriver,
@Nullable String[] zygoteArgs) {
return WebViewZygote.getProcess().start(processClass, niceName, uid, gid, gids,
runtimeFlags, mountExternal, targetSdkVersion, seInfo,
abi, instructionSet, appDataDir, invokeWith, packageName,
- /*useUsapPool=*/ false,
- useSystemGraphicsDriver, zygoteArgs);
+ /*useUsapPool=*/ false, zygoteArgs);
}
/**
diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java
index d42478e5..9bcdcee 100644
--- a/core/java/android/os/ZygoteProcess.java
+++ b/core/java/android/os/ZygoteProcess.java
@@ -307,7 +307,6 @@
* @param invokeWith null-ok the command to invoke with.
* @param packageName null-ok the name of the package this process belongs to.
* @param zygoteArgs Additional arguments to supply to the zygote process.
- * @param useSystemGraphicsDriver whether the process uses system graphics driver.
*
* @return An object that describes the result of the attempt to start the process.
* @throws RuntimeException on fatal start failure
@@ -324,7 +323,6 @@
@Nullable String invokeWith,
@Nullable String packageName,
boolean useUsapPool,
- boolean useSystemGraphicsDriver,
@Nullable String[] zygoteArgs) {
// TODO (chriswailes): Is there a better place to check this value?
if (fetchUsapPoolEnabledPropWithMinInterval()) {
@@ -335,7 +333,7 @@
return startViaZygote(processClass, niceName, uid, gid, gids,
runtimeFlags, mountExternal, targetSdkVersion, seInfo,
abi, instructionSet, appDataDir, invokeWith, /*startChildZygote=*/ false,
- packageName, useUsapPool, useSystemGraphicsDriver, zygoteArgs);
+ packageName, useUsapPool, zygoteArgs);
} catch (ZygoteStartFailedEx ex) {
Log.e(LOG_TAG,
"Starting VM process through Zygote failed");
@@ -554,7 +552,6 @@
boolean startChildZygote,
@Nullable String packageName,
boolean useUsapPool,
- boolean useSystemGraphicsDriver,
@Nullable String[] extraArgs)
throws ZygoteStartFailedEx {
ArrayList<String> argsForZygote = new ArrayList<>();
@@ -636,7 +633,7 @@
// The USAP pool can not be used if the application will not use the systems graphics
// driver. If that driver is requested use the Zygote application start path.
return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),
- useUsapPool && useSystemGraphicsDriver,
+ useUsapPool,
argsForZygote);
}
}
@@ -1147,8 +1144,7 @@
gids, runtimeFlags, 0 /* mountExternal */, 0 /* targetSdkVersion */, seInfo,
abi, instructionSet, null /* appDataDir */, null /* invokeWith */,
true /* startChildZygote */, null /* packageName */,
- false /* useUsapPool */, false /*useSystemGraphicsDriver*/,
- extraArgs);
+ false /* useUsapPool */, extraArgs);
} catch (ZygoteStartFailedEx ex) {
throw new RuntimeException("Starting child-zygote through Zygote failed", ex);
}
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 4cb552d..85e9e49 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -2553,34 +2553,42 @@
final boolean isItemEnabled;
final ViewGroup.LayoutParams lp = view.getLayoutParams();
if (lp instanceof AbsListView.LayoutParams) {
- isItemEnabled = ((AbsListView.LayoutParams) lp).isEnabled;
+ isItemEnabled = ((AbsListView.LayoutParams) lp).isEnabled && isEnabled();
} else {
isItemEnabled = false;
}
- if (!isEnabled() || !isItemEnabled) {
- info.setEnabled(false);
- return;
- }
+ info.setEnabled(isItemEnabled);
if (position == getSelectedItemPosition()) {
info.setSelected(true);
- info.addAction(AccessibilityAction.ACTION_CLEAR_SELECTION);
- } else {
- info.addAction(AccessibilityAction.ACTION_SELECT);
+ addAccessibilityActionIfEnabled(info, isItemEnabled,
+ AccessibilityAction.ACTION_CLEAR_SELECTION);
+ } else {
+ addAccessibilityActionIfEnabled(info, isItemEnabled,
+ AccessibilityAction.ACTION_SELECT);
}
if (isItemClickable(view)) {
- info.addAction(AccessibilityAction.ACTION_CLICK);
+ addAccessibilityActionIfEnabled(info, isItemEnabled, AccessibilityAction.ACTION_CLICK);
info.setClickable(true);
}
if (isLongClickable()) {
- info.addAction(AccessibilityAction.ACTION_LONG_CLICK);
+ addAccessibilityActionIfEnabled(info, isItemEnabled,
+ AccessibilityAction.ACTION_LONG_CLICK);
info.setLongClickable(true);
}
}
+
+ private void addAccessibilityActionIfEnabled(AccessibilityNodeInfo info, boolean enabled,
+ AccessibilityAction action) {
+ if (enabled) {
+ info.addAction(action);
+ }
+ }
+
private boolean isItemClickable(View view) {
return !view.hasExplicitFocusable();
}
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index ee81868..2ba9cf1 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -512,9 +512,6 @@
Credentials peerCredentials = null;
ZygoteArguments args = null;
- // Load resources
- ZygoteInit.nativePreloadGraphicsDriver();
-
while (true) {
try {
sessionSocket = usapPoolSocket.accept();
diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java
index 2941a81..723f161 100644
--- a/core/java/com/android/internal/policy/DecorView.java
+++ b/core/java/com/android/internal/policy/DecorView.java
@@ -262,8 +262,10 @@
private final int mResizeShadowSize;
private final Paint mVerticalResizeShadowPaint = new Paint();
private final Paint mHorizontalResizeShadowPaint = new Paint();
+ private final Paint mLegacyNavigationBarBackgroundPaint = new Paint();
private Insets mBackgroundInsets = Insets.NONE;
private Insets mLastBackgroundInsets = Insets.NONE;
+ private boolean mDrawLegacyNavigationBarBackground;
DecorView(Context context, int featureId, PhoneWindow window,
WindowManager.LayoutParams params) {
@@ -292,6 +294,8 @@
mResizeShadowSize = context.getResources().getDimensionPixelSize(
R.dimen.resize_shadow_size);
initResizingPaints();
+
+ mLegacyNavigationBarBackgroundPaint.setColor(Color.BLACK);
}
void setBackgroundFallback(@Nullable Drawable fallbackDrawable) {
@@ -1143,6 +1147,8 @@
navBarToRightEdge || navBarToLeftEdge, navBarToLeftEdge,
0 /* sideInset */, animate && !disallowAnimate,
mForceWindowDrawsBarBackgrounds);
+ mDrawLegacyNavigationBarBackground = mNavigationColorViewState.visible
+ && (mWindow.getAttributes().flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) == 0;
boolean statusBarNeedsRightInset = navBarToRightEdge
&& mNavigationColorViewState.present;
@@ -2310,6 +2316,7 @@
@Override
public void onPostDraw(RecordingCanvas canvas) {
drawResizingShadowIfNeeded(canvas);
+ drawLegacyNavigationBarBackground(canvas);
}
private void initResizingPaints() {
@@ -2342,6 +2349,18 @@
canvas.restore();
}
+ private void drawLegacyNavigationBarBackground(RecordingCanvas canvas) {
+ if (!mDrawLegacyNavigationBarBackground) {
+ return;
+ }
+ View v = mNavigationColorViewState.view;
+ if (v == null) {
+ return;
+ }
+ canvas.drawRect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom(),
+ mLegacyNavigationBarBackgroundPaint);
+ }
+
/** Release the renderer thread which is usually done when the user stops resizing. */
private void releaseThreadedRenderer() {
if (mResizingBackgroundDrawable != null && mLastBackgroundDrawableCb != null) {
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
index 8373761..16b0125 100644
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
@@ -63,6 +63,7 @@
import com.android.systemui.classifier.FalsingLog;
import com.android.systemui.classifier.FalsingManagerFactory;
import com.android.systemui.fragments.FragmentHostManager;
+import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.qs.car.CarQSFragment;
import com.android.systemui.shared.system.ActivityManagerWrapper;
@@ -127,6 +128,7 @@
private SwitchToGuestTimer mSwitchToGuestTimer;
private NotificationDataManager mNotificationDataManager;
private NotificationClickHandlerFactory mNotificationClickHandlerFactory;
+ private ScreenLifecycle mScreenLifecycle;
// The container for the notifications.
private CarNotificationView mNotificationView;
@@ -230,6 +232,9 @@
mPowerManagerHelper.connectToCarService();
mSwitchToGuestTimer = new SwitchToGuestTimer(mContext);
+
+ mScreenLifecycle = Dependency.get(ScreenLifecycle.class);
+ mScreenLifecycle.addObserver(mScreenObserver);
}
/**
@@ -315,7 +320,6 @@
public void showKeyguard() {
super.showKeyguard();
updateNavBarForKeyguardContent();
- dismissKeyguardWhenUserSwitcherNotDisplayed();
}
/**
@@ -978,6 +982,13 @@
}
}
+ final ScreenLifecycle.Observer mScreenObserver = new ScreenLifecycle.Observer() {
+ @Override
+ public void onScreenTurnedOn() {
+ dismissKeyguardWhenUserSwitcherNotDisplayed();
+ }
+ };
+
// We automatically dismiss keyguard unless user switcher is being shown on the keyguard.
private void dismissKeyguardWhenUserSwitcherNotDisplayed() {
if (mFullscreenUserSwitcher == null) {
@@ -1000,6 +1011,10 @@
* Dismisses the keyguard and shows bouncer if authentication is necessary.
*/
public void dismissKeyguard() {
+ // Don't dismiss keyguard when the screen is off.
+ if (mScreenLifecycle.getScreenState() == ScreenLifecycle.SCREEN_OFF) {
+ return;
+ }
executeRunnableDismissingKeyguard(null/* runnable */, null /* cancelAction */,
true /* dismissShade */, true /* afterKeyguardGone */, true /* deferred */);
}
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index 7d36469..eff7054 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -64,6 +64,7 @@
import android.view.ViewGroup.LayoutParams;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
+import android.view.animation.AccelerateInterpolator;
import android.view.animation.Interpolator;
import android.view.animation.PathInterpolator;
import android.widget.FrameLayout;
@@ -231,7 +232,10 @@
anim.start();
} else {
view.animate().cancel();
- view.animate().setDuration(400).alpha(0f);
+ view.animate()
+ .setInterpolator(new AccelerateInterpolator(1.5f))
+ .setDuration(250)
+ .alpha(0f);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
index 831d074..5f52486 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
@@ -70,11 +70,12 @@
private final Consumer<Boolean> mProxCallback;
private final Callback mCallback;
@VisibleForTesting
- protected final TriggerSensor[] mSensors;
+ protected TriggerSensor[] mSensors;
private final Handler mHandler = new Handler();
private final ProxSensor mProxSensor;
private long mDebounceFrom;
+ private boolean mSettingRegistered;
public DozeSensors(Context context, AlarmManager alarmManager, SensorManager sensorManager,
DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock,
@@ -172,13 +173,8 @@
public void setListening(boolean listen) {
for (TriggerSensor s : mSensors) {
s.setListening(listen);
- if (listen) {
- s.registerSettingsObserver(mSettingsObserver);
- }
}
- if (!listen) {
- mResolver.unregisterContentObserver(mSettingsObserver);
- }
+ registerSettingsObserverIfNeeded(listen);
}
/** Set the listening state of only the sensors that require the touchscreen. */
@@ -240,6 +236,17 @@
return mProxSensor.mCurrentlyFar;
}
+ private void registerSettingsObserverIfNeeded(boolean register) {
+ if (!register) {
+ mResolver.unregisterContentObserver(mSettingsObserver);
+ } else if (!mSettingRegistered) {
+ for (TriggerSensor s : mSensors) {
+ s.registerSettingsObserver(mSettingsObserver);
+ }
+ }
+ mSettingRegistered = register;
+ }
+
private class ProxSensor implements SensorEventListener {
boolean mRequested;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java
index 4467faf..3304291 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java
@@ -27,10 +27,12 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.AlarmManager;
+import android.database.ContentObserver;
import android.hardware.display.AmbientDisplayConfiguration;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
@@ -39,6 +41,7 @@
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.doze.DozeSensors.TriggerSensor;
import com.android.systemui.plugins.SensorManagerPlugin;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.AsyncSensorManager;
@@ -73,6 +76,8 @@
private Consumer<Boolean> mProxCallback;
@Mock
private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy;
+ @Mock
+ private TriggerSensor mMockTriggerSensor;
private SensorManagerPlugin.SensorEventListener mWakeLockScreenListener;
private TestableLooper mTestableLooper;
private DozeSensors mDozeSensors;
@@ -107,6 +112,25 @@
anyBoolean(), anyFloat(), anyFloat(), eq(null));
}
+ @Test
+ public void testSetListening_firstTrue_registerSettingsObserver() {
+ mDozeSensors.mSensors = new TriggerSensor[] {mMockTriggerSensor};
+
+ mDozeSensors.setListening(true);
+
+ verify(mMockTriggerSensor).registerSettingsObserver(any(ContentObserver.class));
+ }
+
+ @Test
+ public void testSetListening_twiceTrue_onlyRegisterSettingsObserverOnce() {
+ mDozeSensors.mSensors = new TriggerSensor[] {mMockTriggerSensor};
+ mDozeSensors.setListening(true);
+
+ mDozeSensors.setListening(true);
+
+ verify(mMockTriggerSensor, times(1)).registerSettingsObserver(any(ContentObserver.class));
+ }
+
private class TestableDozeSensors extends DozeSensors {
TestableDozeSensors() {
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 943fe75..d64a2c2 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -63,7 +63,6 @@
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
-import android.os.GraphicsEnvironment;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@@ -705,16 +704,6 @@
return prefix + "+" + Integer.toString(diff);
}
- private static boolean shouldUseSystemGraphicsDriver(Context context, Bundle coreSettings,
- ApplicationInfo applicationInfo) {
- final boolean shouldUseGameDriver =
- GraphicsEnvironment.shouldUseGameDriver(context, coreSettings, applicationInfo);
- final boolean shouldUseAngle =
- GraphicsEnvironment.shouldUseAngle(context, coreSettings,
- applicationInfo.packageName);
- return !shouldUseGameDriver && !shouldUseAngle;
- }
-
public static String makeOomAdjString(int setAdj, boolean compact) {
if (setAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
return buildOomTag("cch", "cch", " ", setAdj,
@@ -1811,8 +1800,6 @@
String seInfo, String requiredAbi, String instructionSet, String invokeWith,
long startTime) {
try {
- final boolean useSystemGraphicsDriver = shouldUseSystemGraphicsDriver(mService.mContext,
- mService.mCoreSettingsObserver.getCoreSettingsLocked(), app.info);
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Start proc: " +
app.processName);
checkSlow(startTime, "startProcess: asking zygote to start proc");
@@ -1822,7 +1809,6 @@
app.processName, uid, uid, gids, runtimeFlags, mountExternal,
app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
app.info.dataDir, null, app.info.packageName,
- useSystemGraphicsDriver,
new String[] {PROC_START_SEQ_IDENT + app.startSeq});
} else if (hostingRecord.usesAppZygote()) {
final AppZygote appZygote = createAppZygoteForProcessIfNeeded(app);
@@ -1831,14 +1817,13 @@
app.processName, uid, uid, gids, runtimeFlags, mountExternal,
app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
app.info.dataDir, null, app.info.packageName,
- /*useUsapPool=*/ false, useSystemGraphicsDriver,
+ /*useUsapPool=*/ false,
new String[] {PROC_START_SEQ_IDENT + app.startSeq});
} else {
startResult = Process.start(entryPoint,
app.processName, uid, uid, gids, runtimeFlags, mountExternal,
app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
app.info.dataDir, invokeWith, app.info.packageName,
- useSystemGraphicsDriver,
new String[] {PROC_START_SEQ_IDENT + app.startSeq});
}
checkSlow(startTime, "startProcess: returned from zygote!");