auto import from //depot/cupcake/@135843
diff --git a/services/java/com/android/server/am/ServiceRecord.java b/services/java/com/android/server/am/ServiceRecord.java
new file mode 100644
index 0000000..4b90600
--- /dev/null
+++ b/services/java/com/android/server/am/ServiceRecord.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2006 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.am;
+
+import com.android.internal.os.BatteryStatsImpl;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ServiceInfo;
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.SystemClock;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * A running application service.
+ */
+class ServiceRecord extends Binder {
+ final BatteryStatsImpl.Uid.Pkg.Serv stats;
+ final ComponentName name; // service component.
+ final String shortName; // name.flattenToShortString().
+ final Intent.FilterComparison intent;
+ // original intent used to find service.
+ final ServiceInfo serviceInfo;
+ // all information about the service.
+ final ApplicationInfo appInfo;
+ // information about service's app.
+ final String packageName; // the package implementing intent's component
+ final String processName; // process where this component wants to run
+ final String permission;// permission needed to access service
+ final String baseDir; // where activity source (resources etc) located
+ final String resDir; // where public activity source (public resources etc) located
+ final String dataDir; // where activity data should go
+ final boolean exported; // from ServiceInfo.exported
+ final Runnable restarter; // used to schedule retries of starting the service
+ final long createTime; // when this service was created
+ final HashMap<Intent.FilterComparison, IntentBindRecord> bindings
+ = new HashMap<Intent.FilterComparison, IntentBindRecord>();
+ // All active bindings to the service.
+ final HashMap<IBinder, ConnectionRecord> connections
+ = new HashMap<IBinder, ConnectionRecord>();
+ // IBinder -> ConnectionRecord of all bound clients
+ final List<Intent> startArgs = new ArrayList<Intent>();
+ // start() arguments that haven't yet been delivered.
+
+ ProcessRecord app; // where this service is running or null.
+ boolean isForeground; // asked to run as a foreground service?
+ long lastActivity; // last time there was some activity on the service.
+ boolean startRequested; // someone explicitly called start?
+ int lastStartId; // identifier of most recent start request.
+ int executeNesting; // number of outstanding operations keeping foreground.
+ long executingStart; // start time of last execute request.
+ int crashCount; // number of times proc has crashed with service running
+ int totalRestartCount; // number of times we have had to restart.
+ int restartCount; // number of restarts performed in a row.
+ long restartDelay; // delay until next restart attempt.
+ long restartTime; // time of last restart.
+ long nextRestartTime; // time when restartDelay will expire.
+
+ void dump(PrintWriter pw, String prefix) {
+ pw.println(prefix + this);
+ pw.println(prefix + "intent=" + intent.getIntent());
+ pw.println(prefix + "packageName=" + packageName);
+ pw.println(prefix + "processName=" + processName);
+ pw.println(prefix + "permission=" + permission);
+ pw.println(prefix + "baseDir=" + baseDir+ " resDir=" + resDir + " dataDir=" + dataDir);
+ pw.println(prefix + "app=" + app);
+ pw.println(prefix + "isForeground=" + isForeground
+ + " lastActivity=" + lastActivity);
+ pw.println(prefix + "startRequested=" + startRequested
+ + " startId=" + lastStartId
+ + " executeNesting=" + executeNesting
+ + " executingStart=" + executingStart
+ + " crashCount=" + crashCount);
+ pw.println(prefix + "totalRestartCount=" + totalRestartCount
+ + " restartCount=" + restartCount
+ + " restartDelay=" + restartDelay
+ + " restartTime=" + restartTime
+ + " nextRestartTime=" + nextRestartTime);
+ if (bindings.size() > 0) {
+ pw.println(prefix + "Bindings:");
+ Iterator<IntentBindRecord> it = bindings.values().iterator();
+ while (it.hasNext()) {
+ IntentBindRecord b = it.next();
+ pw.println(prefix + "Binding " + b);
+ b.dump(pw, prefix + " ");
+ }
+ }
+ if (connections.size() > 0) {
+ pw.println(prefix + "All Connections:");
+ Iterator<ConnectionRecord> it = connections.values().iterator();
+ while (it.hasNext()) {
+ ConnectionRecord c = it.next();
+ pw.println(prefix + " " + c);
+ }
+ }
+ }
+
+ ServiceRecord(BatteryStatsImpl.Uid.Pkg.Serv servStats, ComponentName name,
+ Intent.FilterComparison intent, ServiceInfo sInfo, Runnable restarter) {
+ this.stats = servStats;
+ this.name = name;
+ shortName = name.flattenToShortString();
+ this.intent = intent;
+ serviceInfo = sInfo;
+ appInfo = sInfo.applicationInfo;
+ packageName = sInfo.applicationInfo.packageName;
+ processName = sInfo.processName;
+ permission = sInfo.permission;
+ baseDir = sInfo.applicationInfo.sourceDir;
+ resDir = sInfo.applicationInfo.publicSourceDir;
+ dataDir = sInfo.applicationInfo.dataDir;
+ exported = sInfo.exported;
+ this.restarter = restarter;
+ createTime = lastActivity = SystemClock.uptimeMillis();
+ }
+
+ public AppBindRecord retrieveAppBindingLocked(Intent intent,
+ ProcessRecord app) {
+ Intent.FilterComparison filter = new Intent.FilterComparison(intent);
+ IntentBindRecord i = bindings.get(filter);
+ if (i == null) {
+ i = new IntentBindRecord(this, filter);
+ bindings.put(filter, i);
+ }
+ AppBindRecord a = i.apps.get(app);
+ if (a != null) {
+ return a;
+ }
+ a = new AppBindRecord(this, i, app);
+ i.apps.put(app, a);
+ return a;
+ }
+
+ public void resetRestartCounter() {
+ restartCount = 0;
+ restartDelay = 0;
+ restartTime = 0;
+ }
+
+ public String toString() {
+ return "ServiceRecord{"
+ + Integer.toHexString(System.identityHashCode(this))
+ + " " + shortName + "}";
+ }
+}