From b0a464fd2cbbe00821d483d28e76a04ac17996ea Mon Sep 17 00:00:00 2001 From: Fabrice Di Meglio Date: Wed, 23 Jul 2014 18:15:42 -0700 Subject: [PATCH] Fix how Home Activities are refreshed - remove that HomePackageReceiver from the AndroidManifest that could force Settings to run - use a HomePackageReceiver into HomeSettings and DashboardSummary - fix also the BatteryInfoReceiver for refreshing the Dashboard Change-Id: Id3891529fc176e7e4c450f2ce723f8ac2af66c58 --- AndroidManifest.xml | 14 ------ src/com/android/settings/HomeSettings.java | 44 ++++++++++++++---- .../android/settings/SettingsActivity.java | 30 ++++++------- .../settings/dashboard/DashboardSummary.java | 45 ++++++++++++++----- .../settings/search/HomePackageReceiver.java | 36 --------------- 5 files changed, 83 insertions(+), 86 deletions(-) delete mode 100644 src/com/android/settings/search/HomePackageReceiver.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 277a56e4e39..fac2d34975c 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1832,19 +1832,5 @@ - - - - - - - - - - - - - diff --git a/src/com/android/settings/HomeSettings.java b/src/com/android/settings/HomeSettings.java index 6d5883ca035..9177c73af68 100644 --- a/src/com/android/settings/HomeSettings.java +++ b/src/com/android/settings/HomeSettings.java @@ -48,6 +48,7 @@ import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.RadioButton; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.search.Index; import com.android.settings.search.Indexable; import com.android.settings.search.SearchIndexableRaw; @@ -61,14 +62,23 @@ public class HomeSettings extends SettingsPreferenceFragment implements Indexabl public static final String HOME_SHOW_NOTICE = "show"; - PreferenceGroup mPrefGroup; + private class HomePackageReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + buildHomeActivitiesList(); + Index.getInstance(context).updateFromClassNameResource( + HomeSettings.class.getName(), true, true); + } + } - PackageManager mPm; - ComponentName[] mHomeComponentSet; - ArrayList mPrefs; - HomeAppPreference mCurrentHome = null; - final IntentFilter mHomeFilter; - boolean mShowNotice; + private PreferenceGroup mPrefGroup; + private PackageManager mPm; + private ComponentName[] mHomeComponentSet; + private ArrayList mPrefs; + private HomeAppPreference mCurrentHome = null; + private final IntentFilter mHomeFilter; + private boolean mShowNotice; + private HomePackageReceiver mHomePackageReceiver = new HomePackageReceiver(); public HomeSettings() { mHomeFilter = new IntentFilter(Intent.ACTION_MAIN); @@ -151,7 +161,7 @@ public class HomeSettings extends SettingsPreferenceFragment implements Indexabl } } - void buildHomeActivitiesList() { + private void buildHomeActivitiesList() { ArrayList homeActivities = new ArrayList(); ComponentName currentDefaultHome = mPm.getHomeActivities(homeActivities); @@ -207,10 +217,26 @@ public class HomeSettings extends SettingsPreferenceFragment implements Indexabl @Override public 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.addCategory(Intent.CATEGORY_HOME); + filter.addCategory(Intent.CATEGORY_LAUNCHER); + filter.addDataScheme("package"); + getActivity().registerReceiver(mHomePackageReceiver, filter); + buildHomeActivitiesList(); } - class HomeAppPreference extends Preference { + @Override + public void onPause() { + super.onPause(); + getActivity().unregisterReceiver(mHomePackageReceiver); + } + + private class HomeAppPreference extends Preference { ComponentName activityName; int index; HomeSettings fragment; diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index df7e0060500..62609fcf5cc 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -303,7 +303,7 @@ public class SettingsActivity extends Activity if (mBatteryPresent != batteryPresent) { mBatteryPresent = batteryPresent; - invalidateCategories(); + invalidateCategories(true); } } } @@ -333,15 +333,16 @@ public class SettingsActivity extends Activity // Categories private ArrayList mCategories = new ArrayList(); - private boolean mNeedToRebuildCategories; + private static final String MSG_DATA_FORCE_REFRESH = "msg_data_force_refresh"; private static final int MSG_BUILD_CATEGORIES = 1; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_BUILD_CATEGORIES: { - if(mNeedToRebuildCategories) { + final boolean forceRefresh = msg.getData().getBoolean(MSG_DATA_FORCE_REFRESH); + if (forceRefresh) { buildDashboardCategories(mCategories); } } break; @@ -356,10 +357,9 @@ public class SettingsActivity extends Activity return mSwitchBar; } - public List getDashboardCategories() { - if (mNeedToRebuildCategories || mCategories.size() == 0) { + public List getDashboardCategories(boolean forceRefresh) { + if (forceRefresh || mCategories.size() == 0) { buildDashboardCategories(mCategories); - mNeedToRebuildCategories = false; } return mCategories; } @@ -388,9 +388,11 @@ public class SettingsActivity extends Activity return false; } - private void invalidateCategories() { + private void invalidateCategories(boolean forceRefresh) { if (!mHandler.hasMessages(MSG_BUILD_CATEGORIES)) { - mHandler.sendEmptyMessage(MSG_BUILD_CATEGORIES); + Message msg = new Message(); + msg.what = MSG_BUILD_CATEGORIES; + msg.getData().putBoolean(MSG_DATA_FORCE_REFRESH, forceRefresh); } } @@ -711,15 +713,13 @@ public class SettingsActivity extends Activity final int newHomeActivityCount = getHomeActivitiesCount(); if (newHomeActivityCount != mHomeActivitiesCount) { mHomeActivitiesCount = newHomeActivityCount; - setNeedToRebuildCategories(true); - invalidateCategories(); + invalidateCategories(true); } mDevelopmentPreferencesListener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - setNeedToRebuildCategories(true); - invalidateCategories(); + invalidateCategories(true); } }; mDevelopmentPreferences.registerOnSharedPreferenceChangeListener( @@ -739,7 +739,6 @@ public class SettingsActivity extends Activity super.onPause(); unregisterReceiver(mBatteryInfoReceiver); - mDynamicIndexableContentMonitor.unregister(); } @@ -898,10 +897,6 @@ public class SettingsActivity extends Activity return f; } - public void setNeedToRebuildCategories(boolean need) { - mNeedToRebuildCategories = need; - } - /** * Called when the activity needs its list of categories/tiles built. * @@ -1166,6 +1161,7 @@ public class SettingsActivity extends Activity } try { + mHomeActivitiesCount = getHomeActivitiesCount(); if (mHomeActivitiesCount < 2) { // When there's only one available home app, omit this settings // category entirely at the top level UI. If the user just diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java index ed89d89f794..3e438fc0ac3 100644 --- a/src/com/android/settings/dashboard/DashboardSummary.java +++ b/src/com/android/settings/dashboard/DashboardSummary.java @@ -17,7 +17,10 @@ package com.android.settings.dashboard; import android.app.Fragment; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.content.res.Resources; import android.os.Bundle; import android.os.Handler; @@ -53,12 +56,41 @@ public class DashboardSummary extends Fragment { } }; + private class HomePackageReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + rebuildUI(context); + } + } + private HomePackageReceiver mHomePackageReceiver = new HomePackageReceiver(); + + @Override + public void onResume() { + super.onResume(); + + sendRebuildUI(); + + 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.addCategory(Intent.CATEGORY_HOME); + filter.addCategory(Intent.CATEGORY_LAUNCHER); + filter.addDataScheme("package"); + getActivity().registerReceiver(mHomePackageReceiver, filter); + } + + @Override + public void onPause() { + super.onPause(); + + getActivity().unregisterReceiver(mHomePackageReceiver); + } + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - final Context context = getActivity(); - mLayoutInflater = inflater; final View rootView = inflater.inflate(R.layout.dashboard, container, false); @@ -79,7 +111,7 @@ public class DashboardSummary extends Fragment { mDashboard.removeAllViews(); List categories = - ((SettingsActivity) context).getDashboardCategories(); + ((SettingsActivity) context).getDashboardCategories(true); final int count = categories.size(); @@ -115,13 +147,6 @@ public class DashboardSummary extends Fragment { Log.d(LOG_TAG, "rebuildUI took: " + delta + " ms"); } - @Override - public void onResume() { - super.onResume(); - - sendRebuildUI(); - } - private void updateTileView(Context context, Resources res, DashboardTile tile, ImageView tileIcon, TextView tileTextView, TextView statusTextView) { diff --git a/src/com/android/settings/search/HomePackageReceiver.java b/src/com/android/settings/search/HomePackageReceiver.java deleted file mode 100644 index a24525273bb..00000000000 --- a/src/com/android/settings/search/HomePackageReceiver.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2014 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.search; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import com.android.settings.HomeSettings; - -import java.util.Set; - -/** - * A BroadcastReceiver for detecting Home Launchers - */ -public class HomePackageReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - Index.getInstance(context).updateFromClassNameResource( - HomeSettings.class.getName(), true, true); - } -}