From 8d7be7b738cce9facdd8832aa845ceb79c19ffc6 Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Thu, 17 Jul 2014 18:30:03 -0700 Subject: [PATCH] Update Settings to use new UsageStats API Change-Id: I89740d9b0c21f1ac6aa68feedc7730dd98b244c9 --- res/layout/usage_stats.xml | 2 +- res/layout/usage_stats_item.xml | 2 +- res/values/arrays.xml | 2 +- res/values/strings.xml | 4 +- src/com/android/settings/UsageStats.java | 177 +++++++++++------------ 5 files changed, 90 insertions(+), 97 deletions(-) diff --git a/res/layout/usage_stats.xml b/res/layout/usage_stats.xml index 96e1bd1054f..013bcdb07a5 100755 --- a/res/layout/usage_stats.xml +++ b/res/layout/usage_stats.xml @@ -27,7 +27,7 @@ android:paddingEnd="6dip" android:layout_height="wrap_content" /> - Usage time - Launch count + Last time used App name diff --git a/res/values/strings.xml b/res/values/strings.xml index bd9791e64ba..90fcf5c4f57 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3474,8 +3474,8 @@ Sort by: App - - Count + + Last time used Usage time diff --git a/src/com/android/settings/UsageStats.java b/src/com/android/settings/UsageStats.java index 758e5dec1b2..08c272ec546 100755 --- a/src/com/android/settings/UsageStats.java +++ b/src/com/android/settings/UsageStats.java @@ -16,23 +16,24 @@ package com.android.settings; -import com.android.internal.app.IUsageStats; -import com.android.settings.R; import android.app.Activity; +import android.app.usage.PackageUsageStats; +import android.app.usage.UsageStatsManager; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; -import android.os.RemoteException; -import android.os.ServiceManager; + +import java.text.DateFormat; import java.util.ArrayList; +import java.util.Calendar; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; -import java.util.List; import java.util.Map; +import android.text.format.DateUtils; +import android.util.ArrayMap; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -48,116 +49,109 @@ import android.widget.AdapterView.OnItemSelectedListener; * Activity to display package usage statistics. */ public class UsageStats extends Activity implements OnItemSelectedListener { - private static final String TAG="UsageStatsActivity"; + private static final String TAG = "UsageStatsActivity"; private static final boolean localLOGV = false; - private Spinner mTypeSpinner; - private ListView mListView; - private IUsageStats mUsageStatsService; + private UsageStatsManager mUsageStatsManager; private LayoutInflater mInflater; private UsageStatsAdapter mAdapter; private PackageManager mPm; - public static class AppNameComparator - implements Comparator { - Map mAppLabelList; - AppNameComparator(Map appList) { + public static class AppNameComparator implements Comparator { + private Map mAppLabelList; + + AppNameComparator(Map appList) { mAppLabelList = appList; } - public final int compare(android.app.UsageStats.PackageStats a, - android.app.UsageStats.PackageStats b) { - String alabel = mAppLabelList.get(a.getPackageName()).toString(); - String blabel = mAppLabelList.get(b.getPackageName()).toString(); + + @Override + public final int compare(PackageUsageStats a, PackageUsageStats b) { + String alabel = mAppLabelList.get(a.getPackageName()); + String blabel = mAppLabelList.get(b.getPackageName()); return alabel.compareTo(blabel); } } - - public static class LaunchCountComparator - implements Comparator { - public final int compare(android.app.UsageStats.PackageStats a, - android.app.UsageStats.PackageStats b) { + + public static class LastTimeUsedComparator implements Comparator { + @Override + public final int compare(PackageUsageStats a, PackageUsageStats b) { // return by descending order - return b.getLaunchCount() - a.getLaunchCount(); + return (int)(b.getLastTimeUsed() - a.getLastTimeUsed()); } } - public static class UsageTimeComparator - implements Comparator { - public final int compare(android.app.UsageStats.PackageStats a, - android.app.UsageStats.PackageStats b) { - long ret = a.getUsageTime(0)-b.getUsageTime(0); - if (ret == 0) { - return 0; - } - if (ret < 0) { - return 1; - } - return -1; + public static class UsageTimeComparator implements Comparator { + @Override + public final int compare(PackageUsageStats a, PackageUsageStats b) { + return (int)(b.getTotalTimeSpent() - a.getTotalTimeSpent()); } } - // View Holder used when displaying views + // View Holder used when displaying views static class AppViewHolder { TextView pkgName; - TextView launchCount; + TextView lastTimeUsed; TextView usageTime; } class UsageStatsAdapter extends BaseAdapter { // Constants defining order for display order private static final int _DISPLAY_ORDER_USAGE_TIME = 0; - private static final int _DISPLAY_ORDER_LAUNCH_COUNT = 1; + private static final int _DISPLAY_ORDER_LAST_TIME_USED = 1; private static final int _DISPLAY_ORDER_APP_NAME = 2; private int mDisplayOrder = _DISPLAY_ORDER_USAGE_TIME; - private List mUsageStats; - private LaunchCountComparator mLaunchCountComparator; - private UsageTimeComparator mUsageTimeComparator; + private LastTimeUsedComparator mLastTimeUsedComparator = new LastTimeUsedComparator(); + private UsageTimeComparator mUsageTimeComparator = new UsageTimeComparator(); private AppNameComparator mAppLabelComparator; - private HashMap mAppLabelMap; - + private final ArrayMap mAppLabelMap = new ArrayMap<>(); + private final ArrayList mPackageStats = new ArrayList<>(); + UsageStatsAdapter() { - mUsageStats = new ArrayList(); - mAppLabelMap = new HashMap(); - android.app.UsageStats.PackageStats[] stats; - try { - stats = mUsageStatsService.getAllPkgUsageStats(getPackageName()); - } catch (RemoteException e) { - Log.e(TAG, "Failed initializing usage stats service"); + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.DAY_OF_YEAR, -5); + + final android.app.usage.UsageStats stats = + mUsageStatsManager.getRecentStatsSince(cal.getTimeInMillis()); + if (stats == null) { return; } - if (stats == null) { - return; - } - for (android.app.UsageStats.PackageStats ps : stats) { - mUsageStats.add(ps); - // load application labels for each application - CharSequence label; - try { - ApplicationInfo appInfo = mPm.getApplicationInfo(ps.getPackageName(), 0); - label = appInfo.loadLabel(mPm); + + final int pkgCount = stats.getPackageCount(); + for (int i = 0; i < pkgCount; i++) { + final PackageUsageStats pkgStats = stats.getPackage(i); + + // load application labels for each application + try { + ApplicationInfo appInfo = mPm.getApplicationInfo(pkgStats.getPackageName(), 0); + String label = appInfo.loadLabel(mPm).toString(); + mAppLabelMap.put(pkgStats.getPackageName(), label); + mPackageStats.add(pkgStats); } catch (NameNotFoundException e) { - label = ps.getPackageName(); + // This package may be gone. } - mAppLabelMap.put(ps.getPackageName(), label); } + // Sort list - mLaunchCountComparator = new LaunchCountComparator(); - mUsageTimeComparator = new UsageTimeComparator(); mAppLabelComparator = new AppNameComparator(mAppLabelMap); sortList(); } + + @Override public int getCount() { - return mUsageStats.size(); + return mPackageStats.size(); } + @Override public Object getItem(int position) { - return mUsageStats.get(position); + return mPackageStats.get(position); } + @Override public long getItemId(int position) { return position; } + @Override public View getView(int position, View convertView, ViewGroup parent) { // A ViewHolder keeps references to children views to avoid unneccessary calls // to findViewById() on each row. @@ -173,7 +167,7 @@ public class UsageStats extends Activity implements OnItemSelectedListener { // we want to bind data to. holder = new AppViewHolder(); holder.pkgName = (TextView) convertView.findViewById(R.id.package_name); - holder.launchCount = (TextView) convertView.findViewById(R.id.launch_count); + holder.lastTimeUsed = (TextView) convertView.findViewById(R.id.last_time_used); holder.usageTime = (TextView) convertView.findViewById(R.id.usage_time); convertView.setTag(holder); } else { @@ -183,12 +177,14 @@ public class UsageStats extends Activity implements OnItemSelectedListener { } // Bind the data efficiently with the holder - android.app.UsageStats.PackageStats pkgStats = mUsageStats.get(position); + PackageUsageStats pkgStats = mPackageStats.get(position); if (pkgStats != null) { - CharSequence label = mAppLabelMap.get(pkgStats.getPackageName()); + String label = mAppLabelMap.get(pkgStats.getPackageName()); holder.pkgName.setText(label); - holder.launchCount.setText(String.valueOf(pkgStats.getLaunchCount())); - holder.usageTime.setText(String.valueOf(pkgStats.getUsageTime(0))+" ms"); + holder.lastTimeUsed.setText(DateUtils.formatSameDayTime(pkgStats.getLastTimeUsed(), + System.currentTimeMillis(), DateFormat.MEDIUM, DateFormat.MEDIUM)); + holder.usageTime.setText( + DateUtils.formatElapsedTime(pkgStats.getTotalTimeSpent() / 1000)); } else { Log.w(TAG, "No usage stats info for package:" + position); } @@ -206,45 +202,42 @@ public class UsageStats extends Activity implements OnItemSelectedListener { private void sortList() { if (mDisplayOrder == _DISPLAY_ORDER_USAGE_TIME) { if (localLOGV) Log.i(TAG, "Sorting by usage time"); - Collections.sort(mUsageStats, mUsageTimeComparator); - } else if (mDisplayOrder == _DISPLAY_ORDER_LAUNCH_COUNT) { - if (localLOGV) Log.i(TAG, "Sorting launch count"); - Collections.sort(mUsageStats, mLaunchCountComparator); + Collections.sort(mPackageStats, mUsageTimeComparator); + } else if (mDisplayOrder == _DISPLAY_ORDER_LAST_TIME_USED) { + if (localLOGV) Log.i(TAG, "Sorting by last time used"); + Collections.sort(mPackageStats, mLastTimeUsedComparator); } else if (mDisplayOrder == _DISPLAY_ORDER_APP_NAME) { if (localLOGV) Log.i(TAG, "Sorting by application name"); - Collections.sort(mUsageStats, mAppLabelComparator); + Collections.sort(mPackageStats, mAppLabelComparator); } notifyDataSetChanged(); } } /** Called when the activity is first created. */ + @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); - mUsageStatsService = IUsageStats.Stub.asInterface(ServiceManager.getService("usagestats")); - if (mUsageStatsService == null) { - Log.e(TAG, "Failed to retrieve usagestats service"); - return; - } + setContentView(R.layout.usage_stats); + + mUsageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE); mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); mPm = getPackageManager(); + + Spinner typeSpinner = (Spinner) findViewById(R.id.typeSpinner); + typeSpinner.setOnItemSelectedListener(this); - setContentView(R.layout.usage_stats); - mTypeSpinner = (Spinner) findViewById(R.id.typeSpinner); - mTypeSpinner.setOnItemSelectedListener(this); - - mListView = (ListView) findViewById(R.id.pkg_list); - // Initialize the inflater - + ListView listView = (ListView) findViewById(R.id.pkg_list); mAdapter = new UsageStatsAdapter(); - mListView.setAdapter(mAdapter); + listView.setAdapter(mAdapter); } - public void onItemSelected(AdapterView parent, View view, int position, - long id) { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { mAdapter.sortList(position); } + @Override public void onNothingSelected(AdapterView parent) { // do nothing }