Merge "Reduce unnecessary overhead of SystemUiContext" into sc-v2-dev am: 7b7568a112

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16426618

Change-Id: Ie3ff5a436caa8e6512382cee237f14795d4bc8ce
This commit is contained in:
Riddle Hsu
2021-12-10 03:18:41 +00:00
committed by Automerger Merge Worker
4 changed files with 44 additions and 25 deletions

View File

@@ -321,7 +321,8 @@ public final class ActivityThread extends ClientTransactionHandler
@UnsupportedAppUsage
private ContextImpl mSystemContext;
private final SparseArray<ContextImpl> mDisplaySystemUiContexts = new SparseArray<>();
@GuardedBy("this")
private SparseArray<ContextImpl> mDisplaySystemUiContexts;
@UnsupportedAppUsage
static volatile IPackageManager sPackageManager;
@@ -2650,7 +2651,6 @@ public final class ActivityThread extends ClientTransactionHandler
}
}
@Override
@NonNull
public ContextImpl getSystemUiContext() {
return getSystemUiContext(DEFAULT_DISPLAY);
@@ -2664,6 +2664,9 @@ public final class ActivityThread extends ClientTransactionHandler
@NonNull
public ContextImpl getSystemUiContext(int displayId) {
synchronized (this) {
if (mDisplaySystemUiContexts == null) {
mDisplaySystemUiContexts = new SparseArray<>();
}
ContextImpl systemUiContext = mDisplaySystemUiContexts.get(displayId);
if (systemUiContext == null) {
systemUiContext = ContextImpl.createSystemUiContext(getSystemContext(), displayId);
@@ -2673,6 +2676,15 @@ public final class ActivityThread extends ClientTransactionHandler
}
}
@Nullable
@Override
public ContextImpl getSystemUiContextNoCreate() {
synchronized (this) {
if (mDisplaySystemUiContexts == null) return null;
return mDisplaySystemUiContexts.get(DEFAULT_DISPLAY);
}
}
public void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) {
synchronized (this) {
getSystemContext().installSystemApplicationInfo(info, classLoader);

View File

@@ -28,7 +28,7 @@ import java.util.ArrayList;
interface ActivityThreadInternal {
ContextImpl getSystemContext();
ContextImpl getSystemUiContext();
ContextImpl getSystemUiContextNoCreate();
boolean isInDensityCompatMode();

View File

@@ -154,9 +154,12 @@ class ConfigurationController {
int configDiff;
boolean equivalent;
// Get theme outside of synchronization to avoid nested lock.
final Resources.Theme systemTheme = mActivityThread.getSystemContext().getTheme();
final ContextImpl systemUiContext = mActivityThread.getSystemUiContextNoCreate();
final Resources.Theme systemUiTheme =
systemUiContext != null ? systemUiContext.getTheme() : null;
synchronized (mResourcesManager) {
final Resources.Theme systemTheme = mActivityThread.getSystemContext().getTheme();
final Resources.Theme systemUiTheme = mActivityThread.getSystemUiContext().getTheme();
if (mPendingConfiguration != null) {
if (!mPendingConfiguration.isOtherSeqNewer(config)) {
config = mPendingConfiguration;
@@ -207,7 +210,8 @@ class ConfigurationController {
systemTheme.rebase();
}
if ((systemUiTheme.getChangingConfigurations() & configDiff) != 0) {
if (systemUiTheme != null
&& (systemUiTheme.getChangingConfigurations() & configDiff) != 0) {
systemUiTheme.rebase();
}
}

View File

@@ -173,7 +173,7 @@ class WindowContextListenerController {
@VisibleForTesting
class WindowContextListenerImpl implements WindowContainerListener {
@NonNull private final IBinder mClientToken;
@NonNull private final IWindowToken mClientToken;
private final int mOwnerUid;
@NonNull private WindowContainer<?> mContainer;
/**
@@ -193,7 +193,7 @@ class WindowContextListenerController {
private WindowContextListenerImpl(IBinder clientToken, WindowContainer<?> container,
int ownerUid, @WindowType int type, @Nullable Bundle options) {
mClientToken = clientToken;
mClientToken = IWindowToken.Stub.asInterface(clientToken);
mContainer = Objects.requireNonNull(container);
mOwnerUid = ownerUid;
mType = type;
@@ -205,7 +205,7 @@ class WindowContextListenerController {
mDeathRecipient = deathRecipient;
} catch (RemoteException e) {
ProtoLog.e(WM_ERROR, "Could not register window container listener token=%s, "
+ "container=%s", mClientToken, mContainer);
+ "container=%s", clientToken, mContainer);
}
}
@@ -228,17 +228,17 @@ class WindowContextListenerController {
}
private void register() {
final IBinder token = mClientToken.asBinder();
if (mDeathRecipient == null) {
throw new IllegalStateException("Invalid client token: " + mClientToken);
throw new IllegalStateException("Invalid client token: " + token);
}
mListeners.putIfAbsent(mClientToken, this);
mListeners.putIfAbsent(token, this);
mContainer.registerWindowContainerListener(this);
reportConfigToWindowTokenClient();
}
private void unregister() {
mContainer.unregisterWindowContainerListener(this);
mListeners.remove(mClientToken);
mListeners.remove(mClientToken.asBinder());
}
private void clear() {
@@ -258,19 +258,24 @@ class WindowContextListenerController {
private void reportConfigToWindowTokenClient() {
if (mDeathRecipient == null) {
throw new IllegalStateException("Invalid client token: " + mClientToken);
throw new IllegalStateException("Invalid client token: " + mClientToken.asBinder());
}
final DisplayContent dc = mContainer.getDisplayContent();
if (!dc.isReady()) {
// Do not report configuration when booting. The latest configuration will be sent
// when WindowManagerService#displayReady().
return;
}
// If the display of window context associated window container is suspended, don't
// report the configuration update. Note that we still dispatch the configuration update
// to WindowProviderService to make it compatible with Service#onConfigurationChanged.
// Service always receives #onConfigurationChanged callback regardless of display state.
if (!isWindowProviderService(mOptions)
&& isSuspendedState(mContainer.getDisplayContent().getDisplayInfo().state)) {
if (!isWindowProviderService(mOptions) && isSuspendedState(dc.getDisplayInfo().state)) {
mHasPendingConfiguration = true;
return;
}
final Configuration config = mContainer.getConfiguration();
final int displayId = mContainer.getDisplayContent().getDisplayId();
final int displayId = dc.getDisplayId();
if (mLastReportedConfig == null) {
mLastReportedConfig = new Configuration();
}
@@ -282,9 +287,8 @@ class WindowContextListenerController {
mLastReportedConfig.setTo(config);
mLastReportedDisplay = displayId;
IWindowToken windowTokenClient = IWindowToken.Stub.asInterface(mClientToken);
try {
windowTokenClient.onConfigurationChanged(config, displayId);
mClientToken.onConfigurationChanged(config, displayId);
} catch (RemoteException e) {
ProtoLog.w(WM_ERROR, "Could not report config changes to the window token client.");
}
@@ -294,7 +298,7 @@ class WindowContextListenerController {
@Override
public void onRemoved() {
if (mDeathRecipient == null) {
throw new IllegalStateException("Invalid client token: " + mClientToken);
throw new IllegalStateException("Invalid client token: " + mClientToken.asBinder());
}
final WindowToken windowToken = mContainer.asWindowToken();
if (windowToken != null && windowToken.isFromClient()) {
@@ -312,9 +316,8 @@ class WindowContextListenerController {
}
}
mDeathRecipient.unlinkToDeath();
IWindowToken windowTokenClient = IWindowToken.Stub.asInterface(mClientToken);
try {
windowTokenClient.onWindowTokenRemoved();
mClientToken.onWindowTokenRemoved();
} catch (RemoteException e) {
ProtoLog.w(WM_ERROR, "Could not report token removal to the window token client.");
}
@@ -323,7 +326,7 @@ class WindowContextListenerController {
@Override
public String toString() {
return "WindowContextListenerImpl{clientToken=" + mClientToken + ", "
return "WindowContextListenerImpl{clientToken=" + mClientToken.asBinder() + ", "
+ "container=" + mContainer + "}";
}
@@ -337,11 +340,11 @@ class WindowContextListenerController {
}
void linkToDeath() throws RemoteException {
mClientToken.linkToDeath(this, 0);
mClientToken.asBinder().linkToDeath(this, 0);
}
void unlinkToDeath() {
mClientToken.unlinkToDeath(this, 0);
mClientToken.asBinder().unlinkToDeath(this, 0);
}
}
}