diff --git a/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java b/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java index c3fc7b16ebdfb..be0e02595b60b 100644 --- a/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java +++ b/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java @@ -235,6 +235,15 @@ public class EconomyManager { public static final String KEY_JS_HARD_CONSUMPTION_LIMIT = "js_hard_consumption_limit"; // TODO: Add JobScheduler modifier keys /** @hide */ + public static final String KEY_JS_REWARD_APP_INSTALL_INSTANT = + "js_reward_app_install_instant"; + /** @hide */ + public static final String KEY_JS_REWARD_APP_INSTALL_ONGOING = + "js_reward_app_install_ongoing"; + /** @hide */ + public static final String KEY_JS_REWARD_APP_INSTALL_MAX = + "js_reward_app_install_max"; + /** @hide */ public static final String KEY_JS_REWARD_TOP_ACTIVITY_INSTANT = "js_reward_top_activity_instant"; /** @hide */ @@ -463,6 +472,12 @@ public class EconomyManager { public static final long DEFAULT_JS_HARD_CONSUMPTION_LIMIT_CAKES = arcToCake(250_000); // TODO: add JobScheduler modifier default values /** @hide */ + public static final long DEFAULT_JS_REWARD_APP_INSTALL_INSTANT_CAKES = arcToCake(408); + /** @hide */ + public static final long DEFAULT_JS_REWARD_APP_INSTALL_ONGOING_CAKES = arcToCake(0); + /** @hide */ + public static final long DEFAULT_JS_REWARD_APP_INSTALL_MAX_CAKES = arcToCake(4000); + /** @hide */ public static final long DEFAULT_JS_REWARD_TOP_ACTIVITY_INSTANT_CAKES = arcToCake(0); /** @hide */ public static final long DEFAULT_JS_REWARD_TOP_ACTIVITY_ONGOING_CAKES = CAKE_IN_ARC / 2; diff --git a/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java index 4ba69570f7e07..d2b37ca19ec71 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java @@ -119,6 +119,7 @@ public abstract class EconomicPolicy { REWARD_NOTIFICATION_INTERACTION, REWARD_WIDGET_INTERACTION, REWARD_OTHER_USER_INTERACTION, + JobSchedulerEconomicPolicy.REWARD_APP_INSTALL, }) @Retention(RetentionPolicy.SOURCE) public @interface UtilityReward { @@ -429,6 +430,8 @@ public abstract class EconomicPolicy { return "REWARD_WIDGET_INTERACTION"; case REWARD_OTHER_USER_INTERACTION: return "REWARD_OTHER_USER_INTERACTION"; + case JobSchedulerEconomicPolicy.REWARD_APP_INSTALL: + return "REWARD_JOB_APP_INSTALL"; } return "UNKNOWN_REWARD:" + Integer.toHexString(eventId); } diff --git a/apex/jobscheduler/service/java/com/android/server/tare/InstalledPackageInfo.java b/apex/jobscheduler/service/java/com/android/server/tare/InstalledPackageInfo.java index da544bb6a2eb6..fcb3e6759412f 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/InstalledPackageInfo.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/InstalledPackageInfo.java @@ -17,9 +17,12 @@ package com.android.server.tare; import android.annotation.NonNull; +import android.annotation.Nullable; +import android.app.AppGlobals; import android.content.pm.ApplicationInfo; +import android.content.pm.InstallSourceInfo; import android.content.pm.PackageInfo; -import android.os.UserHandle; +import android.os.RemoteException; /** POJO to cache only the information about installed packages that TARE cares about. */ class InstalledPackageInfo { @@ -28,11 +31,21 @@ class InstalledPackageInfo { public final int uid; public final String packageName; public final boolean hasCode; + @Nullable + public final String installerPackageName; InstalledPackageInfo(@NonNull PackageInfo packageInfo) { final ApplicationInfo applicationInfo = packageInfo.applicationInfo; - this.uid = applicationInfo == null ? NO_UID : applicationInfo.uid; - this.packageName = packageInfo.packageName; - this.hasCode = applicationInfo != null && applicationInfo.hasCode(); + uid = applicationInfo == null ? NO_UID : applicationInfo.uid; + packageName = packageInfo.packageName; + hasCode = applicationInfo != null && applicationInfo.hasCode(); + InstallSourceInfo installSourceInfo = null; + try { + installSourceInfo = AppGlobals.getPackageManager().getInstallSourceInfo(packageName); + } catch (RemoteException e) { + // Shouldn't happen. + } + installerPackageName = + installSourceInfo == null ? null : installSourceInfo.getInstallingPackageName(); } } diff --git a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java index 59d4ded8b1d28..c13e1dd978d6f 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java @@ -524,10 +524,15 @@ public class InternalResourceService extends SystemService { mPackageToUidCache.add(userId, pkgName, uid); } synchronized (mLock) { - mPkgCache.add(userId, pkgName, new InstalledPackageInfo(packageInfo)); + final InstalledPackageInfo ipo = new InstalledPackageInfo(packageInfo); + mPkgCache.add(userId, pkgName, ipo); mUidToPackageCache.add(uid, pkgName); // TODO: only do this when the user first launches the app (app leaves stopped state) mAgent.grantBirthrightLocked(userId, pkgName); + if (ipo.installerPackageName != null) { + mAgent.noteInstantaneousEventLocked(userId, ipo.installerPackageName, + JobSchedulerEconomicPolicy.REWARD_APP_INSTALL, null); + } } } diff --git a/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java index cbb88c0f5e31e..55cc3520961e3 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java @@ -43,6 +43,9 @@ import static android.app.tare.EconomyManager.DEFAULT_JS_INITIAL_CONSUMPTION_LIM import static android.app.tare.EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES; import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES; import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_APP_INSTALL_INSTANT_CAKES; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_APP_INSTALL_MAX_CAKES; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_APP_INSTALL_ONGOING_CAKES; import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES; import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES; import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES; @@ -85,6 +88,9 @@ import static android.app.tare.EconomyManager.KEY_JS_INITIAL_CONSUMPTION_LIMIT; import static android.app.tare.EconomyManager.KEY_JS_MAX_SATIATED_BALANCE; import static android.app.tare.EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED; import static android.app.tare.EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_APP_INSTALL_INSTANT; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_APP_INSTALL_MAX; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_APP_INSTALL_ONGOING; import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT; import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_INTERACTION_MAX; import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING; @@ -137,6 +143,8 @@ public class JobSchedulerEconomicPolicy extends EconomicPolicy { public static final int ACTION_JOB_MIN_RUNNING = TYPE_ACTION | POLICY_JS | 9; public static final int ACTION_JOB_TIMEOUT = TYPE_ACTION | POLICY_JS | 10; + public static final int REWARD_APP_INSTALL = TYPE_REWARD | POLICY_JS | 0; + private static final int[] COST_MODIFIERS = new int[]{ COST_MODIFIER_CHARGING, COST_MODIFIER_DEVICE_IDLE, @@ -374,6 +382,17 @@ public class JobSchedulerEconomicPolicy extends EconomicPolicy { getConstantAsCake(mParser, properties, KEY_JS_REWARD_OTHER_USER_INTERACTION_MAX, DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_MAX_CAKES))); + mRewards.put(REWARD_APP_INSTALL, + new Reward(REWARD_APP_INSTALL, + getConstantAsCake(mParser, properties, + KEY_JS_REWARD_APP_INSTALL_INSTANT, + DEFAULT_JS_REWARD_APP_INSTALL_INSTANT_CAKES), + getConstantAsCake(mParser, properties, + KEY_JS_REWARD_APP_INSTALL_ONGOING, + DEFAULT_JS_REWARD_APP_INSTALL_ONGOING_CAKES), + getConstantAsCake(mParser, properties, + KEY_JS_REWARD_APP_INSTALL_MAX, + DEFAULT_JS_REWARD_APP_INSTALL_MAX_CAKES))); } @Override