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

Commit 2c9ef2a9 authored by Tej Singh's avatar Tej Singh
Browse files

APIs for registering config activation broadcasts

Creates a StatsManager API to register a pending intent that is invoked
whenever the active status of any of any config sent by that uid
changes.

ag/6112554 and further cls are needed to properly send back the pending
intent.

Bug: 123372077
Test: build success on blueline-eng. More thorough testing should be
done once ag/6112554 is submitted.

Change-Id: I36985c9820d4e7ac178064924190af88ea822254
parent 85d9b31a
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -508,11 +508,13 @@ package android.app {
    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getStatsMetadata() throws android.app.StatsManager.StatsUnavailableException;
    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void removeConfig(long) throws android.app.StatsManager.StatsUnavailableException;
    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean removeConfiguration(long);
    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setActiveConfigsChangedOperation(@Nullable android.app.PendingIntent) throws android.app.StatsManager.StatsUnavailableException;
    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setBroadcastSubscriber(android.app.PendingIntent, long, long) throws android.app.StatsManager.StatsUnavailableException;
    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setBroadcastSubscriber(long, long, android.app.PendingIntent);
    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setDataFetchOperation(long, android.app.PendingIntent);
    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setFetchReportsOperation(android.app.PendingIntent, long) throws android.app.StatsManager.StatsUnavailableException;
    field public static final String ACTION_STATSD_STARTED = "android.app.action.STATSD_STARTED";
    field public static final String EXTRA_STATS_ACTIVE_CONFIG_KEYS = "android.app.extra.STATS_ACTIVE_CONFIG_KEYS";
    field public static final String EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES = "android.app.extra.STATS_BROADCAST_SUBSCRIBER_COOKIES";
    field public static final String EXTRA_STATS_CONFIG_KEY = "android.app.extra.STATS_CONFIG_KEY";
    field public static final String EXTRA_STATS_CONFIG_UID = "android.app.extra.STATS_CONFIG_UID";
+19 −0
Original line number Diff line number Diff line
@@ -989,6 +989,25 @@ Status StatsService::setDataFetchOperation(int64_t key,
    return Status::ok();
}

Status StatsService::setActiveConfigsChangedOperation(const sp<android::IBinder>& intentSender,
                                                      const String16& packageName,
                                                      vector<int64_t>* output) {
    ENFORCE_DUMP_AND_USAGE_STATS(packageName);

    IPCThreadState* ipc = IPCThreadState::self();
    mConfigManager->SetActiveConfigsChangedReceiver(ipc->getCallingUid(), intentSender);
    //TODO: Return the list of configs that are already active
    return Status::ok();
}

Status StatsService::removeActiveConfigsChangedOperation(const String16& packageName) {
    ENFORCE_DUMP_AND_USAGE_STATS(packageName);

    IPCThreadState* ipc = IPCThreadState::self();
    mConfigManager->RemoveActiveConfigsChangedReceiver(ipc->getCallingUid());
    return Status::ok();
}

Status StatsService::removeConfiguration(int64_t key, const String16& packageName) {
    ENFORCE_DUMP_AND_USAGE_STATS(packageName);

+11 −0
Original line number Diff line number Diff line
@@ -131,6 +131,17 @@ public:
    virtual Status removeDataFetchOperation(int64_t key,
                                            const String16& packageName) override;

    /**
     * Binder call to let clients register the active configs changed operation.
     */
    virtual Status setActiveConfigsChangedOperation(const sp<android::IBinder>& intentSender,
                                                    const String16& packageName,
                                                    vector<int64_t>* output) override;

    /**
     * Binder call to remove the active configs changed operation for the specified package..
     */
    virtual Status removeActiveConfigsChangedOperation(const String16& packageName) override;
    /**
     * Binder call to allow clients to remove the specified configuration.
     */
+28 −0
Original line number Diff line number Diff line
@@ -128,6 +128,17 @@ void ConfigManager::RemoveConfigReceiver(const ConfigKey& key) {
    mConfigReceivers.erase(key);
}

void ConfigManager::SetActiveConfigsChangedReceiver(const int uid,
                                                    const sp<IBinder>& intentSender) {
    lock_guard<mutex> lock(mMutex);
    mActiveConfigsChangedReceivers[uid] = intentSender;
}

void ConfigManager::RemoveActiveConfigsChangedReceiver(const int uid) {
    lock_guard<mutex> lock(mMutex);
    mActiveConfigsChangedReceivers.erase(uid);
}

void ConfigManager::RemoveConfig(const ConfigKey& key) {
    vector<sp<ConfigListener>> broadcastList;
    {
@@ -181,6 +192,11 @@ void ConfigManager::RemoveConfigs(int uid) {
                mConfigReceivers.erase(*it);
        }

        auto itActiveConfigsChangedReceiver = mActiveConfigsChangedReceivers.find(uid);
        if (itActiveConfigsChangedReceiver != mActiveConfigsChangedReceivers.end()) {
            mActiveConfigsChangedReceivers.erase(itActiveConfigsChangedReceiver);
        }

        mConfigs.erase(uidIt);

        for (const sp<ConfigListener>& listener : mListeners) {
@@ -213,6 +229,7 @@ void ConfigManager::RemoveAllConfigs() {
        }

        mConfigReceivers.clear();
        mActiveConfigsChangedReceivers.clear();
        for (const sp<ConfigListener>& listener : mListeners) {
            broadcastList.push_back(listener);
        }
@@ -250,6 +267,17 @@ const sp<android::IBinder> ConfigManager::GetConfigReceiver(const ConfigKey& key
    }
}

const sp<android::IBinder> ConfigManager::GetActiveConfigsChangedReceiver(const int uid) const {
    lock_guard<mutex> lock(mMutex);

    auto it = mActiveConfigsChangedReceivers.find(uid);
    if (it == mActiveConfigsChangedReceivers.end()) {
        return nullptr;
    } else {
        return it->second;
    }
}

void ConfigManager::Dump(FILE* out) {
    lock_guard<mutex> lock(mMutex);

+23 −0
Original line number Diff line number Diff line
@@ -81,6 +81,23 @@ public:
     */
    void RemoveConfigReceiver(const ConfigKey& key);

    /**
     * Sets the broadcast receiver that is notified whenever the list of active configs
     * changes for this uid.
     */
    void SetActiveConfigsChangedReceiver(const int uid, const sp<IBinder>& intentSender);

    /**
     * Returns the broadcast receiver for active configs changed for this uid.
     */

    const sp<IBinder> GetActiveConfigsChangedReceiver(const int uid) const;

    /**
     * Erase any active configs changed broadcast receiver associated with this uid.
     */
    void RemoveActiveConfigsChangedReceiver(const int uid);

    /**
     * A configuration was removed.
     *
@@ -129,6 +146,12 @@ private:
     */
    std::map<ConfigKey, sp<android::IBinder>> mConfigReceivers;

    /**
     * Each uid can be subscribed by up to one receiver to notify that the list of active configs
     * for this uid has changed. The receiver is specified as IBinder from PendingIntent.
     */
     std::map<int, sp<android::IBinder>> mActiveConfigsChangedReceivers;

    /**
     * The ConfigListeners that will be told about changes.
     */
Loading