Merge "Drop duplicate getInstance call"
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index fad681f..b37c938 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -2086,6 +2086,7 @@
field public static final String NAMESPACE_CONSTRAIN_DISPLAY_APIS = "constrain_display_apis";
field public static final String NAMESPACE_DEVICE_IDLE = "device_idle";
field public static final String NAMESPACE_JOB_SCHEDULER = "jobscheduler";
+ field public static final String NAMESPACE_SELECTION_TOOLBAR = "selection_toolbar";
}
public final class Settings {
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index 22b444e..be841c0 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -94,7 +94,6 @@
import android.util.PrintWriterPrinter;
import android.util.Printer;
import android.util.proto.ProtoOutputStream;
-import android.view.Gravity;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -1340,8 +1339,7 @@
mInflater = (LayoutInflater)getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.initSoftInputWindow");
- mWindow = new SoftInputWindow(this, "InputMethod", mTheme, null, null, mDispatcherState,
- WindowManager.LayoutParams.TYPE_INPUT_METHOD, Gravity.BOTTOM, false);
+ mWindow = new SoftInputWindow(this, mTheme, mDispatcherState);
mWindow.getWindow().getAttributes().setFitInsetsTypes(statusBars() | navigationBars());
mWindow.getWindow().getAttributes().setFitInsetsSides(Side.all() & ~Side.BOTTOM);
mWindow.getWindow().getAttributes().receiveInsetsIgnoringZOrder = true;
diff --git a/core/java/android/inputmethodservice/SoftInputWindow.java b/core/java/android/inputmethodservice/SoftInputWindow.java
index c2286d1..25cdb2b 100644
--- a/core/java/android/inputmethodservice/SoftInputWindow.java
+++ b/core/java/android/inputmethodservice/SoftInputWindow.java
@@ -42,23 +42,15 @@
import java.lang.annotation.Retention;
/**
- * A SoftInputWindow is a Dialog that is intended to be used for a top-level input
- * method window. It will be displayed along the edge of the screen, moving
- * the application user interface away from it so that the focused item is
- * always visible.
- * @hide
+ * A {@link SoftInputWindow} is a {@link Dialog} that is intended to be used for a top-level input
+ * method window. It will be displayed along the edge of the screen, moving the application user
+ * interface away from it so that the focused item is always visible.
*/
-public final class SoftInputWindow extends Dialog {
+final class SoftInputWindow extends Dialog {
private static final boolean DEBUG = false;
private static final String TAG = "SoftInputWindow";
- private final String mName;
- private final Callback mCallback;
- private final KeyEvent.Callback mKeyEventCallback;
private final KeyEvent.DispatcherState mDispatcherState;
- private final int mWindowType;
- private final int mGravity;
- private final boolean mTakesFocus;
private final Rect mBounds = new Rect();
@Retention(SOURCE)
@@ -93,22 +85,12 @@
private int mWindowState = WindowState.TOKEN_PENDING;
/**
- * Used to provide callbacks.
- */
- public interface Callback {
- /**
- * Used to be notified when {@link Dialog#onBackPressed()} gets called.
- */
- void onBackPressed();
- }
-
- /**
* Set {@link IBinder} window token to the window.
*
* <p>This method can be called only once.</p>
* @param token {@link IBinder} token to be associated with the window.
*/
- public void setToken(IBinder token) {
+ void setToken(IBinder token) {
switch (mWindowState) {
case WindowState.TOKEN_PENDING:
// Normal scenario. Nothing to worry about.
@@ -152,17 +134,9 @@
* using styles. This theme is applied on top of the current theme in
* <var>context</var>. If 0, the default dialog theme will be used.
*/
- public SoftInputWindow(Context context, String name, int theme, Callback callback,
- KeyEvent.Callback keyEventCallback, KeyEvent.DispatcherState dispatcherState,
- int windowType, int gravity, boolean takesFocus) {
+ SoftInputWindow(Context context, int theme, KeyEvent.DispatcherState dispatcherState) {
super(context, theme);
- mName = name;
- mCallback = callback;
- mKeyEventCallback = keyEventCallback;
mDispatcherState = dispatcherState;
- mWindowType = windowType;
- mGravity = gravity;
- mTakesFocus = takesFocus;
initDockWindow();
}
@@ -188,79 +162,23 @@
}
}
- private void updateWidthHeight(WindowManager.LayoutParams lp) {
- if (lp.gravity == Gravity.TOP || lp.gravity == Gravity.BOTTOM) {
- lp.width = WindowManager.LayoutParams.MATCH_PARENT;
- lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
- } else {
- lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
- lp.height = WindowManager.LayoutParams.MATCH_PARENT;
- }
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (mKeyEventCallback != null && mKeyEventCallback.onKeyDown(keyCode, event)) {
- return true;
- }
- return super.onKeyDown(keyCode, event);
- }
-
- @Override
- public boolean onKeyLongPress(int keyCode, KeyEvent event) {
- if (mKeyEventCallback != null && mKeyEventCallback.onKeyLongPress(keyCode, event)) {
- return true;
- }
- return super.onKeyLongPress(keyCode, event);
- }
-
- @Override
- public boolean onKeyUp(int keyCode, KeyEvent event) {
- if (mKeyEventCallback != null && mKeyEventCallback.onKeyUp(keyCode, event)) {
- return true;
- }
- return super.onKeyUp(keyCode, event);
- }
-
- @Override
- public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) {
- if (mKeyEventCallback != null && mKeyEventCallback.onKeyMultiple(keyCode, count, event)) {
- return true;
- }
- return super.onKeyMultiple(keyCode, count, event);
- }
-
- @Override
- public void onBackPressed() {
- if (mCallback != null) {
- mCallback.onBackPressed();
- } else {
- super.onBackPressed();
- }
- }
-
private void initDockWindow() {
WindowManager.LayoutParams lp = getWindow().getAttributes();
- lp.type = mWindowType;
- lp.setTitle(mName);
-
- lp.gravity = mGravity;
- updateWidthHeight(lp);
+ lp.setTitle("InputMethod");
+ lp.type = WindowManager.LayoutParams.TYPE_INPUT_METHOD;
+ lp.width = WindowManager.LayoutParams.MATCH_PARENT;
+ lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
+ lp.gravity = Gravity.BOTTOM;
getWindow().setAttributes(lp);
- int windowSetFlags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
- int windowModFlags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ final int windowModFlags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_DIM_BEHIND;
- if (!mTakesFocus) {
- windowSetFlags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
- } else {
- windowSetFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
- windowModFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
- }
+ final int windowSetFlags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
getWindow().setFlags(windowSetFlags, windowModFlags);
}
@@ -372,10 +290,11 @@
void dumpDebug(ProtoOutputStream proto, long fieldId) {
final long token = proto.start(fieldId);
- proto.write(NAME, mName);
- proto.write(WINDOW_TYPE, mWindowType);
- proto.write(GRAVITY, mGravity);
- proto.write(TAKES_FOCUS, mTakesFocus);
+ // TODO(b/192412909): Deprecate the following 4 entries, as they are all constant.
+ proto.write(NAME, "InputMethod");
+ proto.write(WINDOW_TYPE, WindowManager.LayoutParams.TYPE_INPUT_METHOD);
+ proto.write(GRAVITY, Gravity.BOTTOM);
+ proto.write(TAKES_FOCUS, false);
mBounds.dumpDebug(proto, BOUNDS);
proto.write(WINDOW_STATE, mWindowState);
proto.end(token);
diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java
index 22b9578..6349cde 100644
--- a/core/java/android/provider/DeviceConfig.java
+++ b/core/java/android/provider/DeviceConfig.java
@@ -564,6 +564,14 @@
public static final String NAMESPACE_WINDOW_MANAGER_NATIVE_BOOT = "window_manager_native_boot";
/**
+ * Definitions for selection toolbar related functions.
+ *
+ * @hide
+ */
+ @TestApi
+ public static final String NAMESPACE_SELECTION_TOOLBAR = "selection_toolbar";
+
+ /**
* List of namespaces which can be read without READ_DEVICE_CONFIG permission
*
* @hide
@@ -571,7 +579,7 @@
@NonNull
private static final List<String> PUBLIC_NAMESPACES =
Arrays.asList(NAMESPACE_TEXTCLASSIFIER, NAMESPACE_RUNTIME, NAMESPACE_STATSD_JAVA,
- NAMESPACE_STATSD_JAVA_BOOT);
+ NAMESPACE_STATSD_JAVA_BOOT, NAMESPACE_SELECTION_TOOLBAR);
/**
* Privacy related properties definitions.
*
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 3b52709..ab33fea 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -515,6 +515,15 @@
public static final int ENABLE_BACKPRESSURE = 0x00000100;
/**
+ * Buffers from this SurfaceControl should be considered display decorations.
+ *
+ * If the hardware has optimizations for display decorations (e.g. rounded corners, camera
+ * cutouts, etc), it should use them for this layer.
+ * @hide
+ */
+ public static final int DISPLAY_DECORATION = 0x00000200;
+
+ /**
* Surface creation flag: Creates a surface where color components are interpreted
* as "non pre-multiplied" by their alpha channel. Of course this flag is
* meaningless for surfaces without an alpha channel. By default
@@ -3266,6 +3275,21 @@
}
/**
+ * Sets whether the surface should take advantage of display decoration optimizations.
+ * @hide
+ */
+ public Transaction setDisplayDecoration(SurfaceControl sc, boolean displayDecoration) {
+ checkPreconditions(sc);
+ if (displayDecoration) {
+ nativeSetFlags(mNativeObject, sc.mNativeObject, DISPLAY_DECORATION,
+ DISPLAY_DECORATION);
+ } else {
+ nativeSetFlags(mNativeObject, sc.mNativeObject, 0, DISPLAY_DECORATION);
+ }
+ return this;
+ }
+
+ /**
* Indicates whether the surface must be considered opaque, even if its pixel format is
* set to translucent. This can be useful if an application needs full RGBA 8888 support
* for instance but will still draw every pixel opaque.
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 1fdbf0e2..1d652af 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -493,6 +493,9 @@
protected final ViewFrameInfo mViewFrameInfo = new ViewFrameInfo();
private final InputEventAssigner mInputEventAssigner = new InputEventAssigner();
+ // Whether to draw this surface as DISPLAY_DECORATION.
+ boolean mDisplayDecorationCached = false;
+
/**
* Update the Choreographer's FrameInfo object with the timing information for the current
* ViewRootImpl instance. Erase the data in the current ViewFrameInfo to prepare for the next
@@ -2853,6 +2856,9 @@
if (mSurfaceControl.isValid()) {
updateOpacity(mWindowAttributes, dragResizing,
surfaceControlChanged /*forceUpdate */);
+ if (surfaceControlChanged) {
+ updateDisplayDecoration();
+ }
}
if (DEBUG_LAYOUT) Log.v(mTag, "relayout: frame=" + frame.toShortString()
@@ -10440,6 +10446,23 @@
}
/**
+ * @hide
+ */
+ public void setDisplayDecoration(boolean displayDecoration) {
+ if (displayDecoration == mDisplayDecorationCached) return;
+
+ mDisplayDecorationCached = displayDecoration;
+
+ if (mSurfaceControl.isValid()) {
+ updateDisplayDecoration();
+ }
+ }
+
+ private void updateDisplayDecoration() {
+ mTransaction.setDisplayDecoration(mSurfaceControl, mDisplayDecorationCached).apply();
+ }
+
+ /**
* Sends a list of blur regions to SurfaceFlinger, tagged with a frame.
*
* @param regionCopy List of regions
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index aa6cb83..f94125d 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -105,6 +105,7 @@
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
+import android.os.IInputConstants;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -120,6 +121,7 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@@ -3325,21 +3327,13 @@
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS = 3;
/**
- * When this window has focus, disable touch pad pointer gesture processing.
- * The window will receive raw position updates from the touch pad instead
- * of pointer movements and synthetic touch events.
- *
- * @hide
- */
- public static final int INPUT_FEATURE_DISABLE_POINTER_GESTURES = 0x00000001;
-
- /**
* Does not construct an input channel for this window. The channel will therefore
* be incapable of receiving input.
*
* @hide
*/
- public static final int INPUT_FEATURE_NO_INPUT_CHANNEL = 0x00000002;
+ public static final int INPUT_FEATURE_NO_INPUT_CHANNEL =
+ IInputConstants.InputFeature.NO_INPUT_CHANNEL;
/**
* When this window has focus, does not call user activity for all input events so
@@ -3352,7 +3346,8 @@
* @hide
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- public static final int INPUT_FEATURE_DISABLE_USER_ACTIVITY = 0x00000004;
+ public static final int INPUT_FEATURE_DISABLE_USER_ACTIVITY =
+ IInputConstants.InputFeature.DISABLE_USER_ACTIVITY;
/**
* An input spy window. This window will receive all pointer events within its touchable
@@ -3361,7 +3356,25 @@
* event's coordinates.
* @hide
*/
- public static final int INPUT_FEATURE_SPY = 0x00000020;
+ public static final int INPUT_FEATURE_SPY =
+ IInputConstants.InputFeature.SPY;
+
+ /**
+ * When used with the window flag {@link #FLAG_NOT_TOUCHABLE}, this window will continue
+ * to receive events from a stylus device within its touchable region. All other pointer
+ * events, such as from a mouse or touchscreen, will be dispatched to the windows behind it.
+ *
+ * This input feature has no effect when the window flag {@link #FLAG_NOT_TOUCHABLE} is
+ * not set.
+ *
+ * The window must be a trusted overlay to use this input feature.
+ *
+ * @see #FLAG_NOT_TOUCHABLE
+ *
+ * @hide
+ */
+ public static final int INPUT_FEATURE_INTERCEPTS_STYLUS =
+ IInputConstants.InputFeature.INTERCEPTS_STYLUS;
/**
* An internal annotation for flags that can be specified to {@link #inputFeatures}.
@@ -3370,18 +3383,20 @@
*/
@Retention(RetentionPolicy.SOURCE)
@IntDef(flag = true, prefix = { "INPUT_FEATURE_" }, value = {
- INPUT_FEATURE_DISABLE_POINTER_GESTURES,
INPUT_FEATURE_NO_INPUT_CHANNEL,
INPUT_FEATURE_DISABLE_USER_ACTIVITY,
+ INPUT_FEATURE_SPY,
+ INPUT_FEATURE_INTERCEPTS_STYLUS,
})
public @interface InputFeatureFlags {}
/**
* Control special features of the input subsystem.
*
- * @see #INPUT_FEATURE_DISABLE_POINTER_GESTURES
* @see #INPUT_FEATURE_NO_INPUT_CHANNEL
* @see #INPUT_FEATURE_DISABLE_USER_ACTIVITY
+ * @see #INPUT_FEATURE_SPY
+ * @see #INPUT_FEATURE_INTERCEPTS_STYLUS
* @hide
*/
@InputFeatureFlags
@@ -4485,7 +4500,7 @@
sb.append(hasSystemUiListeners);
}
if (inputFeatures != 0) {
- sb.append(" if=").append(inputFeatureToString(inputFeatures));
+ sb.append(" if=").append(inputFeaturesToString(inputFeatures));
}
if (userActivityTimeout >= 0) {
sb.append(" userActivityTimeout=").append(userActivityTimeout);
@@ -4787,17 +4802,28 @@
}
}
- private static String inputFeatureToString(int inputFeature) {
- switch (inputFeature) {
- case INPUT_FEATURE_DISABLE_POINTER_GESTURES:
- return "DISABLE_POINTER_GESTURES";
- case INPUT_FEATURE_NO_INPUT_CHANNEL:
- return "NO_INPUT_CHANNEL";
- case INPUT_FEATURE_DISABLE_USER_ACTIVITY:
- return "DISABLE_USER_ACTIVITY";
- default:
- return Integer.toString(inputFeature);
+ private static String inputFeaturesToString(int inputFeatures) {
+ final List<String> features = new ArrayList<>();
+ if ((inputFeatures & INPUT_FEATURE_NO_INPUT_CHANNEL) != 0) {
+ inputFeatures &= ~INPUT_FEATURE_NO_INPUT_CHANNEL;
+ features.add("INPUT_FEATURE_NO_INPUT_CHANNEL");
}
+ if ((inputFeatures & INPUT_FEATURE_DISABLE_USER_ACTIVITY) != 0) {
+ inputFeatures &= ~INPUT_FEATURE_DISABLE_USER_ACTIVITY;
+ features.add("INPUT_FEATURE_DISABLE_USER_ACTIVITY");
+ }
+ if ((inputFeatures & INPUT_FEATURE_SPY) != 0) {
+ inputFeatures &= ~INPUT_FEATURE_SPY;
+ features.add("INPUT_FEATURE_SPY");
+ }
+ if ((inputFeatures & INPUT_FEATURE_INTERCEPTS_STYLUS) != 0) {
+ inputFeatures &= ~INPUT_FEATURE_INTERCEPTS_STYLUS;
+ features.add("INPUT_FEATURE_INTERCEPTS_STYLUS");
+ }
+ if (inputFeatures != 0) {
+ features.add(Integer.toHexString(inputFeatures));
+ }
+ return String.join(" | ", features);
}
/**
diff --git a/packages/ConnectivityT/framework-t/src/android/app/usage/NetworkStatsManager.java b/packages/ConnectivityT/framework-t/src/android/app/usage/NetworkStatsManager.java
index 2b9560e..a316b8a 100644
--- a/packages/ConnectivityT/framework-t/src/android/app/usage/NetworkStatsManager.java
+++ b/packages/ConnectivityT/framework-t/src/android/app/usage/NetworkStatsManager.java
@@ -47,7 +47,6 @@
import android.os.RemoteException;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
-import android.util.DataUnit;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
@@ -119,7 +118,7 @@
* is reached.
* @hide
*/
- public static final long MIN_THRESHOLD_BYTES = DataUnit.MEBIBYTES.toBytes(2);
+ public static final long MIN_THRESHOLD_BYTES = 2 * 1_048_576L; // 2MiB
private final Context mContext;
private final INetworkStatsService mService;
diff --git a/packages/ConnectivityT/framework-t/src/android/net/TrafficStats.java b/packages/ConnectivityT/framework-t/src/android/net/TrafficStats.java
index fa65061..d8feb88 100644
--- a/packages/ConnectivityT/framework-t/src/android/net/TrafficStats.java
+++ b/packages/ConnectivityT/framework-t/src/android/net/TrafficStats.java
@@ -29,7 +29,6 @@
import android.os.Build;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.util.DataUnit;
import com.android.server.NetworkManagementSocketTagger;
@@ -59,19 +58,19 @@
*/
public final static int UNSUPPORTED = -1;
- /** @hide @deprecated use {@link DataUnit} instead to clarify SI-vs-IEC */
+ /** @hide @deprecated use {@code DataUnit} instead to clarify SI-vs-IEC */
@Deprecated
public static final long KB_IN_BYTES = 1024;
- /** @hide @deprecated use {@link DataUnit} instead to clarify SI-vs-IEC */
+ /** @hide @deprecated use {@code DataUnit} instead to clarify SI-vs-IEC */
@Deprecated
public static final long MB_IN_BYTES = KB_IN_BYTES * 1024;
- /** @hide @deprecated use {@link DataUnit} instead to clarify SI-vs-IEC */
+ /** @hide @deprecated use {@code DataUnit} instead to clarify SI-vs-IEC */
@Deprecated
public static final long GB_IN_BYTES = MB_IN_BYTES * 1024;
- /** @hide @deprecated use {@link DataUnit} instead to clarify SI-vs-IEC */
+ /** @hide @deprecated use {@code DataUnit} instead to clarify SI-vs-IEC */
@Deprecated
public static final long TB_IN_BYTES = GB_IN_BYTES * 1024;
- /** @hide @deprecated use {@link DataUnit} instead to clarify SI-vs-IEC */
+ /** @hide @deprecated use {@code DataUnit} instead to clarify SI-vs-IEC */
@Deprecated
public static final long PB_IN_BYTES = TB_IN_BYTES * 1024;
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 23bc511..f474044 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -135,7 +135,7 @@
/** Automatically destroy sessions older than this */
private static final long MAX_AGE_MILLIS = 3 * DateUtils.DAY_IN_MILLIS;
/** Automatically destroy staged sessions that have not changed state in this time */
- private static final long MAX_TIME_SINCE_UPDATE_MILLIS = 21 * DateUtils.DAY_IN_MILLIS;
+ private static final long MAX_TIME_SINCE_UPDATE_MILLIS = 7 * DateUtils.DAY_IN_MILLIS;
/** Upper bound on number of active sessions for a UID that has INSTALL_PACKAGES */
private static final long MAX_ACTIVE_SESSIONS_WITH_PERMISSION = 1024;
/** Upper bound on number of active sessions for a UID without INSTALL_PACKAGES */