Merge "Properly sets the display id on Autofill UIs." into udc-dev
This commit is contained in:
@@ -16,13 +16,18 @@
|
|||||||
|
|
||||||
package com.android.server.autofill;
|
package com.android.server.autofill;
|
||||||
|
|
||||||
|
import static com.android.server.autofill.Helper.sDebug;
|
||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.app.assist.AssistStructure;
|
import android.app.assist.AssistStructure;
|
||||||
import android.app.assist.AssistStructure.ViewNode;
|
import android.app.assist.AssistStructure.ViewNode;
|
||||||
import android.app.assist.AssistStructure.WindowNode;
|
import android.app.assist.AssistStructure.WindowNode;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.hardware.display.DisplayManager;
|
||||||
import android.metrics.LogMaker;
|
import android.metrics.LogMaker;
|
||||||
|
import android.os.UserManager;
|
||||||
import android.service.autofill.Dataset;
|
import android.service.autofill.Dataset;
|
||||||
import android.service.autofill.InternalSanitizer;
|
import android.service.autofill.InternalSanitizer;
|
||||||
import android.service.autofill.SaveInfo;
|
import android.service.autofill.SaveInfo;
|
||||||
@@ -30,6 +35,7 @@ import android.text.TextUtils;
|
|||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
|
import android.view.Display;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.view.autofill.AutofillId;
|
import android.view.autofill.AutofillId;
|
||||||
@@ -37,6 +43,7 @@ import android.view.autofill.AutofillValue;
|
|||||||
|
|
||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||||
import com.android.internal.util.ArrayUtils;
|
import com.android.internal.util.ArrayUtils;
|
||||||
|
import com.android.server.utils.Slogf;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
@@ -281,6 +288,38 @@ public final class Helper {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a context with the proper display id.
|
||||||
|
*
|
||||||
|
* <p>For most cases it will return the provided context, but on devices that
|
||||||
|
* {@link UserManager#isVisibleBackgroundUsersEnabled() support visible background users}, it
|
||||||
|
* will return a context with the display pased as parameter.
|
||||||
|
*/
|
||||||
|
static Context getDisplayContext(Context context, int displayId) {
|
||||||
|
if (!UserManager.isVisibleBackgroundUsersEnabled()) {
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
if (context.getDisplayId() == displayId) {
|
||||||
|
if (sDebug) {
|
||||||
|
Slogf.d(TAG, "getDisplayContext(): context %s already has displayId %d", context,
|
||||||
|
displayId);
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
if (sDebug) {
|
||||||
|
Slogf.d(TAG, "Creating context for display %d", displayId);
|
||||||
|
}
|
||||||
|
Display display = context.getSystemService(DisplayManager.class).getDisplay(displayId);
|
||||||
|
if (display == null) {
|
||||||
|
Slogf.wtf(TAG, "Could not get context with displayId %d, Autofill operations will "
|
||||||
|
+ "probably fail)", displayId);
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
|
return context.createDisplayContext(display);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private interface ViewNodeFilter {
|
private interface ViewNodeFilter {
|
||||||
boolean matches(ViewNode node);
|
boolean matches(ViewNode node);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -164,10 +164,12 @@ import com.android.internal.annotations.GuardedBy;
|
|||||||
import com.android.internal.logging.MetricsLogger;
|
import com.android.internal.logging.MetricsLogger;
|
||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||||
import com.android.internal.util.ArrayUtils;
|
import com.android.internal.util.ArrayUtils;
|
||||||
|
import com.android.server.LocalServices;
|
||||||
import com.android.server.autofill.ui.AutoFillUI;
|
import com.android.server.autofill.ui.AutoFillUI;
|
||||||
import com.android.server.autofill.ui.InlineFillUi;
|
import com.android.server.autofill.ui.InlineFillUi;
|
||||||
import com.android.server.autofill.ui.PendingUi;
|
import com.android.server.autofill.ui.PendingUi;
|
||||||
import com.android.server.inputmethod.InputMethodManagerInternal;
|
import com.android.server.inputmethod.InputMethodManagerInternal;
|
||||||
|
import com.android.server.wm.ActivityTaskManagerInternal;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
@@ -214,7 +216,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
private final AutofillManagerServiceImpl mService;
|
private final AutofillManagerServiceImpl mService;
|
||||||
private final Handler mHandler;
|
private final Handler mHandler;
|
||||||
private final AutoFillUI mUi;
|
private final AutoFillUI mUi;
|
||||||
@NonNull private final Context mContext;
|
|
||||||
|
/**
|
||||||
|
* Context associated with the session, it has the same {@link Context#getDisplayId() displayId}
|
||||||
|
* of the activity being autofilled.
|
||||||
|
*/
|
||||||
|
private final Context mContext;
|
||||||
|
|
||||||
private final MetricsLogger mMetricsLogger = new MetricsLogger();
|
private final MetricsLogger mMetricsLogger = new MetricsLogger();
|
||||||
|
|
||||||
@@ -1352,7 +1359,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
mHasCallback = hasCallback;
|
mHasCallback = hasCallback;
|
||||||
mUiLatencyHistory = uiLatencyHistory;
|
mUiLatencyHistory = uiLatencyHistory;
|
||||||
mWtfHistory = wtfHistory;
|
mWtfHistory = wtfHistory;
|
||||||
mContext = context;
|
int displayId = LocalServices.getService(ActivityTaskManagerInternal.class)
|
||||||
|
.getDisplayId(activityToken);
|
||||||
|
mContext = Helper.getDisplayContext(context, displayId);
|
||||||
mComponentName = componentName;
|
mComponentName = componentName;
|
||||||
mCompatMode = compatMode;
|
mCompatMode = compatMode;
|
||||||
mSessionState = STATE_ACTIVE;
|
mSessionState = STATE_ACTIVE;
|
||||||
@@ -3401,7 +3410,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
final long saveUiDisplayStartTimestamp = SystemClock.elapsedRealtime();
|
final long saveUiDisplayStartTimestamp = SystemClock.elapsedRealtime();
|
||||||
getUiForShowing().showSaveUi(serviceLabel, serviceIcon,
|
getUiForShowing().showSaveUi(serviceLabel, serviceIcon,
|
||||||
mService.getServicePackageName(), saveInfo, this,
|
mService.getServicePackageName(), saveInfo, this,
|
||||||
mComponentName, this, userId, mPendingSaveUi, isUpdate, mCompatMode,
|
mComponentName, this, mContext, mPendingSaveUi, isUpdate, mCompatMode,
|
||||||
response.getShowSaveDialogIcon());
|
response.getShowSaveDialogIcon());
|
||||||
mSaveEventLogger.maybeSetLatencySaveUiDisplayMillis(
|
mSaveEventLogger.maybeSetLatencySaveUiDisplayMillis(
|
||||||
SystemClock.elapsedRealtime()- saveUiDisplayStartTimestamp);
|
SystemClock.elapsedRealtime()- saveUiDisplayStartTimestamp);
|
||||||
@@ -4272,7 +4281,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
|
|
||||||
getUiForShowing().showFillUi(filledId, response, filterText,
|
getUiForShowing().showFillUi(filledId, response, filterText,
|
||||||
mService.getServicePackageName(), mComponentName,
|
mService.getServicePackageName(), mComponentName,
|
||||||
targetLabel, targetIcon, this, userId, id, mCompatMode);
|
targetLabel, targetIcon, this, mContext, id, mCompatMode);
|
||||||
|
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
mPresentationStatsEventLogger.maybeSetCountShown(
|
mPresentationStatsEventLogger.maybeSetCountShown(
|
||||||
@@ -5453,6 +5462,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
pw.print(prefix); pw.print("uid: "); pw.println(uid);
|
pw.print(prefix); pw.print("uid: "); pw.println(uid);
|
||||||
pw.print(prefix); pw.print("taskId: "); pw.println(taskId);
|
pw.print(prefix); pw.print("taskId: "); pw.println(taskId);
|
||||||
pw.print(prefix); pw.print("flags: "); pw.println(mFlags);
|
pw.print(prefix); pw.print("flags: "); pw.println(mFlags);
|
||||||
|
pw.print(prefix); pw.print("displayId: "); pw.println(mContext.getDisplayId());
|
||||||
pw.print(prefix); pw.print("state: "); pw.println(sessionStateAsString(mSessionState));
|
pw.print(prefix); pw.print("state: "); pw.println(sessionStateAsString(mSessionState));
|
||||||
pw.print(prefix); pw.print("mComponentName: "); pw.println(mComponentName);
|
pw.print(prefix); pw.print("mComponentName: "); pw.println(mComponentName);
|
||||||
pw.print(prefix); pw.print("mActivityToken: "); pw.println(mActivityToken);
|
pw.print(prefix); pw.print("mActivityToken: "); pw.println(mActivityToken);
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import static com.android.server.autofill.Helper.sVerbose;
|
|||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.annotation.UserIdInt;
|
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -53,6 +52,7 @@ import com.android.server.LocalServices;
|
|||||||
import com.android.server.UiModeManagerInternal;
|
import com.android.server.UiModeManagerInternal;
|
||||||
import com.android.server.UiThread;
|
import com.android.server.UiThread;
|
||||||
import com.android.server.autofill.Helper;
|
import com.android.server.autofill.Helper;
|
||||||
|
import com.android.server.utils.Slogf;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
@@ -198,6 +198,7 @@ public final class AutoFillUI {
|
|||||||
* @param serviceIcon icon of autofill service
|
* @param serviceIcon icon of autofill service
|
||||||
* @param callback identifier for the caller
|
* @param callback identifier for the caller
|
||||||
* @param userId the user associated wit the session
|
* @param userId the user associated wit the session
|
||||||
|
* @param context context with the proper state (like display id) to show the UI
|
||||||
* @param sessionId id of the autofill session
|
* @param sessionId id of the autofill session
|
||||||
* @param compatMode whether the app is being autofilled in compatibility mode.
|
* @param compatMode whether the app is being autofilled in compatibility mode.
|
||||||
*/
|
*/
|
||||||
@@ -205,11 +206,11 @@ public final class AutoFillUI {
|
|||||||
@Nullable String filterText, @Nullable String servicePackageName,
|
@Nullable String filterText, @Nullable String servicePackageName,
|
||||||
@NonNull ComponentName componentName, @NonNull CharSequence serviceLabel,
|
@NonNull ComponentName componentName, @NonNull CharSequence serviceLabel,
|
||||||
@NonNull Drawable serviceIcon, @NonNull AutoFillUiCallback callback,
|
@NonNull Drawable serviceIcon, @NonNull AutoFillUiCallback callback,
|
||||||
@UserIdInt int userId, int sessionId, boolean compatMode) {
|
@NonNull Context context, int sessionId, boolean compatMode) {
|
||||||
if (sDebug) {
|
if (sDebug) {
|
||||||
final int size = filterText == null ? 0 : filterText.length();
|
final int size = filterText == null ? 0 : filterText.length();
|
||||||
Slog.d(TAG, "showFillUi(): id=" + focusedId + ", filter=" + size + " chars, userId="
|
Slogf.d(TAG, "showFillUi(): id=%s, filter=%d chars, displayId=%d", focusedId, size,
|
||||||
+ userId);
|
context.getDisplayId());
|
||||||
}
|
}
|
||||||
final LogMaker log = Helper
|
final LogMaker log = Helper
|
||||||
.newLogMaker(MetricsEvent.AUTOFILL_FILL_UI, componentName, servicePackageName,
|
.newLogMaker(MetricsEvent.AUTOFILL_FILL_UI, componentName, servicePackageName,
|
||||||
@@ -224,10 +225,8 @@ public final class AutoFillUI {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
hideAllUiThread(callback);
|
hideAllUiThread(callback);
|
||||||
mFillUi = new FillUi(mContext, userId, response, focusedId,
|
mFillUi = new FillUi(context, response, focusedId, filterText, mOverlayControl,
|
||||||
filterText, mOverlayControl, serviceLabel, serviceIcon,
|
serviceLabel, serviceIcon, mUiModeMgr.isNightMode(), new FillUi.Callback() {
|
||||||
mUiModeMgr.isNightMode(),
|
|
||||||
new FillUi.Callback() {
|
|
||||||
@Override
|
@Override
|
||||||
public void onResponsePicked(FillResponse response) {
|
public void onResponsePicked(FillResponse response) {
|
||||||
log.setType(MetricsEvent.TYPE_DETAIL);
|
log.setType(MetricsEvent.TYPE_DETAIL);
|
||||||
@@ -325,12 +324,12 @@ public final class AutoFillUI {
|
|||||||
public void showSaveUi(@NonNull CharSequence serviceLabel, @NonNull Drawable serviceIcon,
|
public void showSaveUi(@NonNull CharSequence serviceLabel, @NonNull Drawable serviceIcon,
|
||||||
@Nullable String servicePackageName, @NonNull SaveInfo info,
|
@Nullable String servicePackageName, @NonNull SaveInfo info,
|
||||||
@NonNull ValueFinder valueFinder, @NonNull ComponentName componentName,
|
@NonNull ValueFinder valueFinder, @NonNull ComponentName componentName,
|
||||||
@NonNull AutoFillUiCallback callback, @UserIdInt int userId,
|
@NonNull AutoFillUiCallback callback, @NonNull Context context,
|
||||||
@NonNull PendingUi pendingSaveUi, boolean isUpdate, boolean compatMode,
|
@NonNull PendingUi pendingSaveUi, boolean isUpdate, boolean compatMode,
|
||||||
boolean showServiceIcon) {
|
boolean showServiceIcon) {
|
||||||
if (sVerbose) {
|
if (sVerbose) {
|
||||||
Slog.v(TAG, "showSaveUi(update=" + isUpdate + ") for " + componentName.toShortString()
|
Slogf.v(TAG, "showSaveUi(update=%b) for %s and display %d: %s", isUpdate,
|
||||||
+ " and user " + userId + ": " + info);
|
componentName.toShortString(), context.getDisplayId(), info);
|
||||||
}
|
}
|
||||||
int numIds = 0;
|
int numIds = 0;
|
||||||
numIds += info.getRequiredIds() == null ? 0 : info.getRequiredIds().length;
|
numIds += info.getRequiredIds() == null ? 0 : info.getRequiredIds().length;
|
||||||
@@ -350,7 +349,7 @@ public final class AutoFillUI {
|
|||||||
}
|
}
|
||||||
hideAllUiThread(callback);
|
hideAllUiThread(callback);
|
||||||
mSaveUiCallback = callback;
|
mSaveUiCallback = callback;
|
||||||
mSaveUi = new SaveUi(mContext, userId, pendingSaveUi, serviceLabel, serviceIcon,
|
mSaveUi = new SaveUi(context, pendingSaveUi, serviceLabel, serviceIcon,
|
||||||
servicePackageName, componentName, info, valueFinder, mOverlayControl,
|
servicePackageName, componentName, info, valueFinder, mOverlayControl,
|
||||||
new SaveUi.OnSaveListener() {
|
new SaveUi.OnSaveListener() {
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,68 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package com.android.server.autofill.ui;
|
|
||||||
|
|
||||||
import static com.android.server.autofill.Helper.sDebug;
|
|
||||||
|
|
||||||
import android.annotation.UserIdInt;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.hardware.display.DisplayManager;
|
|
||||||
import android.os.UserManager;
|
|
||||||
import android.view.Display;
|
|
||||||
|
|
||||||
import com.android.server.LocalServices;
|
|
||||||
import com.android.server.pm.UserManagerInternal;
|
|
||||||
import com.android.server.utils.Slogf;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper for display-related needs.
|
|
||||||
*/
|
|
||||||
final class DisplayHelper {
|
|
||||||
|
|
||||||
private static final String TAG = "AutofillDisplayHelper";
|
|
||||||
|
|
||||||
private static final UserManagerInternal sUmi = LocalServices
|
|
||||||
.getService(UserManagerInternal.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a context with the proper display id set for the given user.
|
|
||||||
*
|
|
||||||
* <p>For most cases it will return the provided context, but on devices that
|
|
||||||
* {@link UserManager#isVisibleBackgroundUsersEnabled() support visible background users}, it
|
|
||||||
* will return a context with the display the user started visible on.
|
|
||||||
*/
|
|
||||||
static Context getDisplayContext(Context context, @UserIdInt int userId) {
|
|
||||||
if (!UserManager.isVisibleBackgroundUsersEnabled()) {
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
int displayId = sUmi.getMainDisplayAssignedToUser(userId);
|
|
||||||
if (sDebug) {
|
|
||||||
Slogf.d(TAG, "Creating context for display %d for user %d", displayId, userId);
|
|
||||||
}
|
|
||||||
Display display = context.getSystemService(DisplayManager.class).getDisplay(displayId);
|
|
||||||
if (display == null) {
|
|
||||||
Slogf.wtf(TAG, "Could not get display with id %d (which is associated with user %d; "
|
|
||||||
+ "FillUi operations will probably fail", displayId, userId);
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
|
|
||||||
return context.createDisplayContext(display);
|
|
||||||
}
|
|
||||||
|
|
||||||
private DisplayHelper() {
|
|
||||||
throw new UnsupportedOperationException("Contains only static methods");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -22,7 +22,6 @@ import static com.android.server.autofill.Helper.sVerbose;
|
|||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.annotation.UserIdInt;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.IntentSender;
|
import android.content.IntentSender;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
@@ -61,6 +60,7 @@ import com.android.internal.R;
|
|||||||
import com.android.server.UiThread;
|
import com.android.server.UiThread;
|
||||||
import com.android.server.autofill.AutofillManagerService;
|
import com.android.server.autofill.AutofillManagerService;
|
||||||
import com.android.server.autofill.Helper;
|
import com.android.server.autofill.Helper;
|
||||||
|
import com.android.server.utils.Slogf;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -134,14 +134,15 @@ final class FillUi {
|
|||||||
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK);
|
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
FillUi(@NonNull Context systemContext, @UserIdInt int userId, @NonNull FillResponse response,
|
FillUi(@NonNull Context context, @NonNull FillResponse response,
|
||||||
@NonNull AutofillId focusedViewId, @Nullable String filterText,
|
@NonNull AutofillId focusedViewId, @Nullable String filterText,
|
||||||
@NonNull OverlayControl overlayControl, @NonNull CharSequence serviceLabel,
|
@NonNull OverlayControl overlayControl, @NonNull CharSequence serviceLabel,
|
||||||
@NonNull Drawable serviceIcon, boolean nightMode, @NonNull Callback callback) {
|
@NonNull Drawable serviceIcon, boolean nightMode, @NonNull Callback callback) {
|
||||||
if (sVerbose) Slog.v(TAG, "nightMode: " + nightMode);
|
if (sVerbose) {
|
||||||
|
Slogf.v(TAG, "nightMode: %b displayId: %d", nightMode, context.getDisplayId());
|
||||||
|
}
|
||||||
mThemeId = nightMode ? THEME_ID_DARK : THEME_ID_LIGHT;
|
mThemeId = nightMode ? THEME_ID_DARK : THEME_ID_LIGHT;
|
||||||
mCallback = callback;
|
mCallback = callback;
|
||||||
Context context = DisplayHelper.getDisplayContext(systemContext, userId);
|
|
||||||
mFullScreen = isFullScreen(context);
|
mFullScreen = isFullScreen(context);
|
||||||
mContext = new ContextThemeWrapper(context, mThemeId);
|
mContext = new ContextThemeWrapper(context, mThemeId);
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import static com.android.server.autofill.Helper.sVerbose;
|
|||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.annotation.UserIdInt;
|
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
@@ -71,6 +70,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
|||||||
import com.android.internal.util.ArrayUtils;
|
import com.android.internal.util.ArrayUtils;
|
||||||
import com.android.server.UiThread;
|
import com.android.server.UiThread;
|
||||||
import com.android.server.autofill.Helper;
|
import com.android.server.autofill.Helper;
|
||||||
|
import com.android.server.utils.Slogf;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -173,14 +173,15 @@ final class SaveUi {
|
|||||||
|
|
||||||
private boolean mDestroyed;
|
private boolean mDestroyed;
|
||||||
|
|
||||||
SaveUi(@NonNull Context systemContext, @UserIdInt int userId, @NonNull PendingUi pendingUi,
|
SaveUi(@NonNull Context context, @NonNull PendingUi pendingUi,
|
||||||
@NonNull CharSequence serviceLabel, @NonNull Drawable serviceIcon,
|
@NonNull CharSequence serviceLabel, @NonNull Drawable serviceIcon,
|
||||||
@Nullable String servicePackageName, @NonNull ComponentName componentName,
|
@Nullable String servicePackageName, @NonNull ComponentName componentName,
|
||||||
@NonNull SaveInfo info, @NonNull ValueFinder valueFinder,
|
@NonNull SaveInfo info, @NonNull ValueFinder valueFinder,
|
||||||
@NonNull OverlayControl overlayControl, @NonNull OnSaveListener listener,
|
@NonNull OverlayControl overlayControl, @NonNull OnSaveListener listener,
|
||||||
boolean nightMode, boolean isUpdate, boolean compatMode, boolean showServiceIcon) {
|
boolean nightMode, boolean isUpdate, boolean compatMode, boolean showServiceIcon) {
|
||||||
Context context = DisplayHelper.getDisplayContext(systemContext, userId);
|
if (sVerbose) {
|
||||||
if (sVerbose) Slog.v(TAG, "nightMode: " + nightMode);
|
Slogf.v(TAG, "nightMode: %b displayId: %d", nightMode, context.getDisplayId());
|
||||||
|
}
|
||||||
mThemeId = nightMode ? THEME_ID_DARK : THEME_ID_LIGHT;
|
mThemeId = nightMode ? THEME_ID_DARK : THEME_ID_LIGHT;
|
||||||
mPendingUi = pendingUi;
|
mPendingUi = pendingUi;
|
||||||
mListener = new OneActionThenDestroyListener(listener);
|
mListener = new OneActionThenDestroyListener(listener);
|
||||||
|
|||||||
@@ -755,4 +755,10 @@ public abstract class ActivityTaskManagerInternal {
|
|||||||
|
|
||||||
/** Unregister a task stack listener so that it stops receiving callbacks. */;
|
/** Unregister a task stack listener so that it stops receiving callbacks. */;
|
||||||
public abstract void unregisterTaskStackListener(ITaskStackListener listener);
|
public abstract void unregisterTaskStackListener(ITaskStackListener listener);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the id of the display the activity was launched on.
|
||||||
|
* @param token The activity token.
|
||||||
|
*/
|
||||||
|
public abstract int getDisplayId(IBinder token);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5815,6 +5815,18 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDisplayId(IBinder token) {
|
||||||
|
synchronized (mGlobalLock) {
|
||||||
|
ActivityRecord r = ActivityRecord.forTokenLocked(token);
|
||||||
|
if (r == null) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"setFocusedActivity: No activity record matching token=" + token);
|
||||||
|
}
|
||||||
|
return r.getDisplayId();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerScreenObserver(ScreenObserver observer) {
|
public void registerScreenObserver(ScreenObserver observer) {
|
||||||
mScreenObservers.add(observer);
|
mScreenObservers.add(observer);
|
||||||
|
|||||||
Reference in New Issue
Block a user