From 1789f7d236bca1583fd3f7eafcf81bbae915e229 Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Wed, 6 Aug 2014 17:53:38 -0700 Subject: Update to use new UsageStats API Change-Id: Ic6f9523c4c70f8b832d8f57551417f4f19ea144f --- src/com/android/settings/UsageStats.java | 245 ---------------------- src/com/android/settings/UsageStatsActivity.java | 256 +++++++++++++++++++++++ 2 files changed, 256 insertions(+), 245 deletions(-) delete mode 100755 src/com/android/settings/UsageStats.java create mode 100755 src/com/android/settings/UsageStatsActivity.java (limited to 'src/com') diff --git a/src/com/android/settings/UsageStats.java b/src/com/android/settings/UsageStats.java deleted file mode 100755 index 08c272ec5..000000000 --- a/src/com/android/settings/UsageStats.java +++ /dev/null @@ -1,245 +0,0 @@ -/** - * Copyright (C) 2007 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; - -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 java.text.DateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collections; -import java.util.Comparator; -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; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.BaseAdapter; -import android.widget.ListView; -import android.widget.Spinner; -import android.widget.TextView; -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 boolean localLOGV = false; - private UsageStatsManager mUsageStatsManager; - private LayoutInflater mInflater; - private UsageStatsAdapter mAdapter; - private PackageManager mPm; - - public static class AppNameComparator implements Comparator { - private Map mAppLabelList; - - AppNameComparator(Map appList) { - mAppLabelList = appList; - } - - @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 LastTimeUsedComparator implements Comparator { - @Override - public final int compare(PackageUsageStats a, PackageUsageStats b) { - // return by descending order - return (int)(b.getLastTimeUsed() - a.getLastTimeUsed()); - } - } - - 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 - static class AppViewHolder { - TextView pkgName; - 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_LAST_TIME_USED = 1; - private static final int _DISPLAY_ORDER_APP_NAME = 2; - - private int mDisplayOrder = _DISPLAY_ORDER_USAGE_TIME; - private LastTimeUsedComparator mLastTimeUsedComparator = new LastTimeUsedComparator(); - private UsageTimeComparator mUsageTimeComparator = new UsageTimeComparator(); - private AppNameComparator mAppLabelComparator; - private final ArrayMap mAppLabelMap = new ArrayMap<>(); - private final ArrayList mPackageStats = new ArrayList<>(); - - UsageStatsAdapter() { - 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; - } - - 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) { - // This package may be gone. - } - } - - // Sort list - mAppLabelComparator = new AppNameComparator(mAppLabelMap); - sortList(); - } - - @Override - public int getCount() { - return mPackageStats.size(); - } - - @Override - public Object getItem(int 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. - AppViewHolder holder; - - // When convertView is not null, we can reuse it directly, there is no need - // to reinflate it. We only inflate a new View when the convertView supplied - // by ListView is null. - if (convertView == null) { - convertView = mInflater.inflate(R.layout.usage_stats_item, null); - - // Creates a ViewHolder and store references to the two children views - // we want to bind data to. - holder = new AppViewHolder(); - holder.pkgName = (TextView) convertView.findViewById(R.id.package_name); - holder.lastTimeUsed = (TextView) convertView.findViewById(R.id.last_time_used); - holder.usageTime = (TextView) convertView.findViewById(R.id.usage_time); - convertView.setTag(holder); - } else { - // Get the ViewHolder back to get fast access to the TextView - // and the ImageView. - holder = (AppViewHolder) convertView.getTag(); - } - - // Bind the data efficiently with the holder - PackageUsageStats pkgStats = mPackageStats.get(position); - if (pkgStats != null) { - String label = mAppLabelMap.get(pkgStats.getPackageName()); - holder.pkgName.setText(label); - 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); - } - return convertView; - } - - void sortList(int sortOrder) { - if (mDisplayOrder == sortOrder) { - // do nothing - return; - } - mDisplayOrder= sortOrder; - sortList(); - } - private void sortList() { - if (mDisplayOrder == _DISPLAY_ORDER_USAGE_TIME) { - if (localLOGV) Log.i(TAG, "Sorting by usage time"); - 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(mPackageStats, mAppLabelComparator); - } - notifyDataSetChanged(); - } - } - - /** Called when the activity is first created. */ - @Override - protected void onCreate(Bundle icicle) { - super.onCreate(icicle); - 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); - - ListView listView = (ListView) findViewById(R.id.pkg_list); - mAdapter = new UsageStatsAdapter(); - listView.setAdapter(mAdapter); - } - - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - mAdapter.sortList(position); - } - - @Override - public void onNothingSelected(AdapterView parent) { - // do nothing - } -} - diff --git a/src/com/android/settings/UsageStatsActivity.java b/src/com/android/settings/UsageStatsActivity.java new file mode 100755 index 000000000..90aec5b07 --- /dev/null +++ b/src/com/android/settings/UsageStatsActivity.java @@ -0,0 +1,256 @@ +/** + * Copyright (C) 2007 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; + +import android.app.Activity; +import android.app.usage.UsageStats; +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 java.text.DateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +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; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.ListView; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.AdapterView.OnItemSelectedListener; + +/** + * Activity to display package usage statistics. + */ +public class UsageStatsActivity extends Activity implements OnItemSelectedListener { + private static final String TAG = "UsageStatsActivity"; + private static final boolean localLOGV = false; + private UsageStatsManager mUsageStatsManager; + private LayoutInflater mInflater; + private UsageStatsAdapter mAdapter; + private PackageManager mPm; + + public static class AppNameComparator implements Comparator { + private Map mAppLabelList; + + AppNameComparator(Map appList) { + mAppLabelList = appList; + } + + @Override + public final int compare(UsageStats a, UsageStats b) { + String alabel = mAppLabelList.get(a.getPackageName()); + String blabel = mAppLabelList.get(b.getPackageName()); + return alabel.compareTo(blabel); + } + } + + public static class LastTimeUsedComparator implements Comparator { + @Override + public final int compare(UsageStats a, UsageStats b) { + // return by descending order + return (int)(b.getLastTimeUsed() - a.getLastTimeUsed()); + } + } + + public static class UsageTimeComparator implements Comparator { + @Override + public final int compare(UsageStats a, UsageStats b) { + return (int)(b.getTotalTimeInForeground() - a.getTotalTimeInForeground()); + } + } + + // View Holder used when displaying views + static class AppViewHolder { + TextView pkgName; + 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_LAST_TIME_USED = 1; + private static final int _DISPLAY_ORDER_APP_NAME = 2; + + private int mDisplayOrder = _DISPLAY_ORDER_USAGE_TIME; + private LastTimeUsedComparator mLastTimeUsedComparator = new LastTimeUsedComparator(); + private UsageTimeComparator mUsageTimeComparator = new UsageTimeComparator(); + private AppNameComparator mAppLabelComparator; + private final ArrayMap mAppLabelMap = new ArrayMap<>(); + private final ArrayList mPackageStats = new ArrayList<>(); + + UsageStatsAdapter() { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.DAY_OF_YEAR, -5); + + final List stats = + mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, + cal.getTimeInMillis(), System.currentTimeMillis()); + if (stats == null) { + return; + } + + ArrayMap map = new ArrayMap<>(); + final int statCount = stats.size(); + for (int i = 0; i < statCount; i++) { + final android.app.usage.UsageStats pkgStats = stats.get(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); + + UsageStats existingStats = + map.get(pkgStats.getPackageName()); + if (existingStats == null) { + map.put(pkgStats.getPackageName(), pkgStats); + } else { + existingStats.add(pkgStats); + } + + } catch (NameNotFoundException e) { + // This package may be gone. + } + } + mPackageStats.addAll(map.values()); + + // Sort list + mAppLabelComparator = new AppNameComparator(mAppLabelMap); + sortList(); + } + + @Override + public int getCount() { + return mPackageStats.size(); + } + + @Override + public Object getItem(int 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. + AppViewHolder holder; + + // When convertView is not null, we can reuse it directly, there is no need + // to reinflate it. We only inflate a new View when the convertView supplied + // by ListView is null. + if (convertView == null) { + convertView = mInflater.inflate(R.layout.usage_stats_item, null); + + // Creates a ViewHolder and store references to the two children views + // we want to bind data to. + holder = new AppViewHolder(); + holder.pkgName = (TextView) convertView.findViewById(R.id.package_name); + holder.lastTimeUsed = (TextView) convertView.findViewById(R.id.last_time_used); + holder.usageTime = (TextView) convertView.findViewById(R.id.usage_time); + convertView.setTag(holder); + } else { + // Get the ViewHolder back to get fast access to the TextView + // and the ImageView. + holder = (AppViewHolder) convertView.getTag(); + } + + // Bind the data efficiently with the holder + UsageStats pkgStats = mPackageStats.get(position); + if (pkgStats != null) { + String label = mAppLabelMap.get(pkgStats.getPackageName()); + holder.pkgName.setText(label); + holder.lastTimeUsed.setText(DateUtils.formatSameDayTime(pkgStats.getLastTimeUsed(), + System.currentTimeMillis(), DateFormat.MEDIUM, DateFormat.MEDIUM)); + holder.usageTime.setText( + DateUtils.formatElapsedTime(pkgStats.getTotalTimeInForeground() / 1000)); + } else { + Log.w(TAG, "No usage stats info for package:" + position); + } + return convertView; + } + + void sortList(int sortOrder) { + if (mDisplayOrder == sortOrder) { + // do nothing + return; + } + mDisplayOrder= sortOrder; + sortList(); + } + private void sortList() { + if (mDisplayOrder == _DISPLAY_ORDER_USAGE_TIME) { + if (localLOGV) Log.i(TAG, "Sorting by usage time"); + 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(mPackageStats, mAppLabelComparator); + } + notifyDataSetChanged(); + } + } + + /** Called when the activity is first created. */ + @Override + protected void onCreate(Bundle icicle) { + super.onCreate(icicle); + 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); + + ListView listView = (ListView) findViewById(R.id.pkg_list); + mAdapter = new UsageStatsAdapter(); + listView.setAdapter(mAdapter); + } + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + mAdapter.sortList(position); + } + + @Override + public void onNothingSelected(AdapterView parent) { + // do nothing + } +} -- cgit v1.2.3