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

Commit f51ce00a authored by Ahaan Ugale's avatar Ahaan Ugale
Browse files

Apply Assistant AudioPolicy to HotwordDetectionService

The HotwordDetectionService is part of the Assistant package but runs
with a separate (isolated) uid.
This change follows the pattern of how the Assistant and IME UIDs are
set.

Fix: 194368677
Test: manual - hotword works when another app is using the mic and in
 Auto projection mode
Test: atest HotwordDetectionServiceBasicTest
Change-Id: I76a7930431db226c7e502f8993dfeaa4bc133bea
parent 53a58911
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -1922,6 +1922,14 @@ status_t AudioSystem::setAssistantUid(uid_t uid) {
    return statusTFromBinderStatus(aps->setAssistantUid(uidAidl));
}

status_t AudioSystem::setHotwordDetectionServiceUid(uid_t uid) {
    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    if (aps == 0) return PERMISSION_DENIED;

    int32_t uidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
    return statusTFromBinderStatus(aps->setHotwordDetectionServiceUid(uidAidl));
}

status_t AudioSystem::setA11yServicesUids(const std::vector<uid_t>& uids) {
    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    if (aps == 0) return PERMISSION_DENIED;
+2 −0
Original line number Diff line number Diff line
@@ -299,6 +299,8 @@ interface IAudioPolicyService {

    void setAssistantUid(int /* uid_t */ uid);

    void setHotwordDetectionServiceUid(int /* uid_t */ uid);

    void setA11yServicesUids(in int[] /* uid_t[] */ uids);

    void setCurrentImeUid(int /* uid_t */ uid);
+1 −0
Original line number Diff line number Diff line
@@ -429,6 +429,7 @@ public:
    static status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled);

    static status_t setAssistantUid(uid_t uid);
    static status_t setHotwordDetectionServiceUid(uid_t uid);
    static status_t setA11yServicesUids(const std::vector<uid_t>& uids);
    static status_t setCurrentImeUid(uid_t uid);

+8 −0
Original line number Diff line number Diff line
@@ -1916,6 +1916,14 @@ Status AudioPolicyService::setAssistantUid(int32_t uidAidl)
    return Status::ok();
}

Status AudioPolicyService::setHotwordDetectionServiceUid(int32_t uidAidl)
{
    uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
    Mutex::Autolock _l(mLock);
    mUidPolicy->setHotwordDetectionServiceUid(uid);
    return Status::ok();
}

Status AudioPolicyService::setA11yServicesUids(const std::vector<int32_t>& uidsAidl)
{
    size_t size = uidsAidl.size();
+11 −3
Original line number Diff line number Diff line
@@ -199,6 +199,7 @@ public:
    binder::Status setSurroundFormatEnabled(media::audio::common::AudioFormat audioFormat,
                                            bool enabled) override;
    binder::Status setAssistantUid(int32_t uid) override;
    binder::Status setHotwordDetectionServiceUid(int32_t uid) override;
    binder::Status setA11yServicesUids(const std::vector<int32_t>& uids) override;
    binder::Status setCurrentImeUid(int32_t uid) override;
    binder::Status isHapticPlaybackSupported(bool* _aidl_return) override;
@@ -376,7 +377,8 @@ private:
    public:
        explicit UidPolicy(wp<AudioPolicyService> service)
                : mService(service), mObserverRegistered(false),
                  mAssistantUid(0), mCurrentImeUid(0), mRttEnabled(false) {}
                  mAssistantUid(0), mHotwordDetectionServiceUid(0), mCurrentImeUid(0),
                  mRttEnabled(false) {}

        void registerSelf();
        void unregisterSelf();
@@ -386,8 +388,13 @@ private:

        bool isUidActive(uid_t uid);
        int getUidState(uid_t uid);
        void setAssistantUid(uid_t uid) { mAssistantUid = uid; }
        bool isAssistantUid(uid_t uid) { return uid == mAssistantUid; }
        void setAssistantUid(uid_t uid) { mAssistantUid = uid; };
        void setHotwordDetectionServiceUid(uid_t uid) { mHotwordDetectionServiceUid = uid; }
        bool isAssistantUid(uid_t uid) const {
            // The HotwordDetectionService is part of the Assistant package but runs with a separate
            // (isolated) uid, so we check for either uid here.
            return uid == mAssistantUid || uid == mHotwordDetectionServiceUid;
        }
        void setA11yUids(const std::vector<uid_t>& uids) { mA11yUids.clear(); mA11yUids = uids; }
        bool isA11yUid(uid_t uid);
        bool isA11yOnTop();
@@ -423,6 +430,7 @@ private:
        std::unordered_map<uid_t, std::pair<bool, int>> mOverrideUids;
        std::unordered_map<uid_t, std::pair<bool, int>> mCachedUids;
        uid_t mAssistantUid = -1;
        uid_t mHotwordDetectionServiceUid = -1;
        std::vector<uid_t> mA11yUids;
        uid_t mCurrentImeUid = -1;
        bool mRttEnabled = false;