Files
app_Settings/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
Jason Chiu f18920bc5e Disable the large screen optimization system property by default
When the property is true, Settings will invoke SplitController's APIs
to check if split support is available. However on a regular phone, it's
uncessary to take time to execute the APIs, which impacts the app
startup time.

Setting the property false by default can help skip the API invocation
when the property is not set. Developers can customize it in the build
file for large screen devices.

Test: build
Bug: 297794010
Change-Id: I91822d4b6afd49cd08fc546fbe5f231b2debc0f2
2023-11-10 01:19:10 +00:00

135 lines
5.6 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.activityembedding;
import android.app.Activity;
import android.content.Context;
import android.os.SystemProperties;
import android.util.DisplayMetrics;
import android.util.FeatureFlagUtils;
import android.util.Log;
import android.util.TypedValue;
import androidx.window.embedding.ActivityEmbeddingController;
import androidx.window.embedding.SplitController;
import com.android.settings.R;
import com.google.android.setupcompat.util.WizardManagerHelper;
/** An util class collecting all common methods for the embedding activity features. */
public class ActivityEmbeddingUtils {
// The smallest value of current width of the window when the split should be used.
private static final int MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP = 720;
// The smallest value of the smallest-width (sw) of the window in any rotation when
// the split should be used.
private static final int MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP = 600;
// The minimum width of the activity to show the regular homepage layout.
private static final float MIN_REGULAR_HOMEPAGE_LAYOUT_WIDTH_DP = 380f;
/**
* Indicates whether to enable large screen optimization if the device supports
* the Activity Embedding split feature.
* <p>
* Note that the large screen optimization won't be enabled if the device doesn't support the
* Activity Embedding feature regardless of this property value.
*
* @see androidx.window.embedding.SplitController#getSplitSupportStatus
* @see androidx.window.embedding.SplitController.SplitSupportStatus#SPLIT_AVAILABLE
* @see androidx.window.embedding.SplitController.SplitSupportStatus#SPLIT_UNAVAILABLE
*/
private static final boolean SHOULD_ENABLE_LARGE_SCREEN_OPTIMIZATION =
SystemProperties.getBoolean("persist.settings.large_screen_opt.enabled", false);
private static final String TAG = "ActivityEmbeddingUtils";
/** Get the smallest width dp of the window when the split should be used. */
public static int getMinCurrentScreenSplitWidthDp() {
return MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP;
}
/**
* Get the smallest dp value of the smallest-width (sw) of the window in any rotation when
* the split should be used.
*/
public static int getMinSmallestScreenSplitWidthDp() {
return MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP;
}
/**
* Get the ratio to use when splitting windows. This should be a float which describes
* the percentage of the screen which the first window should occupy.
*/
public static float getSplitRatio(Context context) {
return context.getResources().getFloat(R.dimen.config_activity_embed_split_ratio);
}
/**
* Returns {@code true} to indicate that Settings app support the Activity Embedding feature on
* this device. Returns {@code false}, otherwise.
*/
public static boolean isSettingsSplitEnabled(Context context) {
return SHOULD_ENABLE_LARGE_SCREEN_OPTIMIZATION
&& SplitController.getInstance(context).getSplitSupportStatus()
== SplitController.SplitSupportStatus.SPLIT_AVAILABLE;
}
/**
* Checks whether to support embedding activity feature with following conditions:
* <ul>
* <li>Whether {@link #isSettingsSplitEnabled(Context)}</li>
* <li>Whether {@link FeatureFlagUtils#SETTINGS_SUPPORT_LARGE_SCREEN} is enabled</li>
* <li>Whether User setup is completed</li>
* </ul>
*/
public static boolean isEmbeddingActivityEnabled(Context context) {
// Activity Embedding feature is not enabled if Settings doesn't enable large screen
// optimization or the device is not supported.
if (!isSettingsSplitEnabled(context)) {
Log.d(TAG, "isSettingsSplitSupported = false");
return false;
}
// Activity Embedding feature is not enabled if a user chooses to disable the feature.
if (!FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN)) {
Log.d(TAG, "isFlagEnabled = false");
return false;
}
// Don't enable Activity embedding for setup wizard.
if (!WizardManagerHelper.isUserSetupComplete(context)) {
Log.d(TAG, "isUserSetupComplete = false");
return false;
}
Log.d(TAG, "isEmbeddingActivityEnabled = true");
return true;
}
/** Whether to show the regular or simplified homepage layout. */
public static boolean isRegularHomepageLayout(Activity activity) {
DisplayMetrics dm = activity.getResources().getDisplayMetrics();
return dm.widthPixels >= (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, MIN_REGULAR_HOMEPAGE_LAYOUT_WIDTH_DP, dm);
}
/**
* Check if activity is already embedded
*/
public static boolean isAlreadyEmbedded(Activity activity) {
return isEmbeddingActivityEnabled(activity) && ActivityEmbeddingController.getInstance(
activity).isActivityEmbedded(activity);
}
}