Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d157f52c authored by Kweku Adams's avatar Kweku Adams
Browse files

Reward installers for each install.

Give installers a one-time reward for each app install/update they
perform. This should help them mostly when they're performing bulk
updates.

Bug: 243987091
Test: install apps and verify the requesting app is credited
Change-Id: I9800ee1adae6b7039eb3dcb15c1cd7bb1a4aa9e3
parent b91f96a9
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -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;
+3 −0
Original line number Diff line number Diff line
@@ -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);
    }
+17 −4
Original line number Diff line number Diff line
@@ -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();
    }
}
+6 −1
Original line number Diff line number Diff line
@@ -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);
            }
        }
    }

+19 −0
Original line number Diff line number Diff line
@@ -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