Add instant cookie APIs

This change adds APIs for instant apps to store cookie data
that is presisted across instant installs and across the
upgrade from an instant to a standard app. Standard apps
can use the cookie APIs but when they are uninstalled the
cookie is also deleted. The cookies are kept longer than
the instant apps as they are much smaller - 16KB by default.
We can change the cookie size via a system setting i.e.
after we ship we can increase size if needed.

We also add internal APIs to surface information about
installed and uninstalled instant apps which should be
used for showing them in the UI. For this puporse we store
the icon, permissions, and label of uninstalled apps. If
the app is re-installed we drop this meta-data but keep
the cookie around. If we have cookie data stored and the
signing cert of the app changes when it gets re-intalled
we wipe the cookie.

Test: CTS tests pass; hiddent APIs tested manually

Change-Id: If145c0440cc61a5303e2cbb70228d235d36037a5
diff --git a/services/core/java/com/android/server/PruneInstantAppsJobService.java b/services/core/java/com/android/server/PruneInstantAppsJobService.java
new file mode 100644
index 0000000..a6c3685
--- /dev/null
+++ b/services/core/java/com/android/server/PruneInstantAppsJobService.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server;
+
+import android.app.job.JobInfo;
+import android.app.job.JobParameters;
+import android.app.job.JobScheduler;
+import android.app.job.JobService;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManagerInternal;
+
+import java.util.concurrent.TimeUnit;
+
+public class PruneInstantAppsJobService extends JobService {
+    private static final boolean DEBUG = false;
+
+    private static final int JOB_ID = 765123;
+
+    private static final long PRUNE_INSTANT_APPS_PERIOD_MILLIS = DEBUG
+            ? TimeUnit.MINUTES.toMillis(1) : TimeUnit.DAYS.toMillis(1);
+
+    public static void schedule(Context context) {
+        JobInfo pruneJob = new JobInfo.Builder(JOB_ID, new ComponentName(
+                context.getPackageName(), PruneInstantAppsJobService.class.getName()))
+                .setRequiresDeviceIdle(true)
+                .setPeriodic(PRUNE_INSTANT_APPS_PERIOD_MILLIS)
+                .build();
+
+        JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
+        jobScheduler.schedule(pruneJob);
+    }
+
+    @Override
+    public boolean onStartJob(JobParameters params) {
+        PackageManagerInternal packageManagerInternal = LocalServices.getService(
+                PackageManagerInternal.class);
+        packageManagerInternal.pruneInstantApps();
+        jobFinished(params, false);
+        return true;
+    }
+
+    @Override
+    public boolean onStopJob(JobParameters params) {
+        return false;
+    }
+}
\ No newline at end of file