Loading AndroidManifest.xml +3 −1 Original line number Diff line number Diff line Loading @@ -108,7 +108,9 @@ <uses-permission android:name="android.permission.READ_DREAM_SUPPRESSION" /> <uses-permission android:name="android.permission.MANAGE_APP_HIBERNATION" /> <application android:label="@string/settings_label" <application android:name=".SettingsApplication" android:label="@string/settings_label" android:icon="@drawable/ic_launcher_settings" android:theme="@style/Theme.Settings" android:hardwareAccelerated="true" Loading src/com/android/settings/SettingsApplication.java 0 → 100644 +34 −0 Original line number Diff line number Diff line /* * 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 com.android.settings.activityembedding.ActivityEmbeddingRulesController; /** Settings application which sets up activity embedding rules for the large screen device. */ public class SettingsApplication extends Application { @Override public void onCreate() { super.onCreate(); final ActivityEmbeddingRulesController controller = new ActivityEmbeddingRulesController(this); controller.initRules(); } } src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java 0 → 100644 +108 −0 Original line number Diff line number Diff line /* * 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.ComponentName; import android.content.Context; import android.content.Intent; import android.util.LayoutDirection; import android.util.Log; import androidx.annotation.NonNull; import androidx.window.embedding.ActivityFilter; import androidx.window.embedding.SplitController; import androidx.window.embedding.SplitPairFilter; import androidx.window.embedding.SplitPairRule; import androidx.window.embedding.SplitPlaceholderRule; import com.android.settings.Settings; import com.android.settings.SubSettings; import java.util.HashSet; import java.util.Set; /** A class to initialize split rules for activity embedding. */ public class ActivityEmbeddingRulesController { private static final String TAG = "ActivityEmbeddingCtrl "; private final Context mContext; private final SplitController mSplitController; public ActivityEmbeddingRulesController(Context context) { mContext = context; mSplitController = new SplitController(context); } /** * Set up embedding rules to place activities to the right pane. */ public void initRules() { if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(mContext)) { Log.d(TAG, "Not support this feature now"); return; } mSplitController.clearRegisteredRules(); // Set a placeholder for home page. mSplitController.registerRule(getHomepagePlaceholderRule()); // Set subsettings rule. mSplitController.registerRule(getSubSettingsPairRule()); } private SplitPlaceholderRule getHomepagePlaceholderRule() { final Set<ActivityFilter> 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<SplitPairFilter> 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<? extends Activity> activityClass) { return new ComponentName(mContext.getPackageName(), activityClass.getName()); } } src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java 0 → 100644 +65 −0 Original line number Diff line number Diff line /* * 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; } } Loading
AndroidManifest.xml +3 −1 Original line number Diff line number Diff line Loading @@ -108,7 +108,9 @@ <uses-permission android:name="android.permission.READ_DREAM_SUPPRESSION" /> <uses-permission android:name="android.permission.MANAGE_APP_HIBERNATION" /> <application android:label="@string/settings_label" <application android:name=".SettingsApplication" android:label="@string/settings_label" android:icon="@drawable/ic_launcher_settings" android:theme="@style/Theme.Settings" android:hardwareAccelerated="true" Loading
src/com/android/settings/SettingsApplication.java 0 → 100644 +34 −0 Original line number Diff line number Diff line /* * 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 com.android.settings.activityembedding.ActivityEmbeddingRulesController; /** Settings application which sets up activity embedding rules for the large screen device. */ public class SettingsApplication extends Application { @Override public void onCreate() { super.onCreate(); final ActivityEmbeddingRulesController controller = new ActivityEmbeddingRulesController(this); controller.initRules(); } }
src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java 0 → 100644 +108 −0 Original line number Diff line number Diff line /* * 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.ComponentName; import android.content.Context; import android.content.Intent; import android.util.LayoutDirection; import android.util.Log; import androidx.annotation.NonNull; import androidx.window.embedding.ActivityFilter; import androidx.window.embedding.SplitController; import androidx.window.embedding.SplitPairFilter; import androidx.window.embedding.SplitPairRule; import androidx.window.embedding.SplitPlaceholderRule; import com.android.settings.Settings; import com.android.settings.SubSettings; import java.util.HashSet; import java.util.Set; /** A class to initialize split rules for activity embedding. */ public class ActivityEmbeddingRulesController { private static final String TAG = "ActivityEmbeddingCtrl "; private final Context mContext; private final SplitController mSplitController; public ActivityEmbeddingRulesController(Context context) { mContext = context; mSplitController = new SplitController(context); } /** * Set up embedding rules to place activities to the right pane. */ public void initRules() { if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(mContext)) { Log.d(TAG, "Not support this feature now"); return; } mSplitController.clearRegisteredRules(); // Set a placeholder for home page. mSplitController.registerRule(getHomepagePlaceholderRule()); // Set subsettings rule. mSplitController.registerRule(getSubSettingsPairRule()); } private SplitPlaceholderRule getHomepagePlaceholderRule() { final Set<ActivityFilter> 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<SplitPairFilter> 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<? extends Activity> activityClass) { return new ComponentName(mContext.getPackageName(), activityClass.getName()); } }
src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java 0 → 100644 +65 −0 Original line number Diff line number Diff line /* * 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; } }