OSDN Git Service

Make recent location app list package based
authorLifu Tang <lifu@google.com>
Tue, 1 Oct 2013 15:24:55 +0000 (08:24 -0700)
committerLifu Tang <lifu@google.com>
Tue, 1 Oct 2013 15:55:29 +0000 (08:55 -0700)
- Link all items to app info pages instead of battery page

- Fix b/10855516

Change-Id: I241e81b179f468364b324ae714964fc3253cd2c9

src/com/android/settings/location/LocationSettings.java
src/com/android/settings/location/RecentLocationApps.java

index add82c6..7cc6f4c 100644 (file)
@@ -37,7 +37,6 @@ import android.widget.CompoundButton;
 import android.widget.Switch;
 
 import com.android.settings.R;
-import com.android.settings.fuelgauge.BatteryStatsHelper;
 
 import java.util.Collections;
 import java.util.Comparator;
@@ -62,7 +61,6 @@ public class LocationSettings extends LocationSettingsBase
     private boolean mValidListener;
     private Preference mLocationMode;
     private PreferenceCategory mCategoryRecentLocationRequests;
-    private BatteryStatsHelper mStatsHelper;
     /** Receives UPDATE_INTENT  */
     private BroadcastReceiver mReceiver;
 
@@ -77,18 +75,6 @@ public class LocationSettings extends LocationSettingsBase
     }
 
     @Override
