Fork SettingsDrawerActivity in Settings.
Settings app uses fragment classes from android framework, which is deprecated as of P. We need to switch to use fragment and associated classes to androidx. Because Settings didn't support drawer feature since Android O, we rename SettingsDrawerActivity to SettingsBaseActivity. Before we migrate to fragment of androix, we need to let SettingsBaseActivity extend FragmentActivity. Test: make RunSettingsRoboTests Bug: 110259478 Change-Id: Ifbf53f75f042da1618da16cf7837b70d298a9a14
This commit is contained in:
35
res/layout/settings_base_layout.xml
Normal file
35
res/layout/settings_base_layout.xml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<!--
|
||||||
|
Copyright (C) 2018 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.
|
||||||
|
-->
|
||||||
|
<!-- The main content view -->
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/content_parent"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
<Toolbar
|
||||||
|
android:id="@+id/action_bar"
|
||||||
|
style="?android:attr/actionBarStyle"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:theme="?android:attr/actionBarTheme"
|
||||||
|
android:navigationContentDescription="@*android:string/action_bar_up_description" />
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/content_frame"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:background="?android:attr/windowBackground" />
|
||||||
|
</LinearLayout>
|
@@ -52,6 +52,7 @@ import com.android.internal.util.ArrayUtils;
|
|||||||
import com.android.settings.Settings.WifiSettingsActivity;
|
import com.android.settings.Settings.WifiSettingsActivity;
|
||||||
import com.android.settings.applications.manageapplications.ManageApplications;
|
import com.android.settings.applications.manageapplications.ManageApplications;
|
||||||
import com.android.settings.backup.BackupSettingsActivity;
|
import com.android.settings.backup.BackupSettingsActivity;
|
||||||
|
import com.android.settings.core.SettingsBaseActivity;
|
||||||
import com.android.settings.core.SubSettingLauncher;
|
import com.android.settings.core.SubSettingLauncher;
|
||||||
import com.android.settings.core.gateway.SettingsGateway;
|
import com.android.settings.core.gateway.SettingsGateway;
|
||||||
import com.android.settings.dashboard.DashboardFeatureProvider;
|
import com.android.settings.dashboard.DashboardFeatureProvider;
|
||||||
@@ -64,7 +65,6 @@ import com.android.settingslib.core.instrumentation.Instrumentable;
|
|||||||
import com.android.settingslib.core.instrumentation.SharedPreferencesLogger;
|
import com.android.settingslib.core.instrumentation.SharedPreferencesLogger;
|
||||||
import com.android.settingslib.development.DevelopmentSettingsEnabler;
|
import com.android.settingslib.development.DevelopmentSettingsEnabler;
|
||||||
import com.android.settingslib.drawer.DashboardCategory;
|
import com.android.settingslib.drawer.DashboardCategory;
|
||||||
import com.android.settingslib.drawer.SettingsDrawerActivity;
|
|
||||||
import com.android.settingslib.utils.ThreadUtils;
|
import com.android.settingslib.utils.ThreadUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -76,7 +76,8 @@ import androidx.preference.Preference;
|
|||||||
import androidx.preference.PreferenceFragment;
|
import androidx.preference.PreferenceFragment;
|
||||||
import androidx.preference.PreferenceManager;
|
import androidx.preference.PreferenceManager;
|
||||||
|
|
||||||
public class SettingsActivity extends SettingsDrawerActivity
|
|
||||||
|
public class SettingsActivity extends SettingsBaseActivity
|
||||||
implements PreferenceManager.OnPreferenceTreeClickListener,
|
implements PreferenceManager.OnPreferenceTreeClickListener,
|
||||||
PreferenceFragment.OnPreferenceStartFragmentCallback,
|
PreferenceFragment.OnPreferenceStartFragmentCallback,
|
||||||
ButtonBarHandler, FragmentManager.OnBackStackChangedListener {
|
ButtonBarHandler, FragmentManager.OnBackStackChangedListener {
|
||||||
@@ -606,7 +607,7 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
private void updateTilesList() {
|
private void updateTilesList() {
|
||||||
// Generally the items that are will be changing from these updates will
|
// Generally the items that are will be changing from these updates will
|
||||||
// not be in the top list of tiles, so run it in the background and the
|
// not be in the top list of tiles, so run it in the background and the
|
||||||
// SettingsDrawerActivity will pick up on the updates automatically.
|
// SettingsBaseActivity will pick up on the updates automatically.
|
||||||
AsyncTask.execute(new Runnable() {
|
AsyncTask.execute(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
@@ -152,7 +152,6 @@ public class BackupSettingsHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Intent getIntentForDefaultBackupSettings() {
|
private Intent getIntentForDefaultBackupSettings() {
|
||||||
// Extra needed by {@link SettingsDrawerActivity} to show the back button navigation.
|
|
||||||
return new Intent(mContext, PrivacySettingsActivity.class);
|
return new Intent(mContext, PrivacySettingsActivity.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
211
src/com/android/settings/core/SettingsBaseActivity.java
Normal file
211
src/com/android/settings/core/SettingsBaseActivity.java
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (C) 2018 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.core;
|
||||||
|
|
||||||
|
import android.annotation.LayoutRes;
|
||||||
|
import android.annotation.Nullable;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.content.res.TypedArray;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.ArraySet;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.view.Window;
|
||||||
|
import android.view.WindowManager.LayoutParams;
|
||||||
|
import android.widget.Toolbar;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settingslib.drawer.CategoryManager;
|
||||||
|
import com.android.settingslib.drawer.TileUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
|
||||||
|
public class SettingsBaseActivity extends FragmentActivity {
|
||||||
|
|
||||||
|
protected static final boolean DEBUG_TIMING = false;
|
||||||
|
private static final String TAG = "SettingsBaseActivity";
|
||||||
|
private static final String DATA_SCHEME_PKG = "package";
|
||||||
|
|
||||||
|
// Serves as a temporary list of tiles to ignore until we heard back from the PM that they
|
||||||
|
// are disabled.
|
||||||
|
private static ArraySet<ComponentName> sTileBlacklist = new ArraySet<>();
|
||||||
|
|
||||||
|
private final PackageReceiver mPackageReceiver = new PackageReceiver();
|
||||||
|
private final List<CategoryListener> mCategoryListeners = new ArrayList<>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
final long startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
final TypedArray theme = getTheme().obtainStyledAttributes(android.R.styleable.Theme);
|
||||||
|
if (!theme.getBoolean(android.R.styleable.Theme_windowNoTitle, false)) {
|
||||||
|
getWindow().addFlags(LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
|
||||||
|
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||||
|
}
|
||||||
|
super.setContentView(R.layout.settings_base_layout);
|
||||||
|
|
||||||
|
final Toolbar toolbar = findViewById(R.id.action_bar);
|
||||||
|
if (theme.getBoolean(android.R.styleable.Theme_windowNoTitle, false)) {
|
||||||
|
toolbar.setVisibility(View.GONE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setActionBar(toolbar);
|
||||||
|
|
||||||
|
if (DEBUG_TIMING) {
|
||||||
|
Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime)
|
||||||
|
+ " ms");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onNavigateUp() {
|
||||||
|
if (!super.onNavigateUp()) {
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
final IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
|
||||||
|
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
|
||||||
|
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
|
||||||
|
filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
|
||||||
|
filter.addDataScheme(DATA_SCHEME_PKG);
|
||||||
|
registerReceiver(mPackageReceiver, filter);
|
||||||
|
|
||||||
|
new CategoriesUpdateTask().execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPause() {
|
||||||
|
unregisterReceiver(mPackageReceiver);
|
||||||
|
super.onPause();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addCategoryListener(CategoryListener listener) {
|
||||||
|
mCategoryListeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void remCategoryListener(CategoryListener listener) {
|
||||||
|
mCategoryListeners.remove(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setContentView(@LayoutRes int layoutResID) {
|
||||||
|
final ViewGroup parent = findViewById(R.id.content_frame);
|
||||||
|
if (parent != null) {
|
||||||
|
parent.removeAllViews();
|
||||||
|
}
|
||||||
|
LayoutInflater.from(this).inflate(layoutResID, parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setContentView(View view) {
|
||||||
|
((ViewGroup) findViewById(R.id.content_frame)).addView(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setContentView(View view, ViewGroup.LayoutParams params) {
|
||||||
|
((ViewGroup) findViewById(R.id.content_frame)).addView(view, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onCategoriesChanged() {
|
||||||
|
final int N = mCategoryListeners.size();
|
||||||
|
for (int i = 0; i < N; i++) {
|
||||||
|
mCategoryListeners.get(i).onCategoriesChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return whether or not the enabled state actually changed.
|
||||||
|
*/
|
||||||
|
public boolean setTileEnabled(ComponentName component, boolean enabled) {
|
||||||
|
final PackageManager pm = getPackageManager();
|
||||||
|
int state = pm.getComponentEnabledSetting(component);
|
||||||
|
boolean isEnabled = state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
|
||||||
|
if (isEnabled != enabled || state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
|
||||||
|
if (enabled) {
|
||||||
|
sTileBlacklist.remove(component);
|
||||||
|
} else {
|
||||||
|
sTileBlacklist.add(component);
|
||||||
|
}
|
||||||
|
pm.setComponentEnabledSetting(component, enabled
|
||||||
|
? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
|
||||||
|
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
|
||||||
|
PackageManager.DONT_KILL_APP);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates dashboard categories. Only necessary to call this after setTileEnabled
|
||||||
|
*/
|
||||||
|
public void updateCategories() {
|
||||||
|
new CategoriesUpdateTask().execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSettingPkg() {
|
||||||
|
return TileUtils.SETTING_PKG;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface CategoryListener {
|
||||||
|
void onCategoriesChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private class CategoriesUpdateTask extends AsyncTask<Void, Void, Void> {
|
||||||
|
|
||||||
|
private final CategoryManager mCategoryManager;
|
||||||
|
|
||||||
|
public CategoriesUpdateTask() {
|
||||||
|
mCategoryManager = CategoryManager.get(SettingsBaseActivity.this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Void doInBackground(Void... params) {
|
||||||
|
mCategoryManager.reloadAllCategories(SettingsBaseActivity.this, getSettingPkg());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Void result) {
|
||||||
|
mCategoryManager.updateCategoryFromBlacklist(sTileBlacklist);
|
||||||
|
onCategoriesChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class PackageReceiver extends BroadcastReceiver {
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
new CategoriesUpdateTask().execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -27,13 +27,13 @@ import android.util.Log;
|
|||||||
import com.android.settings.SettingsPreferenceFragment;
|
import com.android.settings.SettingsPreferenceFragment;
|
||||||
import com.android.settings.core.BasePreferenceController;
|
import com.android.settings.core.BasePreferenceController;
|
||||||
import com.android.settings.core.PreferenceControllerListHelper;
|
import com.android.settings.core.PreferenceControllerListHelper;
|
||||||
|
import com.android.settings.core.SettingsBaseActivity;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
import com.android.settings.search.Indexable;
|
import com.android.settings.search.Indexable;
|
||||||
import com.android.settingslib.core.AbstractPreferenceController;
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||||
import com.android.settingslib.drawer.DashboardCategory;
|
import com.android.settingslib.drawer.DashboardCategory;
|
||||||
import com.android.settingslib.drawer.SettingsDrawerActivity;
|
|
||||||
import com.android.settingslib.drawer.Tile;
|
import com.android.settingslib.drawer.Tile;
|
||||||
import com.android.settingslib.drawer.TileUtils;
|
import com.android.settingslib.drawer.TileUtils;
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ import androidx.preference.PreferenceScreen;
|
|||||||
* Base fragment for dashboard style UI containing a list of static and dynamic setting items.
|
* Base fragment for dashboard style UI containing a list of static and dynamic setting items.
|
||||||
*/
|
*/
|
||||||
public abstract class DashboardFragment extends SettingsPreferenceFragment
|
public abstract class DashboardFragment extends SettingsPreferenceFragment
|
||||||
implements SettingsDrawerActivity.CategoryListener, Indexable,
|
implements SettingsBaseActivity.CategoryListener, Indexable,
|
||||||
SummaryLoader.SummaryConsumer {
|
SummaryLoader.SummaryConsumer {
|
||||||
private static final String TAG = "DashboardFragment";
|
private static final String TAG = "DashboardFragment";
|
||||||
|
|
||||||
@@ -145,9 +145,9 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
|
|||||||
mSummaryLoader.setListening(true);
|
mSummaryLoader.setListening(true);
|
||||||
}
|
}
|
||||||
final Activity activity = getActivity();
|
final Activity activity = getActivity();
|
||||||
if (activity instanceof SettingsDrawerActivity) {
|
if (activity instanceof SettingsBaseActivity) {
|
||||||
mListeningToCategoryChange = true;
|
mListeningToCategoryChange = true;
|
||||||
((SettingsDrawerActivity) activity).addCategoryListener(this);
|
((SettingsBaseActivity) activity).addCategoryListener(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -197,8 +197,8 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
|
|||||||
}
|
}
|
||||||
if (mListeningToCategoryChange) {
|
if (mListeningToCategoryChange) {
|
||||||
final Activity activity = getActivity();
|
final Activity activity = getActivity();
|
||||||
if (activity instanceof SettingsDrawerActivity) {
|
if (activity instanceof SettingsBaseActivity) {
|
||||||
((SettingsDrawerActivity) activity).remCategoryListener(this);
|
((SettingsBaseActivity) activity).remCategoryListener(this);
|
||||||
}
|
}
|
||||||
mListeningToCategoryChange = false;
|
mListeningToCategoryChange = false;
|
||||||
}
|
}
|
||||||
|
@@ -30,6 +30,8 @@ import android.view.ViewGroup;
|
|||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.core.InstrumentedFragment;
|
import com.android.settings.core.InstrumentedFragment;
|
||||||
|
import com.android.settings.core.SettingsBaseActivity;
|
||||||
|
import com.android.settings.core.SettingsBaseActivity.CategoryListener;
|
||||||
import com.android.settings.dashboard.conditional.Condition;
|
import com.android.settings.dashboard.conditional.Condition;
|
||||||
import com.android.settings.dashboard.conditional.ConditionManager;
|
import com.android.settings.dashboard.conditional.ConditionManager;
|
||||||
import com.android.settings.dashboard.conditional.ConditionManager.ConditionListener;
|
import com.android.settings.dashboard.conditional.ConditionManager.ConditionListener;
|
||||||
@@ -40,8 +42,6 @@ import com.android.settings.overlay.FeatureFactory;
|
|||||||
import com.android.settings.widget.ActionBarShadowController;
|
import com.android.settings.widget.ActionBarShadowController;
|
||||||
import com.android.settingslib.drawer.CategoryKey;
|
import com.android.settingslib.drawer.CategoryKey;
|
||||||
import com.android.settingslib.drawer.DashboardCategory;
|
import com.android.settingslib.drawer.DashboardCategory;
|
||||||
import com.android.settingslib.drawer.SettingsDrawerActivity;
|
|
||||||
import com.android.settingslib.drawer.SettingsDrawerActivity.CategoryListener;
|
|
||||||
import com.android.settingslib.suggestions.SuggestionControllerMixin;
|
import com.android.settingslib.suggestions.SuggestionControllerMixin;
|
||||||
import com.android.settingslib.utils.ThreadUtils;
|
import com.android.settingslib.utils.ThreadUtils;
|
||||||
|
|
||||||
@@ -138,7 +138,7 @@ public class DashboardSummary extends InstrumentedFragment
|
|||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
super.onResume();
|
super.onResume();
|
||||||
|
|
||||||
((SettingsDrawerActivity) getActivity()).addCategoryListener(this);
|
((SettingsBaseActivity) getActivity()).addCategoryListener(this);
|
||||||
mSummaryLoader.setListening(true);
|
mSummaryLoader.setListening(true);
|
||||||
final int metricsCategory = getMetricsCategory();
|
final int metricsCategory = getMetricsCategory();
|
||||||
for (Condition c : mConditionManager.getConditions()) {
|
for (Condition c : mConditionManager.getConditions()) {
|
||||||
@@ -156,7 +156,7 @@ public class DashboardSummary extends InstrumentedFragment
|
|||||||
public void onPause() {
|
public void onPause() {
|
||||||
super.onPause();
|
super.onPause();
|
||||||
|
|
||||||
((SettingsDrawerActivity) getActivity()).remCategoryListener(this);
|
((SettingsBaseActivity) getActivity()).remCategoryListener(this);
|
||||||
mSummaryLoader.setListening(false);
|
mSummaryLoader.setListening(false);
|
||||||
for (Condition c : mConditionManager.getConditions()) {
|
for (Condition c : mConditionManager.getConditions()) {
|
||||||
if (c.shouldShow()) {
|
if (c.shouldShow()) {
|
||||||
|
Reference in New Issue
Block a user