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

Commit c0a8f05d authored by Venkatarama Avadhani's avatar Venkatarama Avadhani
Browse files

MediaCas: Reinit the HIDL CAS service if killed

When the HIDL MediaCasService is killed or dies, allow for it to be
re-initialized with the new instance of the service.

Test: atest android.media.misc.cts.MediaCasTestMediaCas:
Bug: 314885711
Change-Id: I0ebeca9f433f3d8ee2b140ee0d2de9dc06ace021
parent ee38ec4e
Loading
Loading
Loading
Loading
+59 −35
Original line number Diff line number Diff line
@@ -44,7 +44,6 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceSpecificException;
import android.util.Log;
import android.util.Singleton;

import com.android.internal.util.FrameworkStatsLog;

@@ -301,17 +300,38 @@ public final class MediaCas implements AutoCloseable {
        }
    }

    private static final Singleton<android.hardware.cas.V1_0.IMediaCasService> sServiceHidl =
            new Singleton<android.hardware.cas.V1_0.IMediaCasService>() {
    private static android.hardware.cas.V1_0.IMediaCasService sServiceHidl = null;
    private static Object sHidlLock = new Object();

    /** Used to indicate the right end-point to handle the serviceDied method */
    private static final long MEDIA_CAS_HIDL_COOKIE = 394;

    /** DeathListener for HIDL service */
    private static IHwBinder.DeathRecipient sDeathListenerHidl =
            new IHwBinder.DeathRecipient() {
                @Override
                protected android.hardware.cas.V1_0.IMediaCasService create() {
                public void serviceDied(long cookie) {
                    if (cookie == MEDIA_CAS_HIDL_COOKIE) {
                        synchronized (sHidlLock) {
                            sServiceHidl = null;
                        }
                    }
                }
            };

    static android.hardware.cas.V1_0.IMediaCasService getServiceHidl() {
        synchronized (sHidlLock) {
            if (sServiceHidl != null) {
                return sServiceHidl;
            } else {
                try {
                    Log.d(TAG, "Trying to get cas@1.2 service");
                    android.hardware.cas.V1_2.IMediaCasService serviceV12 =
                                android.hardware.cas.V1_2.IMediaCasService.getService(
                                        true /*wait*/);
                            android.hardware.cas.V1_2.IMediaCasService.getService(true /*wait*/);
                    if (serviceV12 != null) {
                            return serviceV12;
                        sServiceHidl = serviceV12;
                        sServiceHidl.linkToDeath(sDeathListenerHidl, MEDIA_CAS_HIDL_COOKIE);
                        return sServiceHidl;
                    }
                } catch (Exception eV1_2) {
                    Log.d(TAG, "Failed to get cas@1.2 service");
@@ -320,10 +340,11 @@ public final class MediaCas implements AutoCloseable {
                try {
                    Log.d(TAG, "Trying to get cas@1.1 service");
                    android.hardware.cas.V1_1.IMediaCasService serviceV11 =
                                android.hardware.cas.V1_1.IMediaCasService.getService(
                                        true /*wait*/);
                            android.hardware.cas.V1_1.IMediaCasService.getService(true /*wait*/);
                    if (serviceV11 != null) {
                            return serviceV11;
                        sServiceHidl = serviceV11;
                        sServiceHidl.linkToDeath(sDeathListenerHidl, MEDIA_CAS_HIDL_COOKIE);
                        return sServiceHidl;
                    }
                } catch (Exception eV1_1) {
                    Log.d(TAG, "Failed to get cas@1.1 service");
@@ -331,17 +352,19 @@ public final class MediaCas implements AutoCloseable {

                try {
                    Log.d(TAG, "Trying to get cas@1.0 service");
                        return android.hardware.cas.V1_0.IMediaCasService.getService(true /*wait*/);
                    sServiceHidl =
                            android.hardware.cas.V1_0.IMediaCasService.getService(true /*wait*/);
                    if (sServiceHidl != null) {
                        sServiceHidl.linkToDeath(sDeathListenerHidl, MEDIA_CAS_HIDL_COOKIE);
                    }
                    return sServiceHidl;
                } catch (Exception eV1_0) {
                    Log.d(TAG, "Failed to get cas@1.0 service");
                }

                    return null;
            }
            };

    static android.hardware.cas.V1_0.IMediaCasService getServiceHidl() {
        return sServiceHidl.get();
        }
        // Couldn't find an HIDL service, returning null.
        return null;
    }

    private void validateInternalStates() {
@@ -778,7 +801,7 @@ public final class MediaCas implements AutoCloseable {
            }
        }

        android.hardware.cas.V1_0.IMediaCasService serviceHidl = sServiceHidl.get();
        android.hardware.cas.V1_0.IMediaCasService serviceHidl = getServiceHidl();
        if (serviceHidl != null) {
            try {
                return serviceHidl.isSystemIdSupported(CA_system_id);
@@ -807,10 +830,11 @@ public final class MediaCas implements AutoCloseable {
                }
                return results;
            } catch (RemoteException e) {
                Log.e(TAG, "Some exception while enumerating plugins");
            }
        }

        android.hardware.cas.V1_0.IMediaCasService serviceHidl = sServiceHidl.get();
        android.hardware.cas.V1_0.IMediaCasService serviceHidl = getServiceHidl();
        if (serviceHidl != null) {
            try {
                ArrayList<HidlCasPluginDescriptor> descriptors = serviceHidl.enumeratePlugins();