From e159e2e0b83f9ea9d48f4c8666f9536e9338a70c Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Tue, 22 Jul 2014 15:55:50 -0700 Subject: [PATCH] Add test UsageStats App Also fixed UsageStatsService to do the right thing when AppOps returns MODE_DEFAULT. Change-Id: I0bdb28350fb2528daf2859cdcbbf9ca48d96dde9 --- .../server/usage/UsageStatsService.java | 4 +- tests/UsageStatsTest/Android.mk | 11 ++ tests/UsageStatsTest/AndroidManifest.xml | 17 +++ tests/UsageStatsTest/res/layout/row_item.xml | 20 +++ .../tests/usagestats/UsageStatsActivity.java | 128 ++++++++++++++++++ 5 files changed, 178 insertions(+), 2 deletions(-) create mode 100644 tests/UsageStatsTest/Android.mk create mode 100644 tests/UsageStatsTest/AndroidManifest.xml create mode 100644 tests/UsageStatsTest/res/layout/row_item.xml create mode 100644 tests/UsageStatsTest/src/com/android/tests/usagestats/UsageStatsActivity.java diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 475824af23f70..4018deff7f1b9 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -386,8 +386,8 @@ public class UsageStatsService extends SystemService { private boolean hasPermission(String callingPackage) { final int mode = mAppOps.checkOp(AppOpsManager.OP_GET_USAGE_STATS, Binder.getCallingUid(), callingPackage); - if (mode == AppOpsManager.MODE_IGNORED) { - // If AppOpsManager ignores this, still allow if we have the system level + if (mode == AppOpsManager.MODE_DEFAULT) { + // The default behavior here is to check if PackageManager has given the app // permission. return getContext().checkCallingPermission(Manifest.permission.PACKAGE_USAGE_STATS) == PackageManager.PERMISSION_GRANTED; diff --git a/tests/UsageStatsTest/Android.mk b/tests/UsageStatsTest/Android.mk new file mode 100644 index 0000000000000..69fefeb5bddf3 --- /dev/null +++ b/tests/UsageStatsTest/Android.mk @@ -0,0 +1,11 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := tests + +# Only compile source java files in this apk. +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_PACKAGE_NAME := UsageStatsTest + +include $(BUILD_PACKAGE) diff --git a/tests/UsageStatsTest/AndroidManifest.xml b/tests/UsageStatsTest/AndroidManifest.xml new file mode 100644 index 0000000000000..fac58100102d6 --- /dev/null +++ b/tests/UsageStatsTest/AndroidManifest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + diff --git a/tests/UsageStatsTest/res/layout/row_item.xml b/tests/UsageStatsTest/res/layout/row_item.xml new file mode 100644 index 0000000000000..da50163c94abb --- /dev/null +++ b/tests/UsageStatsTest/res/layout/row_item.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageStatsActivity.java b/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageStatsActivity.java new file mode 100644 index 0000000000000..73143c59cc9e5 --- /dev/null +++ b/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageStatsActivity.java @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2014 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.tests.usagestats; + +import android.app.ListActivity; +import android.app.usage.PackageUsageStats; +import android.app.usage.UsageStats; +import android.app.usage.UsageStatsManager; +import android.content.Context; +import android.os.Bundle; +import android.text.format.DateUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; + +public class UsageStatsActivity extends ListActivity { + + private UsageStatsManager mUsageStatsManager; + private Adapter mAdapter; + private Comparator mComparator = new Comparator() { + @Override + public int compare(PackageUsageStats o1, PackageUsageStats o2) { + return Long.compare(o2.getTotalTimeSpent(), o1.getTotalTimeSpent()); + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mUsageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE); + mAdapter = new Adapter(); + updateAdapter(); + setListAdapter(mAdapter); + } + + @Override + protected void onResume() { + super.onResume(); + updateAdapter(); + } + + private void updateAdapter() { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.DAY_OF_YEAR, -14); + UsageStats stats = mUsageStatsManager.getRecentStatsSince(cal.getTimeInMillis()); + mAdapter.update(stats); + } + + private class Adapter extends BaseAdapter { + private ArrayList mStats = new ArrayList<>(); + + public void update(UsageStats stats) { + mStats.clear(); + if (stats == null) { + return; + } + + final int packageCount = stats.getPackageCount(); + for (int i = 0; i < packageCount; i++) { + mStats.add(stats.getPackage(i)); + } + + Collections.sort(mStats, mComparator); + notifyDataSetChanged(); + } + + @Override + public int getCount() { + return mStats.size(); + } + + @Override + public Object getItem(int position) { + return mStats.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final ViewHolder holder; + if (convertView == null) { + convertView = LayoutInflater.from(UsageStatsActivity.this) + .inflate(R.layout.row_item, parent, false); + holder = new ViewHolder(); + holder.packageName = (TextView) convertView.findViewById(android.R.id.text1); + holder.usageTime = (TextView) convertView.findViewById(android.R.id.text2); + convertView.setTag(holder); + } else { + holder = (ViewHolder) convertView.getTag(); + } + + holder.packageName.setText(mStats.get(position).getPackageName()); + holder.usageTime.setText(DateUtils.formatDuration( + mStats.get(position).getTotalTimeSpent())); + return convertView; + } + } + + private static class ViewHolder { + TextView packageName; + TextView usageTime; + } +} \ No newline at end of file