From 4781fc1687d7b9891a4d55f80dea8f4059c52fcf Mon Sep 17 00:00:00 2001 From: Tsung-Mao Fang Date: Mon, 6 Sep 2021 02:41:26 +0000 Subject: [PATCH] Revert "Revert "Support two pane design in the Settings app."" This reverts commit 07037dbc3fdbaceb2c95e3d3909bf20563e9e12a. Reason for revert: Bug: 197716926 Change-Id: I72b98f8feb513f34e88e735efd578a8e3d9a1963 --- AndroidManifest.xml | 4 +- .../android/settings/SettingsApplication.java | 34 ++++++ .../ActivityEmbeddingRulesController.java | 108 ++++++++++++++++++ .../ActivityEmbeddingUtils.java | 65 +++++++++++ 4 files changed, 210 insertions(+), 1 deletion(-) create mode 100644 src/com/android/settings/SettingsApplication.java create mode 100644 src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java create mode 100644 src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index c88639f39f1..d8bbe8f2de7 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -108,7 +108,9 @@ - activityFilters = new HashSet<>(); + activityFilters.add(new ActivityFilter(getComponentName(Settings.class))); + final Intent intent = new Intent(); + intent.setComponent(getComponentName(Settings.NetworkDashboardActivity.class)); + final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule( + activityFilters, + intent, + ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(mContext), + ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(mContext), + ActivityEmbeddingUtils.SPLIT_RATIO, + LayoutDirection.LOCALE); + + return placeholderRule; + } + + private SplitPairRule getSubSettingsPairRule() { + final Set pairFilters = new HashSet<>(); + pairFilters.add(new SplitPairFilter( + getComponentName(Settings.class), + getComponentName(SubSettings.class), + null /* secondaryActivityIntentAction */, + null /* secondaryActivityIntentCategory */)); + final SplitPairRule rule = new SplitPairRule( + pairFilters, + true /* finishPrimaryWithSecondary */, + true /* finishSecondaryWithPrimary */, + true /* clearTop */, + ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(mContext), + ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(mContext), + ActivityEmbeddingUtils.SPLIT_RATIO, + LayoutDirection.LOCALE); + + return rule; + } + + @NonNull + private ComponentName getComponentName(Class activityClass) { + return new ComponentName(mContext.getPackageName(), activityClass.getName()); + } +} diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java new file mode 100644 index 00000000000..96c37773fc1 --- /dev/null +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java @@ -0,0 +1,65 @@ +/* + * 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.content.Context; +import android.util.DisplayMetrics; +import android.util.FeatureFlagUtils; +import android.util.Log; +import android.util.TypedValue; + +import androidx.window.embedding.SplitController; + +/** An util class collecting all common methods for the embedding activity features. */ +public class ActivityEmbeddingUtils { + public static final float SPLIT_RATIO = 0.5f; + // The smallest value of current width of the window when the split should be used. + private static final float MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP = 600f; + // The smallest value of the smallest-width (sw) of the window in any rotation when + // the split should be used. + private static final float MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP = 600f; + private static final String TAG = "ActivityEmbeddingUtils"; + + /** Get the smallest pixel value of width of the window when the split should be used. */ + public static int getMinCurrentScreenSplitWidthPx(Context context) { + final DisplayMetrics dm = context.getResources().getDisplayMetrics(); + return (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP, dm); + } + + /** + * Get the smallest pixel value of the smallest-width (sw) of the window in any rotation when + * the split should be used. + */ + public static int getMinSmallestScreenSplitWidthPx(Context context) { + final DisplayMetrics dm = context.getResources().getDisplayMetrics(); + return (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP, dm); + } + + /** Whether to support embedding activity feature. */ + public static boolean isEmbeddingActivityEnabled(Context context) { + final boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context, + FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN); + final boolean isSplitSupported = new SplitController(context).isSplitSupported(); + + Log.d(TAG, "isFlagEnabled = " + isFlagEnabled); + Log.d(TAG, "isSplitSupported = " + isSplitSupported); + + return isFlagEnabled && isSplitSupported; + } +}