Files
app_Settings/src/com/android/settings/SettingsApplication.java
Charles Chen 1815ba7828 Disable Settings large-screen optimization
Disable the optimization that is automatically enabled when
including Window Extensions through Activity Embedding.
The optimization causes to launch an additional trampoline
activity for deep links, even when the screen size is smaller
than required by Activity Embedding rules.

This CL also rename isActivityEmbeddingEnabled to
shouldEnableLargeScreenOptimization because the method
may report false even if the device supports the feature
but Settings app doesn't for performance concern.

Bug: 267725145
Bug: 279461170

Test: Build, perf metrics
Test: atest LauncherIronwoodIntegrationTests:android.platform.test.scenario.launcher.integration_tests.HomescreenCustomizationTests
Test: atest SettingsMultiPaneDeepLinkTest.java
Change-Id: I38e8c62a61a344eb7a5cbfd1cd2c2137357d1a87
2023-05-02 14:16:22 +08:00

112 lines
3.9 KiB
Java

/*
* Copyright (C) 2021 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.settings;
import android.app.Application;
import android.database.ContentObserver;
import android.net.Uri;
import android.provider.Settings;
import android.util.FeatureFlagUtils;
import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
import com.android.settings.activityembedding.ActivityEmbeddingUtils;
import com.android.settings.core.instrumentation.ElapsedTimeUtils;
import com.android.settings.homepage.SettingsHomepageActivity;
import com.android.settings.spa.SettingsSpaEnvironment;
import com.android.settingslib.applications.AppIconCacheManager;
import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory;
import com.google.android.setupcompat.util.WizardManagerHelper;
import java.lang.ref.WeakReference;
/** Settings application which sets up activity embedding rules for the large screen device. */
public class SettingsApplication extends Application {
private WeakReference<SettingsHomepageActivity> mHomeActivity = new WeakReference<>(null);
@Override
public void onCreate() {
super.onCreate();
// Add null checking to avoid test case failed.
if (getApplicationContext() != null) {
ElapsedTimeUtils.assignSuwFinishedTimeStamp(getApplicationContext());
}
// Set Spa environment.
setSpaEnvironment();
if (FeatureFlagUtils.isEnabled(this, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN)
&& ActivityEmbeddingUtils.isSettingsSplitEnabled(this)) {
if (WizardManagerHelper.isUserSetupComplete(this)) {
new ActivityEmbeddingRulesController(this).initRules();
} else {
new DeviceProvisionedObserver().registerContentObserver();
}
}
}
/**
* Set the spa environment instance.
* Override this function to set different spa environment for different Settings app.
*/
protected void setSpaEnvironment() {
SpaEnvironmentFactory.INSTANCE.reset(new SettingsSpaEnvironment(this));
}
public void setHomeActivity(SettingsHomepageActivity homeActivity) {
mHomeActivity = new WeakReference<>(homeActivity);
}
public SettingsHomepageActivity getHomeActivity() {
return mHomeActivity.get();
}
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
AppIconCacheManager.getInstance().trimMemory(level);
}
private class DeviceProvisionedObserver extends ContentObserver {
private final Uri mDeviceProvisionedUri = Settings.Secure.getUriFor(
Settings.Secure.USER_SETUP_COMPLETE);
DeviceProvisionedObserver() {
super(null /* handler */);
}
@Override
public void onChange(boolean selfChange, Uri uri, int flags) {
if (!mDeviceProvisionedUri.equals(uri)) {
return;
}
SettingsApplication.this.getContentResolver().unregisterContentObserver(this);
new ActivityEmbeddingRulesController(SettingsApplication.this).initRules();
}
public void registerContentObserver() {
SettingsApplication.this.getContentResolver().registerContentObserver(
mDeviceProvisionedUri,
false /* notifyForDescendants */,
this);
}
}
}