Loading core/java/android/app/usage/AppStandbyInfo.java 0 → 100644 +64 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 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 android.app.usage; import android.os.Parcel; import android.os.Parcelable; /** * A pair of {package, bucket} to denote the app standby bucket for a given package. * Used as a vehicle of data across the binder IPC. * @hide */ public final class AppStandbyInfo implements Parcelable { public String mPackageName; public @UsageStatsManager.StandbyBuckets int mStandbyBucket; private AppStandbyInfo(Parcel in) { mPackageName = in.readString(); mStandbyBucket = in.readInt(); } public AppStandbyInfo(String packageName, int bucket) { mPackageName = packageName; mStandbyBucket = bucket; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(mPackageName); dest.writeInt(mStandbyBucket); } public static final Creator<AppStandbyInfo> CREATOR = new Creator<AppStandbyInfo>() { @Override public AppStandbyInfo createFromParcel(Parcel source) { return new AppStandbyInfo(source); } @Override public AppStandbyInfo[] newArray(int size) { return new AppStandbyInfo[size]; } }; } core/java/android/app/usage/IUsageStatsManager.aidl +2 −2 Original line number Diff line number Diff line Loading @@ -40,6 +40,6 @@ interface IUsageStatsManager { in String[] annotations, String action); int getAppStandbyBucket(String packageName, String callingPackage, int userId); void setAppStandbyBucket(String packageName, int bucket, int userId); Map getAppStandbyBuckets(String callingPackage, int userId); void setAppStandbyBuckets(in Map appBuckets, int userId); ParceledListSlice getAppStandbyBuckets(String callingPackage, int userId); void setAppStandbyBuckets(in ParceledListSlice appBuckets, int userId); } core/java/android/app/usage/UsageStatsManager.java +19 −2 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.util.ArrayMap; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; Loading Loading @@ -388,8 +389,16 @@ public final class UsageStatsManager { @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public Map<String, Integer> getAppStandbyBuckets() { try { return (Map<String, Integer>) mService.getAppStandbyBuckets( final ParceledListSlice<AppStandbyInfo> slice = mService.getAppStandbyBuckets( mContext.getOpPackageName(), mContext.getUserId()); final List<AppStandbyInfo> bucketList = slice.getList(); final ArrayMap<String, Integer> bucketMap = new ArrayMap<>(); final int n = bucketList.size(); for (int i = 0; i < n; i++) { final AppStandbyInfo bucketInfo = bucketList.get(i); bucketMap.put(bucketInfo.mPackageName, bucketInfo.mStandbyBucket); } return bucketMap; } catch (RemoteException e) { } return Collections.EMPTY_MAP; Loading @@ -404,8 +413,16 @@ public final class UsageStatsManager { @SystemApi @RequiresPermission(android.Manifest.permission.CHANGE_APP_IDLE_STATE) public void setAppStandbyBuckets(Map<String, Integer> appBuckets) { if (appBuckets == null) { return; } final List<AppStandbyInfo> bucketInfoList = new ArrayList<>(appBuckets.size()); for (Map.Entry<String, Integer> bucketEntry : appBuckets.entrySet()) { bucketInfoList.add(new AppStandbyInfo(bucketEntry.getKey(), bucketEntry.getValue())); } final ParceledListSlice<AppStandbyInfo> slice = new ParceledListSlice<>(bucketInfoList); try { mService.setAppStandbyBuckets(appBuckets, mContext.getUserId()); mService.setAppStandbyBuckets(slice, mContext.getUserId()); } catch (RemoteException e) { } } Loading services/core/java/com/android/server/am/ActivityManagerShellCommand.java +10 −8 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.app.IStopUserCallback; import android.app.IUidObserver; import android.app.ProfilerInfo; import android.app.WaitResult; import android.app.usage.AppStandbyInfo; import android.app.usage.ConfigurationStats; import android.app.usage.IUsageStatsManager; import android.app.usage.UsageStatsManager; Loading Loading @@ -1944,15 +1945,16 @@ final class ActivityManagerShellCommand extends ShellCommand { if (!multiple) { usm.setAppStandbyBucket(packageName, bucketNameToBucketValue(value), userId); } else { HashMap<String, Integer> buckets = new HashMap<>(); buckets.put(packageName, bucket); ArrayList<AppStandbyInfo> bucketInfoList = new ArrayList<>(); bucketInfoList.add(new AppStandbyInfo(packageName, bucket)); while ((packageName = getNextArg()) != null) { value = getNextArgRequired(); bucket = bucketNameToBucketValue(value); if (bucket < 0) continue; buckets.put(packageName, bucket); bucketInfoList.add(new AppStandbyInfo(packageName, bucket)); } usm.setAppStandbyBuckets(buckets, userId); ParceledListSlice<AppStandbyInfo> slice = new ParceledListSlice<>(bucketInfoList); usm.setAppStandbyBuckets(slice, userId); } return 0; } Loading @@ -1977,11 +1979,11 @@ final class ActivityManagerShellCommand extends ShellCommand { int bucket = usm.getAppStandbyBucket(packageName, null, userId); pw.println(bucket); } else { Map<String, Integer> buckets = (Map<String, Integer>) usm.getAppStandbyBuckets( ParceledListSlice<AppStandbyInfo> buckets = usm.getAppStandbyBuckets( SHELL_PACKAGE_NAME, userId); for (Map.Entry<String, Integer> entry: buckets.entrySet()) { pw.print(entry.getKey()); pw.print(": "); pw.println(entry.getValue()); for (AppStandbyInfo bucketInfo : buckets.getList()) { pw.print(bucketInfo.mPackageName); pw.print(": "); pw.println(bucketInfo.mStandbyBucket); } } return 0; Loading services/usage/java/com/android/server/usage/AppIdleHistory.java +6 −9 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_NEVER; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET; import android.app.usage.AppStandbyInfo; import android.app.usage.UsageStatsManager; import android.os.SystemClock; import android.util.ArrayMap; Loading @@ -37,8 +38,6 @@ import android.util.Xml; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.IndentingPrintWriter; import com.android.server.LocalServices; import com.android.server.job.JobSchedulerInternal; import libcore.io.IoUtils; Loading @@ -53,8 +52,7 @@ import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.ArrayList; /** * Keeps track of recent active state changes in apps. Loading Loading @@ -384,14 +382,13 @@ public class AppIdleHistory { return appUsageHistory.currentBucket; } public Map<String, Integer> getAppStandbyBuckets(int userId, long elapsedRealtime, boolean appIdleEnabled) { public ArrayList<AppStandbyInfo> getAppStandbyBuckets(int userId, boolean appIdleEnabled) { ArrayMap<String, AppUsageHistory> userHistory = getUserHistory(userId); int size = userHistory.size(); HashMap<String, Integer> buckets = new HashMap<>(size); ArrayList<AppStandbyInfo> buckets = new ArrayList<>(size); for (int i = 0; i < size; i++) { buckets.put(userHistory.keyAt(i), appIdleEnabled ? userHistory.valueAt(i).currentBucket : STANDBY_BUCKET_ACTIVE); buckets.add(new AppStandbyInfo(userHistory.keyAt(i), appIdleEnabled ? userHistory.valueAt(i).currentBucket : STANDBY_BUCKET_ACTIVE)); } return buckets; } Loading Loading
core/java/android/app/usage/AppStandbyInfo.java 0 → 100644 +64 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 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 android.app.usage; import android.os.Parcel; import android.os.Parcelable; /** * A pair of {package, bucket} to denote the app standby bucket for a given package. * Used as a vehicle of data across the binder IPC. * @hide */ public final class AppStandbyInfo implements Parcelable { public String mPackageName; public @UsageStatsManager.StandbyBuckets int mStandbyBucket; private AppStandbyInfo(Parcel in) { mPackageName = in.readString(); mStandbyBucket = in.readInt(); } public AppStandbyInfo(String packageName, int bucket) { mPackageName = packageName; mStandbyBucket = bucket; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(mPackageName); dest.writeInt(mStandbyBucket); } public static final Creator<AppStandbyInfo> CREATOR = new Creator<AppStandbyInfo>() { @Override public AppStandbyInfo createFromParcel(Parcel source) { return new AppStandbyInfo(source); } @Override public AppStandbyInfo[] newArray(int size) { return new AppStandbyInfo[size]; } }; }
core/java/android/app/usage/IUsageStatsManager.aidl +2 −2 Original line number Diff line number Diff line Loading @@ -40,6 +40,6 @@ interface IUsageStatsManager { in String[] annotations, String action); int getAppStandbyBucket(String packageName, String callingPackage, int userId); void setAppStandbyBucket(String packageName, int bucket, int userId); Map getAppStandbyBuckets(String callingPackage, int userId); void setAppStandbyBuckets(in Map appBuckets, int userId); ParceledListSlice getAppStandbyBuckets(String callingPackage, int userId); void setAppStandbyBuckets(in ParceledListSlice appBuckets, int userId); }
core/java/android/app/usage/UsageStatsManager.java +19 −2 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.util.ArrayMap; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; Loading Loading @@ -388,8 +389,16 @@ public final class UsageStatsManager { @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public Map<String, Integer> getAppStandbyBuckets() { try { return (Map<String, Integer>) mService.getAppStandbyBuckets( final ParceledListSlice<AppStandbyInfo> slice = mService.getAppStandbyBuckets( mContext.getOpPackageName(), mContext.getUserId()); final List<AppStandbyInfo> bucketList = slice.getList(); final ArrayMap<String, Integer> bucketMap = new ArrayMap<>(); final int n = bucketList.size(); for (int i = 0; i < n; i++) { final AppStandbyInfo bucketInfo = bucketList.get(i); bucketMap.put(bucketInfo.mPackageName, bucketInfo.mStandbyBucket); } return bucketMap; } catch (RemoteException e) { } return Collections.EMPTY_MAP; Loading @@ -404,8 +413,16 @@ public final class UsageStatsManager { @SystemApi @RequiresPermission(android.Manifest.permission.CHANGE_APP_IDLE_STATE) public void setAppStandbyBuckets(Map<String, Integer> appBuckets) { if (appBuckets == null) { return; } final List<AppStandbyInfo> bucketInfoList = new ArrayList<>(appBuckets.size()); for (Map.Entry<String, Integer> bucketEntry : appBuckets.entrySet()) { bucketInfoList.add(new AppStandbyInfo(bucketEntry.getKey(), bucketEntry.getValue())); } final ParceledListSlice<AppStandbyInfo> slice = new ParceledListSlice<>(bucketInfoList); try { mService.setAppStandbyBuckets(appBuckets, mContext.getUserId()); mService.setAppStandbyBuckets(slice, mContext.getUserId()); } catch (RemoteException e) { } } Loading
services/core/java/com/android/server/am/ActivityManagerShellCommand.java +10 −8 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.app.IStopUserCallback; import android.app.IUidObserver; import android.app.ProfilerInfo; import android.app.WaitResult; import android.app.usage.AppStandbyInfo; import android.app.usage.ConfigurationStats; import android.app.usage.IUsageStatsManager; import android.app.usage.UsageStatsManager; Loading Loading @@ -1944,15 +1945,16 @@ final class ActivityManagerShellCommand extends ShellCommand { if (!multiple) { usm.setAppStandbyBucket(packageName, bucketNameToBucketValue(value), userId); } else { HashMap<String, Integer> buckets = new HashMap<>(); buckets.put(packageName, bucket); ArrayList<AppStandbyInfo> bucketInfoList = new ArrayList<>(); bucketInfoList.add(new AppStandbyInfo(packageName, bucket)); while ((packageName = getNextArg()) != null) { value = getNextArgRequired(); bucket = bucketNameToBucketValue(value); if (bucket < 0) continue; buckets.put(packageName, bucket); bucketInfoList.add(new AppStandbyInfo(packageName, bucket)); } usm.setAppStandbyBuckets(buckets, userId); ParceledListSlice<AppStandbyInfo> slice = new ParceledListSlice<>(bucketInfoList); usm.setAppStandbyBuckets(slice, userId); } return 0; } Loading @@ -1977,11 +1979,11 @@ final class ActivityManagerShellCommand extends ShellCommand { int bucket = usm.getAppStandbyBucket(packageName, null, userId); pw.println(bucket); } else { Map<String, Integer> buckets = (Map<String, Integer>) usm.getAppStandbyBuckets( ParceledListSlice<AppStandbyInfo> buckets = usm.getAppStandbyBuckets( SHELL_PACKAGE_NAME, userId); for (Map.Entry<String, Integer> entry: buckets.entrySet()) { pw.print(entry.getKey()); pw.print(": "); pw.println(entry.getValue()); for (AppStandbyInfo bucketInfo : buckets.getList()) { pw.print(bucketInfo.mPackageName); pw.print(": "); pw.println(bucketInfo.mStandbyBucket); } } return 0; Loading
services/usage/java/com/android/server/usage/AppIdleHistory.java +6 −9 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_NEVER; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET; import android.app.usage.AppStandbyInfo; import android.app.usage.UsageStatsManager; import android.os.SystemClock; import android.util.ArrayMap; Loading @@ -37,8 +38,6 @@ import android.util.Xml; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.IndentingPrintWriter; import com.android.server.LocalServices; import com.android.server.job.JobSchedulerInternal; import libcore.io.IoUtils; Loading @@ -53,8 +52,7 @@ import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.ArrayList; /** * Keeps track of recent active state changes in apps. Loading Loading @@ -384,14 +382,13 @@ public class AppIdleHistory { return appUsageHistory.currentBucket; } public Map<String, Integer> getAppStandbyBuckets(int userId, long elapsedRealtime, boolean appIdleEnabled) { public ArrayList<AppStandbyInfo> getAppStandbyBuckets(int userId, boolean appIdleEnabled) { ArrayMap<String, AppUsageHistory> userHistory = getUserHistory(userId); int size = userHistory.size(); HashMap<String, Integer> buckets = new HashMap<>(size); ArrayList<AppStandbyInfo> buckets = new ArrayList<>(size); for (int i = 0; i < size; i++) { buckets.put(userHistory.keyAt(i), appIdleEnabled ? userHistory.valueAt(i).currentBucket : STANDBY_BUCKET_ACTIVE); buckets.add(new AppStandbyInfo(userHistory.keyAt(i), appIdleEnabled ? userHistory.valueAt(i).currentBucket : STANDBY_BUCKET_ACTIVE)); } return buckets; } Loading