Loading core/java/android/app/usage/UsageStats.java +1 −0 Original line number Diff line number Diff line Loading @@ -134,6 +134,7 @@ public final class UsageStats implements Parcelable { mLastTimeSaved = stats.mLastTimeSaved; final int pkgCount = stats.mPackageStats.size(); mPackageStats.ensureCapacity(pkgCount); for (int i = 0; i < pkgCount; i++) { PackageUsageStats pkgStats = stats.mPackageStats.valueAt(i); mPackageStats.append(stats.mPackageStats.keyAt(i), new PackageUsageStats(pkgStats)); Loading core/java/com/android/internal/app/ResolverActivity.java +68 −8 Original line number Diff line number Diff line Loading @@ -17,6 +17,9 @@ package com.android.internal.app; import android.app.Activity; import android.app.usage.PackageUsageStats; import android.app.usage.UsageStats; import android.app.usage.UsageStatsManager; import android.os.AsyncTask; import android.widget.AbsListView; import android.widget.GridView; Loading Loading @@ -54,12 +57,13 @@ import android.widget.ListView; import android.widget.TextView; import com.android.internal.widget.ResolverDrawerLayout; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; /** Loading @@ -69,7 +73,7 @@ import java.util.Set; */ public class ResolverActivity extends Activity implements AdapterView.OnItemClickListener { private static final String TAG = "ResolverActivity"; private static final boolean DEBUG = true; private static final boolean DEBUG = false; private int mLaunchedFromUid; private ResolveListAdapter mAdapter; Loading @@ -84,6 +88,10 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic private int mMaxColumns; private int mLastSelected = ListView.INVALID_POSITION; private UsageStatsManager mUsm; private UsageStats mStats; private static final long USAGE_STATS_PERIOD = 1000 * 60 * 60 * 24 * 14; private boolean mRegistered; private final PackageMonitor mPackageMonitor = new PackageMonitor() { @Override public void onSomePackagesChanged() { Loading Loading @@ -170,7 +178,7 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic protected void onCreate(Bundle savedInstanceState, Intent intent, CharSequence title, Intent[] initialIntents, List<ResolveInfo> rList, boolean alwaysUseOption) { onCreate(savedInstanceState, intent, title, initialIntents, rList, alwaysUseOption); onCreate(savedInstanceState, intent, title, 0, initialIntents, rList, alwaysUseOption); } protected void onCreate(Bundle savedInstanceState, Intent intent, Loading @@ -185,6 +193,12 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic mLaunchedFromUid = -1; } mPm = getPackageManager(); mUsm = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE); final long sinceTime = System.currentTimeMillis() - USAGE_STATS_PERIOD; mStats = mUsm.getRecentStatsSince(sinceTime); Log.d(TAG, "sinceTime=" + sinceTime); mMaxColumns = getResources().getInteger(R.integer.config_maxResolverActivityColumns); mPackageMonitor.register(this, getMainLooper(), false); Loading Loading @@ -672,7 +686,7 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic for (int i=1; i<N; i++) { ResolveInfo ri = currentResolveList.get(i); if (DEBUG) Log.v( "ResolveListActivity", TAG, r0.activityInfo.name + "=" + r0.priority + "/" + r0.isDefault + " vs " + ri.activityInfo.name + "=" + Loading @@ -689,8 +703,8 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic } } if (N > 1) { ResolveInfo.DisplayNameComparator rComparator = new ResolveInfo.DisplayNameComparator(mPm); Comparator<ResolveInfo> rComparator = new ResolverComparator(ResolverActivity.this); Collections.sort(currentResolveList, rComparator); } // First put the initial items at the top. Loading @@ -703,8 +717,7 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic ActivityInfo ai = ii.resolveActivityInfo( getPackageManager(), 0); if (ai == null) { Log.w("ResolverActivity", "No activity found for " + ii); Log.w(TAG, "No activity found for " + ii); continue; } ResolveInfo ri = new ResolveInfo(); Loading Loading @@ -939,5 +952,52 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic mTargetView.setImageDrawable(info.displayIcon); } } class ResolverComparator implements Comparator<ResolveInfo> { private final Collator mCollator; public ResolverComparator(Context context) { mCollator = Collator.getInstance(context.getResources().getConfiguration().locale); } @Override public int compare(ResolveInfo lhs, ResolveInfo rhs) { // We want to put the one targeted to another user at the end of the dialog. if (lhs.targetUserId != UserHandle.USER_CURRENT) { return 1; } if (lhs.targetUserId != UserHandle.USER_CURRENT) { return -1; } if (mStats != null) { final long timeDiff = getPackageTimeSpent(rhs.activityInfo.packageName) - getPackageTimeSpent(lhs.activityInfo.packageName); if (timeDiff != 0) { return timeDiff > 0 ? 1 : -1; } } CharSequence sa = lhs.loadLabel(mPm); if (sa == null) sa = lhs.activityInfo.name; CharSequence sb = rhs.loadLabel(mPm); if (sb == null) sb = rhs.activityInfo.name; return mCollator.compare(sa.toString(), sb.toString()); } private long getPackageTimeSpent(String packageName) { if (mStats != null) { final PackageUsageStats stats = mStats.getPackage(packageName); if (stats != null) { return stats.getTotalTimeSpent(); } } return 0; } } } core/res/AndroidManifest.xml +4 −3 Original line number Diff line number Diff line Loading @@ -2462,6 +2462,7 @@ android:label="@string/permlab_pkgUsageStats" android:description="@string/permdesc_pkgUsageStats" android:protectionLevel="signature|system" /> <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" /> <!-- @SystemApi Allows an application to collect battery statistics --> <permission android:name="android.permission.BATTERY_STATS" Loading Loading @@ -2796,12 +2797,12 @@ android:icon="@drawable/ic_launcher_android" android:supportsRtl="true"> <activity android:name="com.android.internal.app.ChooserActivity" android:theme="@style/Theme.Holo.Dialog.Alert" android:theme="@style/Theme.DeviceDefault.Resolver" android:finishOnCloseSystemDialogs="true" android:excludeFromRecents="true" android:multiprocess="true" android:documentLaunchMode="never" android:relinquishTaskIdentity="true"> android:relinquishTaskIdentity="true" android:process=":ui"> <intent-filter> <action android:name="android.intent.action.CHOOSER" /> <category android:name="android.intent.category.DEFAULT" /> Loading core/res/res/layout/resolve_list_item.xml +2 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ <!-- Activity name --> <TextView android:id="@android:id/text1" android:textAppearance="?android:attr/textAppearanceSmall" android:fontFamily="sans-serif-condensed" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" Loading @@ -51,6 +52,7 @@ <!-- Extended activity info to distinguish between duplicate activity names --> <TextView android:id="@android:id/text2" android:textAppearance="?android:attr/textAppearanceSmall" android:fontFamily="sans-serif-condensed" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" Loading Loading
core/java/android/app/usage/UsageStats.java +1 −0 Original line number Diff line number Diff line Loading @@ -134,6 +134,7 @@ public final class UsageStats implements Parcelable { mLastTimeSaved = stats.mLastTimeSaved; final int pkgCount = stats.mPackageStats.size(); mPackageStats.ensureCapacity(pkgCount); for (int i = 0; i < pkgCount; i++) { PackageUsageStats pkgStats = stats.mPackageStats.valueAt(i); mPackageStats.append(stats.mPackageStats.keyAt(i), new PackageUsageStats(pkgStats)); Loading
core/java/com/android/internal/app/ResolverActivity.java +68 −8 Original line number Diff line number Diff line Loading @@ -17,6 +17,9 @@ package com.android.internal.app; import android.app.Activity; import android.app.usage.PackageUsageStats; import android.app.usage.UsageStats; import android.app.usage.UsageStatsManager; import android.os.AsyncTask; import android.widget.AbsListView; import android.widget.GridView; Loading Loading @@ -54,12 +57,13 @@ import android.widget.ListView; import android.widget.TextView; import com.android.internal.widget.ResolverDrawerLayout; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; /** Loading @@ -69,7 +73,7 @@ import java.util.Set; */ public class ResolverActivity extends Activity implements AdapterView.OnItemClickListener { private static final String TAG = "ResolverActivity"; private static final boolean DEBUG = true; private static final boolean DEBUG = false; private int mLaunchedFromUid; private ResolveListAdapter mAdapter; Loading @@ -84,6 +88,10 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic private int mMaxColumns; private int mLastSelected = ListView.INVALID_POSITION; private UsageStatsManager mUsm; private UsageStats mStats; private static final long USAGE_STATS_PERIOD = 1000 * 60 * 60 * 24 * 14; private boolean mRegistered; private final PackageMonitor mPackageMonitor = new PackageMonitor() { @Override public void onSomePackagesChanged() { Loading Loading @@ -170,7 +178,7 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic protected void onCreate(Bundle savedInstanceState, Intent intent, CharSequence title, Intent[] initialIntents, List<ResolveInfo> rList, boolean alwaysUseOption) { onCreate(savedInstanceState, intent, title, initialIntents, rList, alwaysUseOption); onCreate(savedInstanceState, intent, title, 0, initialIntents, rList, alwaysUseOption); } protected void onCreate(Bundle savedInstanceState, Intent intent, Loading @@ -185,6 +193,12 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic mLaunchedFromUid = -1; } mPm = getPackageManager(); mUsm = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE); final long sinceTime = System.currentTimeMillis() - USAGE_STATS_PERIOD; mStats = mUsm.getRecentStatsSince(sinceTime); Log.d(TAG, "sinceTime=" + sinceTime); mMaxColumns = getResources().getInteger(R.integer.config_maxResolverActivityColumns); mPackageMonitor.register(this, getMainLooper(), false); Loading Loading @@ -672,7 +686,7 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic for (int i=1; i<N; i++) { ResolveInfo ri = currentResolveList.get(i); if (DEBUG) Log.v( "ResolveListActivity", TAG, r0.activityInfo.name + "=" + r0.priority + "/" + r0.isDefault + " vs " + ri.activityInfo.name + "=" + Loading @@ -689,8 +703,8 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic } } if (N > 1) { ResolveInfo.DisplayNameComparator rComparator = new ResolveInfo.DisplayNameComparator(mPm); Comparator<ResolveInfo> rComparator = new ResolverComparator(ResolverActivity.this); Collections.sort(currentResolveList, rComparator); } // First put the initial items at the top. Loading @@ -703,8 +717,7 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic ActivityInfo ai = ii.resolveActivityInfo( getPackageManager(), 0); if (ai == null) { Log.w("ResolverActivity", "No activity found for " + ii); Log.w(TAG, "No activity found for " + ii); continue; } ResolveInfo ri = new ResolveInfo(); Loading Loading @@ -939,5 +952,52 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic mTargetView.setImageDrawable(info.displayIcon); } } class ResolverComparator implements Comparator<ResolveInfo> { private final Collator mCollator; public ResolverComparator(Context context) { mCollator = Collator.getInstance(context.getResources().getConfiguration().locale); } @Override public int compare(ResolveInfo lhs, ResolveInfo rhs) { // We want to put the one targeted to another user at the end of the dialog. if (lhs.targetUserId != UserHandle.USER_CURRENT) { return 1; } if (lhs.targetUserId != UserHandle.USER_CURRENT) { return -1; } if (mStats != null) { final long timeDiff = getPackageTimeSpent(rhs.activityInfo.packageName) - getPackageTimeSpent(lhs.activityInfo.packageName); if (timeDiff != 0) { return timeDiff > 0 ? 1 : -1; } } CharSequence sa = lhs.loadLabel(mPm); if (sa == null) sa = lhs.activityInfo.name; CharSequence sb = rhs.loadLabel(mPm); if (sb == null) sb = rhs.activityInfo.name; return mCollator.compare(sa.toString(), sb.toString()); } private long getPackageTimeSpent(String packageName) { if (mStats != null) { final PackageUsageStats stats = mStats.getPackage(packageName); if (stats != null) { return stats.getTotalTimeSpent(); } } return 0; } } }
core/res/AndroidManifest.xml +4 −3 Original line number Diff line number Diff line Loading @@ -2462,6 +2462,7 @@ android:label="@string/permlab_pkgUsageStats" android:description="@string/permdesc_pkgUsageStats" android:protectionLevel="signature|system" /> <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" /> <!-- @SystemApi Allows an application to collect battery statistics --> <permission android:name="android.permission.BATTERY_STATS" Loading Loading @@ -2796,12 +2797,12 @@ android:icon="@drawable/ic_launcher_android" android:supportsRtl="true"> <activity android:name="com.android.internal.app.ChooserActivity" android:theme="@style/Theme.Holo.Dialog.Alert" android:theme="@style/Theme.DeviceDefault.Resolver" android:finishOnCloseSystemDialogs="true" android:excludeFromRecents="true" android:multiprocess="true" android:documentLaunchMode="never" android:relinquishTaskIdentity="true"> android:relinquishTaskIdentity="true" android:process=":ui"> <intent-filter> <action android:name="android.intent.action.CHOOSER" /> <category android:name="android.intent.category.DEFAULT" /> Loading
core/res/res/layout/resolve_list_item.xml +2 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ <!-- Activity name --> <TextView android:id="@android:id/text1" android:textAppearance="?android:attr/textAppearanceSmall" android:fontFamily="sans-serif-condensed" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" Loading @@ -51,6 +52,7 @@ <!-- Extended activity info to distinguish between duplicate activity names --> <TextView android:id="@android:id/text2" android:textAppearance="?android:attr/textAppearanceSmall" android:fontFamily="sans-serif-condensed" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" Loading