-    public void onAttach(Activity activity) {
-        super.onAttach(activity);
-        mStatsHelper = new BatteryStatsHelper(activity, null);
-    }
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        mStatsHelper.create(icicle);
-    }
-
-    @Override
     public void onResume() {
         super.onResume();
         mSwitch = new Switch(getActivity());
@@ -107,13 +93,6 @@ public class LocationSettings extends LocationSettingsBase
         super.onPause();
         mValidListener = false;
         mSwitch.setOnCheckedChangeListener(null);
-        mStatsHelper.pause();
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        mStatsHelper.destroy();
     }
 
     private void addPreferencesSorted(List<Preference> prefs, PreferenceGroup container) {
@@ -153,7 +132,7 @@ public class LocationSettings extends LocationSettingsBase
 
         mCategoryRecentLocationRequests =
                 (PreferenceCategory) root.findPreference(KEY_RECENT_LOCATION_REQUESTS);
-        RecentLocationApps recentApps = new RecentLocationApps(activity, mStatsHelper);
+        RecentLocationApps recentApps = new RecentLocationApps(activity);
         List<Preference> recentLocationRequests = recentApps.getAppList();
         if (recentLocationRequests.size() > 0) {
             addPreferencesSorted(recentLocationRequests, mCategoryRecentLocationRequests);
index 9488db7..5708434 100644 (file)
@@ -20,7 +20,6 @@ import android.app.ActivityManager;
 import android.app.AppOpsManager;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
@@ -32,11 +31,8 @@ import android.util.Log;
 
 import com.android.settings.R;
 import com.android.settings.applications.InstalledAppDetails;
-import com.android.settings.fuelgauge.BatterySipper;
-import com.android.settings.fuelgauge.BatteryStatsHelper;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -45,51 +41,15 @@ import java.util.List;
 public class RecentLocationApps {
     private static final String TAG = RecentLocationApps.class.getSimpleName();
     private static final String ANDROID_SYSTEM_PACKAGE_NAME = "android";
-    private static final String GOOGLE_SERVICES_SHARED_UID = "com.google.uid.shared";
-    private static final String GCORE_PACKAGE_NAME = "com.google.android.gms";
 
     private static final int RECENT_TIME_INTERVAL_MILLIS = 15 * 60 * 1000;
 
     private final PreferenceActivity mActivity;
-    private final BatteryStatsHelper mStatsHelper;
     private final PackageManager mPackageManager;
-    private final Drawable mGCoreIcon;
 
-    // Stores all the packages that requested location within the designated interval
-    // key - package name of the app
-    // value - whether the app has requested high power location
-
-    public RecentLocationApps(PreferenceActivity activity, BatteryStatsHelper sipperUtil) {
+    public RecentLocationApps(PreferenceActivity activity) {
         mActivity = activity;
         mPackageManager = activity.getPackageManager();
-        mStatsHelper = sipperUtil;
-        Drawable icon = null;
-        try {
-            ApplicationInfo appInfo = mPackageManager.getApplicationInfo(
-                    GCORE_PACKAGE_NAME, PackageManager.GET_META_DATA);
-            icon = mPackageManager.getApplicationIcon(appInfo);
-        } catch (PackageManager.NameNotFoundException e) {
-            if (Log.isLoggable(TAG, Log.INFO)) {
-                Log.i(TAG, "GCore not installed");
-            }
-            icon = null;
-        }
-        mGCoreIcon = icon;
-    }
-
-    private class UidEntryClickedListener
-            implements Preference.OnPreferenceClickListener {
-        private BatterySipper mSipper;
-
-        public UidEntryClickedListener(BatterySipper sipper) {
-            mSipper = sipper;
-        }
-
-        @Override
-        public boolean onPreferenceClick(Preference preference) {
-            mStatsHelper.startBatteryDetailPage(mActivity, mSipper, false);
-            return true;
-        }
     }
 
     private class PackageEntryClickedListener
@@ -129,49 +89,10 @@ public class RecentLocationApps {
     }
 
     /**
-     * Stores a BatterySipper object and records whether the sipper has been used.
-     */
-    private static final class BatterySipperWrapper {
-        private BatterySipper mSipper;
-        private boolean mUsed;
-
-        public BatterySipperWrapper(BatterySipper sipper) {
-            mSipper = sipper;
-            mUsed = false;
-        }
-
-        public BatterySipper batterySipper() {
-            return mSipper;
-        }
-
-        public boolean used() {
-            return mUsed;
-        }
-
-        public void setUsed() {
-            mUsed = true;
-        }
-    }
-
-    /**
      * Fills a list of applications which queried location recently within
      * specified time.
      */
     public List<Preference> getAppList() {
-        // Retrieve Uid-based battery blaming info and generate a package to BatterySipper HashMap
-        // for later faster looking up.
-        mStatsHelper.refreshStats(true);
-        List<BatterySipper> usageList = mStatsHelper.getUsageList();
-        // Key: package Uid. Value: BatterySipperWrapper.
-        HashMap<Integer, BatterySipperWrapper> sipperMap =
-                new HashMap<Integer, BatterySipperWrapper>(usageList.size());
-        for (BatterySipper sipper: usageList) {
-            int uid = sipper.getUid();
-            if (uid != 0) {
-                sipperMap.put(uid, new BatterySipperWrapper(sipper));
-            }
-        }
-
         // Retrieve a location usage list from AppOps
         AppOpsManager aoManager =
                 (AppOpsManager) mActivity.getSystemService(Context.APP_OPS_SERVICE);
@@ -191,8 +112,7 @@ public class RecentLocationApps {
             boolean isAndroidOs = (uid == Process.SYSTEM_UID)
                     && ANDROID_SYSTEM_PACKAGE_NAME.equals(ops.getPackageName());
             if (!isAndroidOs && ActivityManager.getCurrentUser() == UserHandle.getUserId(uid)) {
-                BatterySipperWrapper wrapper = sipperMap.get(uid);
-                Preference pref = getPreferenceFromOps(now, ops, wrapper);
+                Preference pref = getPreferenceFromOps(now, ops);
                 if (pref != null) {
                     prefs.add(pref);
                 }
@@ -203,56 +123,14 @@ public class RecentLocationApps {
     }
 
     /**
-     * Retrieves the icon for given BatterySipper object.
-     *
-     * The icons on location blaming page are actually Uid-based rather than package based. For
-     * those packages that share the same Uid, BatteryStatsHelper picks the one with the most CPU
-     * usage. Both "Contact Sync" and GCore belong to "Google Services" and they share the same Uid.
-     * As a result, sometimes Contact icon may be chosen to represent "Google Services" by
-     * BatteryStatsHelper.
-     *
-     * In order to avoid displaying Contact icon for "Google Services", we hack this method to
-     * always return Puzzle icon for all packages that share the Uid of "Google Services".
-     */
-    private Drawable getIcon(BatterySipper sipper, AppOpsManager.PackageOps ops) {
-        Drawable icon = null;
-        if (mGCoreIcon != null) {
-            try {
-                PackageInfo info = mPackageManager.getPackageInfo(
-                        ops.getPackageName(), PackageManager.GET_META_DATA);
-                if (info != null && GOOGLE_SERVICES_SHARED_UID.equals(info.sharedUserId)) {
-                    if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                        Log.v(TAG, "shareUserId matches GCore, force using puzzle icon");
-                    }
-                    icon = mGCoreIcon;
-                }
-            } catch (PackageManager.NameNotFoundException e) {
-                if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                    Log.v(TAG, e.toString());
-                }
-            }
-        }
-        if (icon == null) {
-            icon = sipper.getIcon();
-        }
-        return icon;
-    }
-
-    /**
      * Creates a Preference entry for the given PackageOps.
      *
      * This method examines the time interval of the PackageOps first. If the PackageOps is older
      * than the designated interval, this method ignores the PackageOps object and returns null.
-     *
-     * When the PackageOps is fresh enough, if the package has a corresponding battery blaming entry
-     * in the Uid-based battery sipper list, this method returns a Preference pointing to the Uid
-     * battery blaming page. If the package doesn't have a battery sipper entry (typically shouldn't
-     * happen), this method returns a Preference pointing to the App Info page for that package.
+     * When the PackageOps is fresh enough, this method returns a Preference pointing to the App
+     * Info page for that package.
      */
-    private Preference getPreferenceFromOps(
-            long now,
-            AppOpsManager.PackageOps ops,
-            BatterySipperWrapper wrapper) {
+    private Preference getPreferenceFromOps(long now, AppOpsManager.PackageOps ops) {
         String packageName = ops.getPackageName();
         List<AppOpsManager.OpEntry> entries = ops.getOps();
         boolean highBattery = false;
@@ -284,48 +162,27 @@ public class RecentLocationApps {
         // The package is fresh enough, continue.
 
         Preference pref = null;
-        if (wrapper != null) {
-            // Contains sipper. Link to Battery Blaming page.
-
-            // We're listing by UID rather than package. Check whether the entry has been used
-            // before to prevent the same UID from showing up twice.
-            if (!wrapper.used()) {
-                BatterySipper sipper = wrapper.batterySipper();
-                sipper.loadNameAndIcon();
-                pref = createRecentLocationEntry(
-                        getIcon(sipper, ops),
-                        sipper.getLabel(),
-                        highBattery,
-                        new UidEntryClickedListener(sipper));
-                wrapper.setUsed();
-            }
-        } else {
-            // No corresponding sipper. Link to App Info page.
-
-            // This is grouped by package rather than UID, but that's OK because this branch
-            // shouldn't happen in practice.
-            try {
-                ApplicationInfo appInfo = mPackageManager.getApplicationInfo(
-                        packageName, PackageManager.GET_META_DATA);
-                // Multiple users can install the same package. Each user gets a different Uid for
-                // the same package.
-                //
-                // Here we retrieve the Uid with package name, that will be the Uid for that package
-                // associated with the current active user. If the Uid differs from the Uid in ops,
-                // that means this entry belongs to another inactive user and we should ignore that.
-                if (appInfo.uid == ops.getUid()) {
-                    pref = createRecentLocationEntry(
-                            mPackageManager.getApplicationIcon(appInfo),
-                            mPackageManager.getApplicationLabel(appInfo),
-                            highBattery,
-                            new PackageEntryClickedListener(packageName));
-                } else if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                    Log.v(TAG, "package " + packageName + " with Uid " + ops.getUid() +
-                            " belongs to another inactive account, ignored.");
-                }
-            } catch (PackageManager.NameNotFoundException e) {
-                Log.wtf(TAG, "Package not found: " + packageName, e);
-            }
+        try {
+          ApplicationInfo appInfo = mPackageManager.getApplicationInfo(
+              packageName, PackageManager.GET_META_DATA);
+          // Multiple users can install the same package. Each user gets a different Uid for
+          // the same package.
+          //
+          // Here we retrieve the Uid with package name, that will be the Uid for that package
+          // associated with the current active user. If the Uid differs from the Uid in ops,
+          // that means this entry belongs to another inactive user and we should ignore that.
+          if (appInfo.uid == ops.getUid()) {
+            pref = createRecentLocationEntry(
+                mPackageManager.getApplicationIcon(appInfo),
+                mPackageManager.getApplicationLabel(appInfo),
+                highBattery,
+                new PackageEntryClickedListener(packageName));
+          } else if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            Log.v(TAG, "package " + packageName + " with Uid " + ops.getUid() +
+                " belongs to another inactive account, ignored.");
+          }
+        } catch (PackageManager.NameNotFoundException e) {
+          Log.wtf(TAG, "Package not found: " + packageName, e);
         }
 
         return pref;