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

Commit 6fb1a7cd authored by dianlujitao's avatar dianlujitao Committed by Luca Stefani
Browse files

ADBRootService: Deal with binder death

Change-Id: Id5e4a455ea16a4158086816abf093d8f603d4e49
parent 3a53c693
Loading
Loading
Loading
Loading
+39 −6
Original line number Original line Diff line number Diff line
@@ -17,10 +17,11 @@
package android.adb;
package android.adb;


import android.adbroot.IADBRootService;
import android.adbroot.IADBRootService;
import android.annotation.SystemApi;
import android.content.Context;
import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager;
import android.util.Slog;


/**
/**
 * {@hide}
 * {@hide}
@@ -30,18 +31,43 @@ public class ADBRootService {


    private static final String ADB_ROOT_SERVICE = "adbroot_service";
    private static final String ADB_ROOT_SERVICE = "adbroot_service";


    private IADBRootService mADBRootService;
    private IADBRootService mService;
    private Context mContext;
    private Context mContext;


    private final IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
        @Override
        public void binderDied() {
            if (mService != null) {
                mService.asBinder().unlinkToDeath(this, 0);
            }
            mService = null;
        }
    };

    /**
    /**
     * Creates a new instance.
     * Creates a new instance.
     */
     */
    public ADBRootService(Context context) {
    public ADBRootService(Context context) {
        mADBRootService = IADBRootService.Stub.asInterface(
                ServiceManager.getService(ADB_ROOT_SERVICE));
        mContext = context;
        mContext = context;
    }
    }


    private synchronized IADBRootService getService()
            throws RemoteException {
        if (mService != null) {
            return mService;
        }

        final IBinder service = ServiceManager.getService(ADB_ROOT_SERVICE);
        if (service != null) {
            service.linkToDeath(mDeathRecipient, 0);
            mService = IADBRootService.Stub.asInterface(service);
            return mService;
        }

        Slog.e(TAG, "Unable to acquire ADBRootService");
        return null;
    }

    /**
    /**
     * @hide
     * @hide
     */
     */
@@ -49,7 +75,10 @@ public class ADBRootService {
        mContext.enforceCallingOrSelfPermission(
        mContext.enforceCallingOrSelfPermission(
                android.Manifest.permission.ADBROOT, "adbroot");
                android.Manifest.permission.ADBROOT, "adbroot");
        try {
        try {
            mADBRootService.setEnabled(enable);
            final IADBRootService svc = getService();
            if (svc != null) {
                svc.setEnabled(enable);
            }
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
            throw e.rethrowFromSystemServer();
        }
        }
@@ -62,9 +91,13 @@ public class ADBRootService {
        mContext.enforceCallingOrSelfPermission(
        mContext.enforceCallingOrSelfPermission(
                android.Manifest.permission.ADBROOT, "adbroot");
                android.Manifest.permission.ADBROOT, "adbroot");
        try {
        try {
            return mADBRootService.getEnabled();
            final IADBRootService svc = getService();
            if (svc != null) {
                return svc.getEnabled();
            }
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
            throw e.rethrowFromSystemServer();
        }
        }
        return false;
    }
    }
}
}