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

Commit 35be291d authored by Jeffrey Huang's avatar Jeffrey Huang Committed by Automerger Merge Worker
Browse files

Merge "Put two way binder calls on new thread" into rvc-dev am: 32d9a6bb am: 82d882b4

Change-Id: Iba4663a6e5a391e1a75997c1f06fb875a98fe22c
parents 2a362aba 82d882b4
Loading
Loading
Loading
Loading
+92 −23
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import android.os.IStatsCompanionService;
import android.os.IStatsd;
import android.os.Looper;
import android.os.ParcelFileDescriptor;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.StatsFrameworkInitializer;
import android.os.SystemClock;
@@ -99,9 +100,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
    private static IStatsd sStatsd;
    private static final Object sStatsdLock = new Object();

    private final OnAlarmListener mAnomalyAlarmListener = new AnomalyAlarmListener();
    private final OnAlarmListener mPullingAlarmListener = new PullingAlarmListener();
    private final OnAlarmListener mPeriodicAlarmListener = new PeriodicAlarmListener();
    private final OnAlarmListener mAnomalyAlarmListener;
    private final OnAlarmListener mPullingAlarmListener;
    private final OnAlarmListener mPeriodicAlarmListener;

    private StatsManagerService mStatsManagerService;

@@ -120,6 +121,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
        handlerThread.start();
        mHandler = new CompanionHandler(handlerThread.getLooper());

        mAnomalyAlarmListener = new AnomalyAlarmListener(context);
        mPullingAlarmListener = new PullingAlarmListener(context);
        mPeriodicAlarmListener = new PeriodicAlarmListener(context);
    }

    private final static int[] toIntArray(List<Integer> list) {
@@ -232,6 +236,31 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
        });
    }

    private static class WakelockThread extends Thread {
        private final PowerManager.WakeLock mWl;
        private final Runnable mRunnable;

        WakelockThread(Context context, String wakelockName, Runnable runnable) {
            PowerManager powerManager = (PowerManager)
                    context.getSystemService(Context.POWER_SERVICE);
            mWl = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, wakelockName);
            mRunnable = runnable;
        }
        @Override
        public void run() {
            try {
                mRunnable.run();
            } finally {
                mWl.release();
            }
        }
        @Override
        public void start() {
            mWl.acquire();
            super.start();
        }
    }

    private final static class AppUpdateReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
@@ -307,6 +336,12 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
    }

    public static final class AnomalyAlarmListener implements OnAlarmListener {
        private final Context mContext;

        AnomalyAlarmListener(Context context) {
            mContext = context;
        }

        @Override
        public void onAlarm() {
            if (DEBUG) {
@@ -318,17 +353,30 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
                Log.w(TAG, "Could not access statsd to inform it of anomaly alarm firing");
                return;
            }

            // Wakelock needs to be retained while calling statsd.
            Thread thread = new WakelockThread(mContext,
                    AnomalyAlarmListener.class.getCanonicalName(), new Runnable() {
                        @Override
                        public void run() {
                            try {
                // Two-way call to statsd to retain AlarmManager wakelock
                                statsd.informAnomalyAlarmFired();
                            } catch (RemoteException e) {
                                Log.w(TAG, "Failed to inform statsd of anomaly alarm firing", e);
                            }
            // AlarmManager releases its own wakelock here.
                        }
                    });
            thread.start();
        }
    }

    public final static class PullingAlarmListener implements OnAlarmListener {
        private final Context mContext;

        PullingAlarmListener(Context context) {
            mContext = context;
        }

        @Override
        public void onAlarm() {
            if (DEBUG) {
@@ -339,16 +387,30 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
                Log.w(TAG, "Could not access statsd to inform it of pulling alarm firing.");
                return;
            }

            // Wakelock needs to be retained while calling statsd.
            Thread thread = new WakelockThread(mContext,
                    PullingAlarmListener.class.getCanonicalName(), new Runnable() {
                        @Override
                        public void run() {
                            try {
                // Two-way call to statsd to retain AlarmManager wakelock
                                statsd.informPollAlarmFired();
                            } catch (RemoteException e) {
                                Log.w(TAG, "Failed to inform statsd of pulling alarm firing.", e);
                            }
                        }
                    });
            thread.start();
        }
    }

    public final static class PeriodicAlarmListener implements OnAlarmListener {
        private final Context mContext;

        PeriodicAlarmListener(Context context) {
            mContext = context;
        }

        @Override
        public void onAlarm() {
            if (DEBUG) {
@@ -359,13 +421,20 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
                Log.w(TAG, "Could not access statsd to inform it of periodic alarm firing.");
                return;
            }

            // Wakelock needs to be retained while calling statsd.
            Thread thread = new WakelockThread(mContext,
                    PeriodicAlarmListener.class.getCanonicalName(), new Runnable() {
                        @Override
                        public void run() {
                            try {
                // Two-way call to statsd to retain AlarmManager wakelock
                                statsd.informAlarmForSubscriberTriggeringFired();
                            } catch (RemoteException e) {
                                Log.w(TAG, "Failed to inform statsd of periodic alarm firing.", e);
                            }
            // AlarmManager releases its own wakelock here.
                        }
                    });
            thread.start();
        }
    }