auto import from //depot/cupcake/@135843
This commit is contained in:
249
src/com/android/settings/UsageStats.java
Executable file
249
src/com/android/settings/UsageStats.java
Executable file
@@ -0,0 +1,249 @@
|
||||
|
||||
|
||||
/**
|
||||
* 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 com.android.internal.app.IUsageStats;
|
||||
import com.android.settings.R;
|
||||
import android.app.Activity;
|
||||
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 com.android.internal.os.PkgUsageStats;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
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 = true;
|
||||
private Spinner mTypeSpinner;
|
||||
private ListView mListView;
|
||||
private IUsageStats mUsageStatsService;
|
||||
private LayoutInflater mInflater;
|
||||
private UsageStatsAdapter mAdapter;
|
||||
private PackageManager mPm;
|
||||
|
||||
public static class AppNameComparator implements Comparator<PkgUsageStats> {
|
||||
Map<String, CharSequence> mAppLabelList;
|
||||
AppNameComparator(Map<String, CharSequence> appList) {
|
||||
mAppLabelList = appList;
|
||||
}
|
||||
public final int compare(PkgUsageStats a, PkgUsageStats b) {
|
||||
String alabel = mAppLabelList.get(a.packageName).toString();
|
||||
String blabel = mAppLabelList.get(b.packageName).toString();
|
||||
return alabel.compareTo(blabel);
|
||||
}
|
||||
}
|
||||
|
||||
public static class LaunchCountComparator implements Comparator<PkgUsageStats> {
|
||||
public final int compare(PkgUsageStats a, PkgUsageStats b) {
|
||||
// return by descending order
|
||||
return b.launchCount - a.launchCount;
|
||||
}
|
||||
}
|
||||
|
||||
public static class UsageTimeComparator implements Comparator<PkgUsageStats> {
|
||||
public final int compare(PkgUsageStats a, PkgUsageStats b) {
|
||||
long ret = a.usageTime-b.usageTime;
|
||||
if (ret == 0) {
|
||||
return 0;
|
||||
}
|
||||
if (ret < 0) {
|
||||
return 1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
// View Holder used when displaying views
|
||||
static class AppViewHolder {
|
||||
TextView pkgName;
|
||||
TextView launchCount;
|
||||
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_APP_NAME = 2;
|
||||
|
||||
private int mDisplayOrder = _DISPLAY_ORDER_USAGE_TIME;
|
||||
private List<PkgUsageStats> mUsageStats;
|
||||
private LaunchCountComparator mLaunchCountComparator;
|
||||
private UsageTimeComparator mUsageTimeComparator;
|
||||
private AppNameComparator mAppLabelComparator;
|
||||
private HashMap<String, CharSequence> mAppLabelMap;
|
||||
|
||||
UsageStatsAdapter() {
|
||||
mUsageStats = new ArrayList<PkgUsageStats>();
|
||||
mAppLabelMap = new HashMap<String, CharSequence>();
|
||||
PkgUsageStats[] stats;
|
||||
try {
|
||||
stats = mUsageStatsService.getAllPkgUsageStats();
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Failed initializing usage stats service");
|
||||
return;
|
||||
}
|
||||
if (stats == null) {
|
||||
return;
|
||||
}
|
||||
for (PkgUsageStats ps : stats) {
|
||||
mUsageStats.add(ps);
|
||||
// load application labels for each application
|
||||
CharSequence label;
|
||||
try {
|
||||
ApplicationInfo appInfo = mPm.getApplicationInfo(ps.packageName, 0);
|
||||
label = appInfo.loadLabel(mPm);
|
||||
} catch (NameNotFoundException e) {
|
||||
label = ps.packageName;
|
||||
}
|
||||
mAppLabelMap.put(ps.packageName, label);
|
||||
}
|
||||
// Sort list
|
||||
mLaunchCountComparator = new LaunchCountComparator();
|
||||
mUsageTimeComparator = new UsageTimeComparator();
|
||||
mAppLabelComparator = new AppNameComparator(mAppLabelMap);
|
||||
sortList();
|
||||
}
|
||||
public int getCount() {
|
||||
return mUsageStats.size();
|
||||
}
|
||||
|
||||
public Object getItem(int position) {
|
||||
return mUsageStats.get(position);
|
||||
}
|
||||
|
||||
public long getItemId(int position) {
|
||||
return position;
|
||||
}
|
||||
|
||||
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.launchCount = (TextView) convertView.findViewById(R.id.launch_count);
|
||||
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
|
||||
PkgUsageStats pkgStats = mUsageStats.get(position);
|
||||
if (pkgStats != null) {
|
||||
CharSequence label = mAppLabelMap.get(pkgStats.packageName);
|
||||
holder.pkgName.setText(label);
|
||||
holder.launchCount.setText(String.valueOf(pkgStats.launchCount));
|
||||
holder.usageTime.setText(String.valueOf(pkgStats.usageTime)+" ms");
|
||||
} else {
|
||||
Log.w(TAG, "No usage stats info for package:"+pkgStats.packageName);
|
||||
}
|
||||
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(mUsageStats, mUsageTimeComparator);
|
||||
} else if (mDisplayOrder == _DISPLAY_ORDER_LAUNCH_COUNT) {
|
||||
if (localLOGV) Log.i(TAG, "Sorting launch count");
|
||||
Collections.sort(mUsageStats, mLaunchCountComparator);
|
||||
} else if (mDisplayOrder == _DISPLAY_ORDER_APP_NAME) {
|
||||
if (localLOGV) Log.i(TAG, "Sorting by application name");
|
||||
Collections.sort(mUsageStats, mAppLabelComparator);
|
||||
}
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
}
|
||||
|
||||
/** Called when the activity is first created. */
|
||||
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;
|
||||
}
|
||||
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||
mPm = getPackageManager();
|
||||
|
||||
setContentView(R.layout.usage_stats);
|
||||
mTypeSpinner = (Spinner) findViewById(R.id.typeSpinner);
|
||||
mTypeSpinner.setOnItemSelectedListener(this);
|
||||
|
||||
mListView = (ListView) findViewById(R.id.pkg_list);
|
||||
// Initialize the inflater
|
||||
|
||||
mAdapter = new UsageStatsAdapter();
|
||||
mListView.setAdapter(mAdapter);
|
||||
}
|
||||
|
||||
public void onItemSelected(AdapterView<?> parent, View view, int position,
|
||||
long id) {
|
||||
mAdapter.sortList(position);
|
||||
}
|
||||
|
||||
public void onNothingSelected(AdapterView<?> parent) {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user