Eliminate dependencies on Checkin, replacing checkin events with EventLog
events (and in one case, a DropBox entry).

Add a simple intent that triggers master-clear (and toggle EFS), given the
right permissions.

Bug: 2264596
Bug: 2350452
Bug: 2264596
diff --git a/services/java/com/android/server/BatteryService.java b/services/java/com/android/server/BatteryService.java
index f435ebc..dc41ff9 100644
--- a/services/java/com/android/server/BatteryService.java
+++ b/services/java/com/android/server/BatteryService.java
@@ -27,11 +27,11 @@
 import android.os.BatteryManager;
 import android.os.Binder;
 import android.os.IBinder;
+import android.os.DropBoxManager;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.os.UEventObserver;
-import android.provider.Checkin;
 import android.provider.Settings;
 import android.util.EventLog;
 import android.util.Log;
@@ -363,50 +363,39 @@
     }
 
     private final void logBatteryStats() {
-
         IBinder batteryInfoService = ServiceManager.getService(BATTERY_STATS_SERVICE_NAME);
-        if (batteryInfoService != null) {
-            byte[] buffer = new byte[DUMP_MAX_LENGTH];
-            File dumpFile = null;
-            FileOutputStream dumpStream = null;
-            try {
-                // dump the service to a file
-                dumpFile = new File(DUMPSYS_DATA_PATH + BATTERY_STATS_SERVICE_NAME + ".dump");
-                dumpStream = new FileOutputStream(dumpFile);
-                batteryInfoService.dump(dumpStream.getFD(), DUMPSYS_ARGS);
-                dumpStream.getFD().sync();
+        if (batteryInfoService == null) return;
 
-                // read dumped file above into buffer truncated to DUMP_MAX_LENGTH
-                // and insert into events table.
-                int length = (int) Math.min(dumpFile.length(), DUMP_MAX_LENGTH);
-                FileInputStream fileInputStream = new FileInputStream(dumpFile);
-                int nread = fileInputStream.read(buffer, 0, length);
-                if (nread > 0) {
-                    Checkin.logEvent(mContext.getContentResolver(),
-                            Checkin.Events.Tag.BATTERY_DISCHARGE_INFO,
-                            new String(buffer, 0, nread));
-                    if (LOCAL_LOGV) Log.v(TAG, "dumped " + nread + "b from " +
-                            batteryInfoService + "to log");
-                    if (LOCAL_LOGV) Log.v(TAG, "actual dump:" + new String(buffer, 0, nread));
+        DropBoxManager db = (DropBoxManager) mContext.getSystemService(Context.DROPBOX_SERVICE);
+        if (db == null || !db.isTagEnabled("BATTERY_DISCHARGE_INFO")) return;
+
+        File dumpFile = null;
+        FileOutputStream dumpStream = null;
+        try {
+            // dump the service to a file
+            dumpFile = new File(DUMPSYS_DATA_PATH + BATTERY_STATS_SERVICE_NAME + ".dump");
+            dumpStream = new FileOutputStream(dumpFile);
+            batteryInfoService.dump(dumpStream.getFD(), DUMPSYS_ARGS);
+            dumpStream.getFD().sync();
+
+            // add dump file to drop box
+            db.addFile("BATTERY_DISCHARGE_INFO", dumpFile, DropBoxManager.IS_TEXT);
+        } catch (RemoteException e) {
+            Log.e(TAG, "failed to dump battery service", e);
+        } catch (IOException e) {
+            Log.e(TAG, "failed to write dumpsys file", e);
+        } finally {
+            // make sure we clean up
+            if (dumpStream != null) {
+                try {
+                    dumpStream.close();
+                } catch (IOException e) {
+                    Log.e(TAG, "failed to close dumpsys output stream");
                 }
-            } catch (RemoteException e) {
-                Log.e(TAG, "failed to dump service '" + BATTERY_STATS_SERVICE_NAME +
-                        "':" + e);
-            } catch (IOException e) {
-                Log.e(TAG, "failed to write dumpsys file: " +  e);
-            } finally {
-                // make sure we clean up
-                if (dumpStream != null) {
-                    try {
-                        dumpStream.close();
-                    } catch (IOException e) {
-                        Log.e(TAG, "failed to close dumpsys output stream");
-                    }
-                }
-                if (dumpFile != null && !dumpFile.delete()) {
-                    Log.e(TAG, "failed to delete temporary dumpsys file: "
-                            + dumpFile.getAbsolutePath());
-                }
+            }
+            if (dumpFile != null && !dumpFile.delete()) {
+                Log.e(TAG, "failed to delete temporary dumpsys file: "
+                        + dumpFile.getAbsolutePath());
             }
         }
     }
diff --git a/services/java/com/android/server/FallbackCheckinService.java b/services/java/com/android/server/FallbackCheckinService.java
index fc0ab69..195eb63 100644
--- a/services/java/com/android/server/FallbackCheckinService.java
+++ b/services/java/com/android/server/FallbackCheckinService.java
@@ -39,40 +39,6 @@
         mContext = context;
     }
 
-    public void masterClear() {
-        if (mContext.checkCallingOrSelfPermission("android.permission.MASTER_CLEAR") !=
-                PackageManager.PERMISSION_GRANTED) {
-            Log.e(TAG, "Permission Denial: can't invoke masterClear from "
-                    + "pid=" + Binder.getCallingPid() + ", "
-                    + "uid=" + Binder.getCallingUid());
-            return;
-        }
-
-        // Save the android ID so the new system can get it erased.
-        try {
-            RecoverySystem.rebootWipeUserData(mContext);
-        } catch (IOException e) {
-            Log.e(TAG, "Reboot for masterClear() failed", e);
-        }
-    }
-
-    public void masterClearAndToggleEFS(boolean efsEnabled) {
-        if (mContext.checkCallingOrSelfPermission("android.permission.MASTER_CLEAR") !=
-			PackageManager.PERMISSION_GRANTED) {
-            Log.e(TAG, "Permission Denial: can't invoke masterClearAndToggleEFS from "
-				  + "pid=" + Binder.getCallingPid() + ", "
-				  + "uid=" + Binder.getCallingUid());
-            return;
-        }
-
-        // Save the android ID so the new system can get it erased.
-        try {
-            RecoverySystem.rebootToggleEFS(mContext, efsEnabled);
-        } catch (IOException e) {
-            Log.e(TAG, "Reboot for toggle EFS failed", e);
-        }
-    }
-
     public void getParentalControlState(IParentalControlCallback p, String requestingApp)
             throws android.os.RemoteException {
         ParentalControlState state = new ParentalControlState();
diff --git a/services/java/com/android/server/MasterClearReceiver.java b/services/java/com/android/server/MasterClearReceiver.java
index 3c366da..ab0eb81 100644
--- a/services/java/com/android/server/MasterClearReceiver.java
+++ b/services/java/com/android/server/MasterClearReceiver.java
@@ -16,16 +16,15 @@
 
 package com.android.server;
 
+import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
-import android.content.BroadcastReceiver;
-import android.os.RemoteException;
-import android.os.ICheckinService;
-import android.os.ServiceManager;
+import android.os.RecoverySystem;
 import android.util.Log;
 
-public class MasterClearReceiver extends BroadcastReceiver {
+import java.io.IOException;
 
+public class MasterClearReceiver extends BroadcastReceiver {
     private static final String TAG = "MasterClear";
 
     @Override
@@ -36,18 +35,17 @@
                 return;
             }
         }
-        Log.w(TAG, "!!! FACTORY RESETTING DEVICE !!!");
-        ICheckinService service =
-            ICheckinService.Stub.asInterface(
-                ServiceManager.getService("checkin"));
-        if (service != null) {
-            try {
-                // This RPC should never return.
-                service.masterClear();
-            } catch (RemoteException e) {
-                Log.w("MasterClear",
-                      "Unable to invoke ICheckinService.masterClear()");
+
+        try {
+            Log.w(TAG, "!!! FACTORY RESET !!!");
+            if (intent.hasExtra("enableEFS")) {
+                RecoverySystem.rebootToggleEFS(context, intent.getBooleanExtra("enableEFS", false));
+            } else {
+                RecoverySystem.rebootWipeUserData(context);
             }
+            Log.wtf(TAG, "Still running after master clear?!");
+        } catch (IOException e) {
+            Log.e(TAG, "Can't perform master clear/factory reset", e);
         }
     }
 }
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 87ed252..d0f6a7c 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -92,7 +92,6 @@
 import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.os.SystemProperties;
-import android.provider.Checkin;
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Config;
@@ -966,7 +965,6 @@
     static final int IM_FEELING_LUCKY_MSG = 15;
     static final int LAUNCH_TIMEOUT_MSG = 16;
     static final int DESTROY_TIMEOUT_MSG = 17;
-    static final int SERVICE_ERROR_MSG = 18;
     static final int RESUME_TOP_ACTIVITY_MSG = 19;
     static final int PROC_START_TIMEOUT_MSG = 20;
     static final int DO_PENDING_ACTIVITY_LAUNCHES_MSG = 21;
@@ -1161,13 +1159,6 @@
                     }
                 }
             } break;
-            case SERVICE_ERROR_MSG: {
-                ServiceRecord srv = (ServiceRecord)msg.obj;
-                // This needs to be *un*synchronized to avoid deadlock.
-                Checkin.logEvent(mContext.getContentResolver(),
-                        Checkin.Events.Tag.SYSTEM_SERVICE_LOOPING,
-                        srv.name.toShortString());
-            } break;
             case RESUME_TOP_ACTIVITY_MSG: {
                 synchronized (ActivityManagerService.this) {
                     resumeTopActivityLocked(null);
@@ -10767,11 +10758,6 @@
         EventLog.writeEvent(EventLogTags.AM_SCHEDULE_SERVICE_RESTART,
                 r.shortName, r.restartDelay);
 
-        Message msg = Message.obtain();
-        msg.what = SERVICE_ERROR_MSG;
-        msg.obj = r;
-        mHandler.sendMessage(msg);
-        
         return canceled;
     }