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

Commit bd37b5f8 authored by Tej Singh's avatar Tej Singh Committed by Android (Google) Code Review
Browse files

Merge "APIs for registering config activation broadcasts"

parents 34521ced 2c9ef2a9
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