Snap for 6650198 from f1f700094c to rvc-release
Change-Id: Ida95aeac0a9ad731bbb93131ce75d823f0a9b59d
This commit is contained in:
@@ -94,10 +94,8 @@ java_defaults {
|
||||
|
||||
annotations_enabled: true,
|
||||
|
||||
// The stub libraries must be visible to frameworks/base so they can be combined
|
||||
// into API specific libraries.
|
||||
stubs_library_visibility: [
|
||||
"//frameworks/base", // Framework
|
||||
"//visibility:public",
|
||||
],
|
||||
|
||||
// Set the visibility of the modules creating the stubs source.
|
||||
|
||||
@@ -404,7 +404,7 @@ public class MediaSession2 implements AutoCloseable {
|
||||
mCallback.onPostConnect(MediaSession2.this, controllerInfo);
|
||||
connected = true;
|
||||
} finally {
|
||||
if (!connected) {
|
||||
if (!connected || isClosed()) {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "Rejecting connection or notifying that session is closed"
|
||||
+ ", controllerInfo=" + controllerInfo);
|
||||
|
||||
@@ -1454,11 +1454,22 @@ public interface WindowManager extends ViewManager {
|
||||
@Deprecated
|
||||
public static final int FLAG_LAYOUT_INSET_DECOR = 0x00010000;
|
||||
|
||||
/** Window flag: When set, input method can't interact with the focusable window
|
||||
* and can be placed to use more space and cover the input method.
|
||||
* Note: When combined with {@link #FLAG_NOT_FOCUSABLE}, this flag has no
|
||||
* effect since input method cannot interact with windows having {@link #FLAG_NOT_FOCUSABLE}
|
||||
* flag set.
|
||||
/** Window flag: when set, inverts the input method focusability of the window.
|
||||
*
|
||||
* The effect of setting this flag depends on whether {@link #FLAG_NOT_FOCUSABLE} is set:
|
||||
* <p>
|
||||
* If {@link #FLAG_NOT_FOCUSABLE} is <em>not</em> set, i.e. when the window is focusable,
|
||||
* setting this flag prevents this window from becoming the target of the input method.
|
||||
* Consequently, it will <em>not</em> be able to interact with the input method,
|
||||
* and will be layered above the input method (unless there is another input method
|
||||
* target above it).
|
||||
*
|
||||
* <p>
|
||||
* If {@link #FLAG_NOT_FOCUSABLE} <em>is</em> set, setting this flag requests for the window
|
||||
* to be the input method target even though the window is <em>not</em> focusable.
|
||||
* Consequently, it will be layered below the input method.
|
||||
* Note: Windows that set {@link #FLAG_NOT_FOCUSABLE} cannot interact with the input method,
|
||||
* regardless of this flag.
|
||||
*/
|
||||
public static final int FLAG_ALT_FOCUSABLE_IM = 0x00020000;
|
||||
|
||||
@@ -2142,13 +2153,12 @@ public interface WindowManager extends ViewManager {
|
||||
* focus. In particular, this checks the
|
||||
* {@link #FLAG_NOT_FOCUSABLE} and {@link #FLAG_ALT_FOCUSABLE_IM}
|
||||
* flags and returns true if the combination of the two corresponds
|
||||
* to a window that needs to be behind the input method so that the
|
||||
* user can type into it.
|
||||
* to a window that can use the input method.
|
||||
*
|
||||
* @param flags The current window manager flags.
|
||||
*
|
||||
* @return Returns {@code true} if such a window should be behind/interact
|
||||
* with an input method, {@code false} if not.
|
||||
* @return Returns {@code true} if a window with the given flags would be able to
|
||||
* use the input method, {@code false} if not.
|
||||
*/
|
||||
public static boolean mayUseInputMethod(int flags) {
|
||||
return (flags & FLAG_NOT_FOCUSABLE) != FLAG_NOT_FOCUSABLE
|
||||
|
||||
@@ -313,6 +313,14 @@ public final class MediaRoute2Info implements Parcelable {
|
||||
public static final String FEATURE_REMOTE_VIDEO_PLAYBACK =
|
||||
"android.media.route.feature.REMOTE_VIDEO_PLAYBACK";
|
||||
|
||||
/**
|
||||
* Route feature: Remote group playback.
|
||||
* <p>
|
||||
* @hide
|
||||
*/
|
||||
public static final String FEATURE_REMOTE_GROUP_PLAYBACK =
|
||||
"android.media.route.feature.REMOTE_GROUP_PLAYBACK";
|
||||
|
||||
final String mId;
|
||||
final CharSequence mName;
|
||||
final List<String> mFeatures;
|
||||
|
||||
@@ -4736,7 +4736,7 @@ class StorageManagerService extends IStorageManager.Stub
|
||||
return true;
|
||||
}
|
||||
|
||||
private void killAppForOpChange(int code, int uid, String packageName) {
|
||||
private void killAppForOpChange(int code, int uid) {
|
||||
final IActivityManager am = ActivityManager.getService();
|
||||
try {
|
||||
am.killUid(UserHandle.getAppId(uid), UserHandle.USER_ALL,
|
||||
@@ -4753,7 +4753,7 @@ class StorageManagerService extends IStorageManager.Stub
|
||||
switch(code) {
|
||||
case OP_REQUEST_INSTALL_PACKAGES:
|
||||
// Always kill regardless of op change, to remount apps /storage
|
||||
killAppForOpChange(code, uid, packageName);
|
||||
killAppForOpChange(code, uid);
|
||||
return;
|
||||
case OP_MANAGE_EXTERNAL_STORAGE:
|
||||
if (mode != MODE_ALLOWED) {
|
||||
@@ -4762,12 +4762,7 @@ class StorageManagerService extends IStorageManager.Stub
|
||||
// results in a bad UX, especially since the gid only gives access
|
||||
// to unreliable volumes, USB OTGs that are rarely mounted. The app
|
||||
// will get the external_storage gid on next organic restart.
|
||||
if (packageName != null) {
|
||||
killAppForOpChange(code, uid, packageName);
|
||||
} else {
|
||||
// TODO(b/158283222) this can happen, figure out if we need
|
||||
// to kill in this case as well.
|
||||
}
|
||||
killAppForOpChange(code, uid);
|
||||
}
|
||||
return;
|
||||
case OP_LEGACY_STORAGE:
|
||||
|
||||
@@ -2099,7 +2099,7 @@ public class MediaSessionService extends SystemService implements Monitor {
|
||||
boolean asSystemService, KeyEvent keyEvent, boolean needWakeLock) {
|
||||
if (mCurrentFullUserRecord.getMediaButtonSessionLocked()
|
||||
instanceof MediaSession2Record) {
|
||||
// TODO(jaewan): Implement
|
||||
// TODO(jaewan): Make MediaSession2 to receive media key event
|
||||
return;
|
||||
}
|
||||
MediaSessionRecord session = null;
|
||||
|
||||
@@ -244,6 +244,10 @@ class MediaSessionStack {
|
||||
private MediaSessionRecordImpl findMediaButtonSession(int uid) {
|
||||
MediaSessionRecordImpl mediaButtonSession = null;
|
||||
for (MediaSessionRecordImpl session : mSessions) {
|
||||
if (session instanceof MediaSession2Record) {
|
||||
// TODO(jaewan): Make MediaSession2 to receive media key event
|
||||
continue;
|
||||
}
|
||||
if (uid == session.getUid()) {
|
||||
if (session.checkPlaybackActiveState(
|
||||
mAudioPlayerStateMonitor.isPlaybackActive(session.getUid()))) {
|
||||
|
||||
@@ -115,7 +115,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub {
|
||||
private static final String TAG = "UriGrantsManagerService";
|
||||
// Maximum number of persisted Uri grants a package is allowed
|
||||
private static final int MAX_PERSISTED_URI_GRANTS = 128;
|
||||
private static final boolean ENABLE_DYNAMIC_PERMISSIONS = true;
|
||||
private static final boolean ENABLE_DYNAMIC_PERMISSIONS = false;
|
||||
|
||||
private final Object mLock = new Object();
|
||||
private final H mH;
|
||||
|
||||
@@ -40,6 +40,7 @@ import android.util.ArraySet;
|
||||
import android.util.Slog;
|
||||
import android.view.InsetsSource;
|
||||
import android.view.InsetsState;
|
||||
import android.view.InsetsState.InternalInsetsType;
|
||||
import android.view.SurfaceControl;
|
||||
import android.view.ThreadedRenderer;
|
||||
import android.view.WindowInsets;
|
||||
@@ -480,7 +481,9 @@ class TaskSnapshotController {
|
||||
task.getTaskDescription().getBackgroundColor(), 255);
|
||||
final LayoutParams attrs = mainWindow.getAttrs();
|
||||
final InsetsPolicy insetsPolicy = mainWindow.getDisplayContent().getInsetsPolicy();
|
||||
final InsetsState insetsState = insetsPolicy.getInsetsForDispatch(mainWindow);
|
||||
final InsetsState insetsState =
|
||||
new InsetsState(insetsPolicy.getInsetsForDispatch(mainWindow));
|
||||
mergeInsetsSources(insetsState, mainWindow.getRequestedInsetsState());
|
||||
final Rect systemBarInsets = getSystemBarInsets(mainWindow.getFrameLw(), insetsState);
|
||||
final SystemBarBackgroundPainter decorPainter = new SystemBarBackgroundPainter(attrs.flags,
|
||||
attrs.privateFlags, attrs.systemUiVisibility, task.getTaskDescription(),
|
||||
@@ -600,6 +603,15 @@ class TaskSnapshotController {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mergeInsetsSources(InsetsState base, InsetsState other) {
|
||||
for (@InternalInsetsType int type = 0; type < InsetsState.SIZE; type++) {
|
||||
final InsetsSource source = other.peekSource(type);
|
||||
if (source != null) {
|
||||
base.addSource(source);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static Rect getSystemBarInsets(Rect frame, InsetsState state) {
|
||||
return state.calculateInsets(frame, null /* ignoringVisibilityState */,
|
||||
false /* isScreenRound */, false /* alwaysConsumeSystemBars */,
|
||||
|
||||
@@ -42,6 +42,7 @@ import static com.android.internal.policy.DecorView.STATUS_BAR_COLOR_VIEW_ATTRIB
|
||||
import static com.android.internal.policy.DecorView.getNavigationBarRect;
|
||||
import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_STARTING_WINDOW;
|
||||
import static com.android.server.wm.TaskSnapshotController.getSystemBarInsets;
|
||||
import static com.android.server.wm.TaskSnapshotController.mergeInsetsSources;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
|
||||
|
||||
@@ -243,7 +244,9 @@ class TaskSnapshotSurface implements StartingSurface {
|
||||
|
||||
final InsetsPolicy insetsPolicy = topFullscreenOpaqueWindow.getDisplayContent()
|
||||
.getInsetsPolicy();
|
||||
insetsState = insetsPolicy.getInsetsForDispatch(topFullscreenOpaqueWindow);
|
||||
insetsState =
|
||||
new InsetsState(insetsPolicy.getInsetsForDispatch(topFullscreenOpaqueWindow));
|
||||
mergeInsetsSources(insetsState, topFullscreenOpaqueWindow.getRequestedInsetsState());
|
||||
}
|
||||
try {
|
||||
final int res = session.addToDisplay(window, window.mSeq, layoutParams,
|
||||
|
||||
@@ -2394,12 +2394,15 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
if (mAttrs.type == TYPE_APPLICATION_STARTING) {
|
||||
// Ignore mayUseInputMethod for starting window for now.
|
||||
// TODO(b/159911356): Remove this special casing (originally added in commit e75d872).
|
||||
} else if (PixelFormat.formatHasAlpha(mAttrs.format)) {
|
||||
// Support legacy use cases where transparent windows can still be ime target with
|
||||
// FLAG_NOT_FOCUSABLE and ALT_FOCUSABLE_IM set.
|
||||
// Certain apps listen for IME insets using transparent windows and ADJUST_NOTHING to
|
||||
// manually synchronize app content to IME animation b/144619551.
|
||||
// TODO(b/145812508): remove this once new focus management is complete b/141738570
|
||||
} else {
|
||||
// TODO(b/145812508): Clean this up in S, may depend on b/141738570
|
||||
// The current logic lets windows become the "ime target" even though they are
|
||||
// not-focusable and can thus never actually start input.
|
||||
// Ideally, this would reject windows where mayUseInputMethod() == false, but this
|
||||
// also impacts Z-ordering of and delivery of IME insets to child windows, which means
|
||||
// that simply disallowing non-focusable windows would break apps.
|
||||
// See b/159438771, b/144619551.
|
||||
|
||||
final int fl = mAttrs.flags & (FLAG_NOT_FOCUSABLE | FLAG_ALT_FOCUSABLE_IM);
|
||||
|
||||
// Can only be an IME target if both FLAG_NOT_FOCUSABLE and FLAG_ALT_FOCUSABLE_IM are
|
||||
@@ -2407,12 +2410,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
if (fl != 0 && fl != (FLAG_NOT_FOCUSABLE | FLAG_ALT_FOCUSABLE_IM)) {
|
||||
return false;
|
||||
}
|
||||
} else if (!WindowManager.LayoutParams.mayUseInputMethod(mAttrs.flags)) {
|
||||
// Can be an IME target only if:
|
||||
// 1. FLAG_NOT_FOCUSABLE is not set
|
||||
// 2. FLAG_ALT_FOCUSABLE_IM is not set
|
||||
// 3. not a starting window.
|
||||
return false;
|
||||
}
|
||||
|
||||
if (DEBUG_INPUT_METHOD) {
|
||||
|
||||
@@ -67,7 +67,6 @@ import static org.mockito.Mockito.when;
|
||||
|
||||
import android.graphics.Insets;
|
||||
import android.graphics.Matrix;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.graphics.Rect;
|
||||
import android.os.RemoteException;
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
@@ -229,22 +228,11 @@ public class WindowStateTests extends WindowTestsBase {
|
||||
appWindow.mAttrs.flags |= (FLAG_NOT_FOCUSABLE | FLAG_ALT_FOCUSABLE_IM);
|
||||
imeWindow.mAttrs.flags |= (FLAG_NOT_FOCUSABLE | FLAG_ALT_FOCUSABLE_IM);
|
||||
|
||||
// Visible app window with flags FLAG_NOT_FOCUSABLE or FLAG_ALT_FOCUSABLE_IM can't be IME
|
||||
// target while an IME window can never be an IME target regardless of its visibility
|
||||
// or flags.
|
||||
assertFalse(appWindow.canBeImeTarget());
|
||||
// Visible app window with flags can be IME target while an IME window can never be an IME
|
||||
// target regardless of its visibility or flags.
|
||||
assertTrue(appWindow.canBeImeTarget());
|
||||
assertFalse(imeWindow.canBeImeTarget());
|
||||
|
||||
// b/145812508: special legacy use-case for transparent/translucent windows.
|
||||
appWindow.mAttrs.format = PixelFormat.TRANSPARENT;
|
||||
assertTrue(appWindow.canBeImeTarget());
|
||||
|
||||
appWindow.mAttrs.format = PixelFormat.OPAQUE;
|
||||
appWindow.mAttrs.flags &= ~FLAG_ALT_FOCUSABLE_IM;
|
||||
assertFalse(appWindow.canBeImeTarget());
|
||||
appWindow.mAttrs.flags &= ~FLAG_NOT_FOCUSABLE;
|
||||
assertTrue(appWindow.canBeImeTarget());
|
||||
|
||||
// Verify PINNED windows can't be IME target.
|
||||
int initialMode = appWindow.mActivityRecord.getWindowingMode();
|
||||
appWindow.mActivityRecord.setWindowingMode(WINDOWING_MODE_PINNED);
|
||||
|
||||
Reference in New Issue
Block a user