Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b0a464fd authored by Fabrice Di Meglio's avatar Fabrice Di Meglio
Browse files

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
parent ceb335f8
Loading
Loading
Loading
Loading
+0 −14
Original line number Diff line number Diff line
@@ -1832,19 +1832,5 @@
            </intent-filter>
        </provider>

        <receiver android:name=".search.HomePackageReceiver"
                  android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <action android:name="android.intent.action.PACKAGE_CHANGED" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />

                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.LAUNCHER" />

                <data android:scheme="package"/>
            </intent-filter>
        </receiver>

    </application>
</manifest>
+35 −9
Original line number Diff line number Diff line
@@ -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<HomeAppPreference> mPrefs;
    HomeAppPreference mCurrentHome = null;
    final IntentFilter mHomeFilter;
    boolean mShowNotice;
    private PreferenceGroup mPrefGroup;
    private PackageManager mPm;
    private ComponentName[] mHomeComponentSet;
    private ArrayList<HomeAppPreference> 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<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>();
        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;
+13 −17
Original line number Diff line number Diff line
@@ -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<DashboardCategory> mCategories = new ArrayList<DashboardCategory>();
    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<DashboardCategory> getDashboardCategories() {
        if (mNeedToRebuildCategories || mCategories.size() == 0) {
    public List<DashboardCategory> 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
+35 −10
Original line number Diff line number Diff line
@@ -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<DashboardCategory> 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) {

+0 −36
Original line number Diff line number Diff line
/*
 * 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);
    }
}