OSDN Git Service

Add user selectable Default Browser feature - part 4
authorFabrice Di Meglio <fdimeglio@google.com>
Thu, 7 May 2015 18:52:04 +0000 (11:52 -0700)
committerFabrice Di Meglio <fdimeglio@google.com>
Thu, 7 May 2015 22:34:21 +0000 (15:34 -0700)
- refresh Browser list depending on package installation / removal

See bug #20144393

Change-Id: I529f6e0bd8b5bd4cae1dea9479acfca9cf9a6b26

src/com/android/settings/applications/DefaultBrowserPreference.java
src/com/android/settings/applications/ManageDefaultApps.java

index 4479789..32f77ba 100644 (file)
@@ -37,10 +37,10 @@ public class DefaultBrowserPreference extends AppListPreference {
         super(context, attrs);
 
         mPm = context.getPackageManager();
-        loadBrowserApps();
+        refreshBrowserApps();
     }
 
-    private void loadBrowserApps() {
+    public void refreshBrowserApps() {
         List<String> browsers = resolveBrowserApps();
 
         setPackageNames(browsers.toArray(new String[browsers.size()]), null);
index 751ddca..c41eebe 100644 (file)
@@ -23,6 +23,7 @@ import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.Handler;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.preference.Preference;
@@ -32,6 +33,7 @@ import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
 
+import com.android.internal.content.PackageMonitor;
 import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
@@ -57,6 +59,71 @@ public class ManageDefaultApps extends SettingsPreferenceFragment
     private PackageManager mPm;
     private int myUserId;
 
+    private static final long DELAY_UPDATE_BROWSER_MILLIS = 500;
+
+    private final Handler mHandler = new Handler();
+
+    private final Runnable mUpdateRunnable = new Runnable() {
+        @Override
+        public void run() {
+            updateDefaultBrowserPreference();
+        }
+    };
+
+    private final PackageMonitor mPackageMonitor = new PackageMonitor() {
+        @Override
+        public void onPackageAdded(String packageName, int uid) {
+            sendUpdate();
+        }
+
+        @Override
+        public void onPackageAppeared(String packageName, int reason) {
+            sendUpdate();
+        }
+
+        @Override
+        public void onPackageDisappeared(String packageName, int reason) {
+            sendUpdate();
+        }
+
+        @Override
+        public void onPackageRemoved(String packageName, int uid) {
+            sendUpdate();
+        }
+
+        private void sendUpdate() {
+            mHandler.postDelayed(mUpdateRunnable, DELAY_UPDATE_BROWSER_MILLIS);
+        }
+    };
+
+    private void updateDefaultBrowserPreference() {
+        mDefaultBrowserPreference.refreshBrowserApps();
+
+        final PackageManager pm = getPackageManager();
+
+        String packageName = pm.getDefaultBrowserPackageName(UserHandle.myUserId());
+        if (!TextUtils.isEmpty(packageName)) {
+            // Check if the default Browser package is still there
+            Intent intent = new Intent();
+            intent.setPackage(packageName);
+            intent.setAction(Intent.ACTION_VIEW);
+            intent.addCategory(Intent.CATEGORY_BROWSABLE);
+            intent.setData(Uri.parse("http:"));
+
+            ResolveInfo info = mPm.resolveActivityAsUser(intent, 0, myUserId);
+            if (info != null) {
+                mDefaultBrowserPreference.setValue(packageName);
+                CharSequence label = info.loadLabel(pm);
+                mDefaultBrowserPreference.setSummary(label);
+            } else {
+                mDefaultBrowserPreference.setSummary(R.string.default_browser_title_none);
+            }
+        } else {
+            mDefaultBrowserPreference.setSummary(R.string.default_browser_title_none);
+            Log.d(TAG, "Cannot set empty default Browser value!");
+        }
+    }
+
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
@@ -112,37 +179,17 @@ public class ManageDefaultApps extends SettingsPreferenceFragment
     }
 
     @Override
-    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
-        super.onViewCreated(view, savedInstanceState);
-
-        final PackageManager pm = getPackageManager();
+    public void onResume() {
+        super.onResume();
+        updateDefaultBrowserPreference();
+        mPackageMonitor.register(getActivity(), getActivity().getMainLooper(), false);
+    }
 
-        String packageName = pm.getDefaultBrowserPackageName(UserHandle.myUserId());
-        if (!TextUtils.isEmpty(packageName)) {
-            // Check if the default Browser package is still there
-            Intent intent = new Intent();
-            intent.setPackage(packageName);
-            intent.setAction(Intent.ACTION_VIEW);
-            intent.addCategory(Intent.CATEGORY_BROWSABLE);
-            intent.setData(Uri.parse("http:"));
+    @Override
+    public void onPause() {
+        super.onPause();
 
-            ResolveInfo info = mPm.resolveActivityAsUser(intent, 0, myUserId);
-            if (info != null) {
-                mDefaultBrowserPreference.setValue(packageName);
-                CharSequence label = info.loadLabel(pm);
-                mDefaultBrowserPreference.setSummary(label);
-            } else {
-                CharSequence[] values = mDefaultBrowserPreference.getEntryValues();
-                if (values.length > 0) {
-                    // Otherwise select the first one if we can
-                    mDefaultBrowserPreference.setValueIndex(0);
-                } else {
-                    // Do nothing, we cannot select any value
-                }
-            }
-        } else {
-            Log.d(TAG, "Cannot set empty default Browser value!");
-        }
+        mPackageMonitor.unregister();
     }
 
     @Override