Files
app_Settings/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
Arc Wang dcc46cf136 [Large screen] Fix SplitPaitRule not match for deep link problem
- Set both secondary ComponentName and secondary Intent action
  in SplitPairFilter when registering SplitPairRule for deep link.

- Set ComponentName to the Intent which DeepLinkHomepageActivity
  uses to start the deep link page.

This change setup Intent and SplitPairRule to have both
Intent action and ComponentName. It fixes matching problem.

Bug: 201627196
Bug: 199888089
Test: manual
      [Unfolded] Long press home (workspace) -> Pop-up menu ->
      Tap 'Wallpaper & style' -> Launch Settings in the left as
      list and 'Wallpaper & style' in the right as detail.
Change-Id: I8cc8cef911ce0d7d05f332eb86f77f8d2543827f
2021-10-07 17:44:24 +08:00

121 lines
4.8 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.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 com.android.settings.Utils;
import com.android.settings.homepage.SettingsHomepageActivity;
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 = SplitController.getInstance();
}
/**
* 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.
registerHomepagePlaceholderRule();
// Set subsettings rule.
registerTwoPanePairRule(mContext,
getComponentName(Settings.class),
getComponentName(SubSettings.class),
null /* secondaryIntentAction */,
true /* finishPrimaryWithSecondary */,
true /* finishSecondaryWithPrimary */);
}
/** Register a SplitPairRule for 2-pane. */
public static void registerTwoPanePairRule(Context context,
ComponentName primaryComponent,
ComponentName secondaryComponent,
String secondaryIntentAction,
boolean finishPrimaryWithSecondary,
boolean finishSecondaryWithPrimary) {
final Set<SplitPairFilter> filters = new HashSet<>();
filters.add(new SplitPairFilter(primaryComponent, secondaryComponent,
secondaryIntentAction));
SplitController.getInstance().registerRule(new SplitPairRule(filters,
finishPrimaryWithSecondary,
finishSecondaryWithPrimary, true /* clearTop */,
ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(context),
ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(context),
ActivityEmbeddingUtils.SPLIT_RATIO,
LayoutDirection.LOCALE));
}
private void registerHomepagePlaceholderRule() {
final Set<ActivityFilter> activityFilters = new HashSet<>();
activityFilters.add(new ActivityFilter(getComponentName(SettingsHomepageActivity.class),
null /* intentAction */));
activityFilters.add(new ActivityFilter(getComponentName(Settings.class),
null /* intentAction */));
activityFilters.add(new ActivityFilter(new ComponentName(Utils.SETTINGS_PACKAGE_NAME,
SettingsHomepageActivity.ALIAS_DEEP_LINK), null /* intentAction */));
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);
mSplitController.registerRule(placeholderRule);
}
@NonNull
private ComponentName getComponentName(Class<? extends Activity> activityClass) {
return new ComponentName(mContext.getPackageName(), activityClass.getName());
}
}