summaryrefslogtreecommitdiffstats
path: root/core/java/android/os
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-03-03 18:28:45 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-03 18:28:45 -0800
commitd83a98f4ce9cfa908f5c54bbd70f03eec07e7553 (patch)
tree4b825dc642cb6eb9a060e54bf8d69288fbee4904 /core/java/android/os
parent076357b8567458d4b6dfdcf839ef751634cd2bfb (diff)
downloadframeworks_base-d83a98f4ce9cfa908f5c54bbd70f03eec07e7553.zip
frameworks_base-d83a98f4ce9cfa908f5c54bbd70f03eec07e7553.tar.gz
frameworks_base-d83a98f4ce9cfa908f5c54bbd70f03eec07e7553.tar.bz2
auto import from //depot/cupcake/@135843
Diffstat (limited to 'core/java/android/os')
-rw-r--r--core/java/android/os/AsyncResult.java68
-rw-r--r--core/java/android/os/AsyncTask.java454
-rw-r--r--core/java/android/os/BadParcelableException.java31
-rw-r--r--core/java/android/os/Base64Utils.java31
-rw-r--r--core/java/android/os/BatteryManager.java46
-rw-r--r--core/java/android/os/BatteryStats.java795
-rw-r--r--core/java/android/os/Binder.java355
-rw-r--r--core/java/android/os/Broadcaster.java212
-rw-r--r--core/java/android/os/Build.java92
-rw-r--r--core/java/android/os/Bundle.aidl20
-rw-r--r--core/java/android/os/Bundle.java1452
-rw-r--r--core/java/android/os/ConditionVariable.java141
-rw-r--r--core/java/android/os/CountDownTimer.java138
-rw-r--r--core/java/android/os/DeadObjectException.java28
-rw-r--r--core/java/android/os/Debug.java717
-rw-r--r--core/java/android/os/Environment.java131
-rw-r--r--core/java/android/os/Exec.java63
-rw-r--r--core/java/android/os/FileObserver.java146
-rw-r--r--core/java/android/os/FileUtils.java197
-rw-r--r--core/java/android/os/Handler.java594
-rw-r--r--core/java/android/os/HandlerState.java33
-rw-r--r--core/java/android/os/HandlerStateMachine.java290
-rw-r--r--core/java/android/os/HandlerThread.java93
-rw-r--r--core/java/android/os/Hardware.java42
-rw-r--r--core/java/android/os/IBinder.java223
-rw-r--r--core/java/android/os/ICheckinService.aidl53
-rwxr-xr-xcore/java/android/os/IHardwareService.aidl40
-rw-r--r--core/java/android/os/IInterface.java31
-rw-r--r--core/java/android/os/IMessenger.aidl25
-rw-r--r--core/java/android/os/IMountService.aidl66
-rw-r--r--core/java/android/os/INetStatService.aidl35
-rw-r--r--core/java/android/os/IParentalControlCallback.aidl27
-rw-r--r--core/java/android/os/IPermissionController.aidl23
-rw-r--r--core/java/android/os/IPowerManager.aidl33
-rw-r--r--core/java/android/os/IServiceManager.java70
-rw-r--r--core/java/android/os/LocalPowerManager.java42
-rw-r--r--core/java/android/os/Looper.java226
-rw-r--r--core/java/android/os/MailboxNotAvailableException.java37
-rw-r--r--core/java/android/os/MemoryFile.java258
-rw-r--r--core/java/android/os/Message.aidl20
-rw-r--r--core/java/android/os/Message.java405
-rw-r--r--core/java/android/os/MessageQueue.java329
-rw-r--r--core/java/android/os/Messenger.aidl20
-rw-r--r--core/java/android/os/Messenger.java141
-rw-r--r--core/java/android/os/NetStat.java212
-rw-r--r--core/java/android/os/Parcel.java2051
-rw-r--r--core/java/android/os/ParcelFileDescriptor.aidl20
-rw-r--r--core/java/android/os/ParcelFileDescriptor.java250
-rw-r--r--core/java/android/os/ParcelFormatException.java31
-rw-r--r--core/java/android/os/Parcelable.java112
-rw-r--r--core/java/android/os/PatternMatcher.aidl19
-rw-r--r--core/java/android/os/PatternMatcher.java197
-rw-r--r--core/java/android/os/Power.java130
-rw-r--r--core/java/android/os/PowerManager.java392
-rw-r--r--core/java/android/os/Process.java706
-rw-r--r--core/java/android/os/Registrant.java124
-rw-r--r--core/java/android/os/RegistrantList.java128
-rw-r--r--core/java/android/os/RemoteCallbackList.java259
-rw-r--r--core/java/android/os/RemoteException.java27
-rw-r--r--core/java/android/os/RemoteMailException.java31
-rw-r--r--core/java/android/os/ServiceManager.java122
-rw-r--r--core/java/android/os/ServiceManagerNative.java174
-rw-r--r--core/java/android/os/StatFs.java74
-rw-r--r--core/java/android/os/SystemClock.java154
-rw-r--r--core/java/android/os/SystemProperties.java143
-rw-r--r--core/java/android/os/SystemService.java31
-rwxr-xr-xcore/java/android/os/TokenWatcher.java197
-rw-r--r--core/java/android/os/UEventObserver.java191
-rw-r--r--core/java/android/os/Vibrator.java86
-rw-r--r--core/java/android/os/package.html6
70 files changed, 0 insertions, 14140 deletions
diff --git a/core/java/android/os/AsyncResult.java b/core/java/android/os/AsyncResult.java
deleted file mode 100644
index 5bad09d..0000000
--- a/core/java/android/os/AsyncResult.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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 android.os;
-
-import android.os.Message;
-
-/** @hide */
-public class AsyncResult
-{
-
- /*************************** Instance Variables **************************/
-
- // Expect either exception or result to be null
- public Object userObj;
- public Throwable exception;
- public Object result;
-
- /***************************** Class Methods *****************************/
-
- /** Saves and sets m.obj */
- public static AsyncResult
- forMessage(Message m, Object r, Throwable ex)
- {
- AsyncResult ret;
-
- ret = new AsyncResult (m.obj, r, ex);
-
- m.obj = ret;
-
- return ret;
- }
-
- /** Saves and sets m.obj */
- public static AsyncResult
- forMessage(Message m)
- {
- AsyncResult ret;
-
- ret = new AsyncResult (m.obj, null, null);
-
- m.obj = ret;
-
- return ret;
- }
-
- /** please note, this sets m.obj to be this */
- public
- AsyncResult (Object uo, Object r, Throwable ex)
- {
- userObj = uo;
- result = r;
- exception = ex;
- }
-}
diff --git a/core/java/android/os/AsyncTask.java b/core/java/android/os/AsyncTask.java
deleted file mode 100644
index ee4e897..0000000
--- a/core/java/android/os/AsyncTask.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/*
- * Copyright (C) 2008 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 android.os;
-
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.Callable;
-import java.util.concurrent.FutureTask;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * <p>AsyncTask enables proper and easy use of the UI thread. This class allows to
- * perform background operations and publish results on the UI thread without
- * having to manipulate threads and/or handlers.</p>
- *
- * <p>An asynchronous task is defined by a computation that runs on a background thread and
- * whose result is published on the UI thread. An asynchronous task is defined by 3 generic
- * types, called <code>Params</code>, <code>Progress</code> and <code>Result</code>,
- * and 4 steps, called <code>begin</code>, <code>doInBackground</code>,
- * <code>processProgress<code> and <code>end</code>.</p>
- *
- * <h2>Usage</h2>
- * <p>AsyncTask must be subclassed to be used. The subclass will override at least
- * one method ({@link #doInBackground}), and most often will override a
- * second one ({@link #onPostExecute}.)</p>
- *
- * <p>Here is an example of subclassing:</p>
- * <pre class="prettyprint">
- * private class DownloadFilesTask extends AsyncTask&lt;URL, Integer, Long&gt; {
- * protected Long doInBackground(URL... urls) {
- * int count = urls.length;
- * long totalSize = 0;
- * for (int i = 0; i < count; i++) {
- * totalSize += Downloader.downloadFile(urls[i]);
- * publishProgress((int) ((i / (float) count) * 100));
- * }
- * return totalSize;
- * }
- *
- * protected void onProgressUpdate(Integer... progress) {
- * setProgressPercent(progress[0]);
- * }
- *
- * protected void onPostExecute(Long result) {
- * showDialog("Downloaded " + result + " bytes");
- * }
- * }
- * </pre>
- *
- * <p>Once created, a task is executed very simply:</p>
- * <pre class="prettyprint">
- * new DownloadFilesTask().execute(url1, url2, url3);
- * </pre>
- *
- * <h2>AsyncTask's generic types</h2>
- * <p>The three types used by an asynchronous task are the following:</p>
- * <ol>
- * <li><code>Params</code>, the type of the parameters sent to the task upon
- * execution.</li>
- * <li><code>Progress</code>, the type of the progress units published during
- * the background computation.</li>
- * <li><code>Result</code>, the type of the result of the background
- * computation.</li>
- * </ol>
- * <p>Not all types are always used by am asynchronous task. To mark a type as unused,
- * simply use the type {@link Void}:</p>
- * <pre>
- * private class MyTask extends AsyncTask<Void, Void, Void) { ... }
- * </pre>
- *
- * <h2>The 4 steps</h2>
- * <p>When an asynchronous task is executed, the task goes through 4 steps:</p>
- * <ol>
- * <li>{@link #onPreExecute()}, invoked on the UI thread immediately after the task
- * is executed. This step is normally used to setup the task, for instance by
- * showing a progress bar in the user interface.</li>
- * <li>{@link #doInBackground}, invoked on the background thread
- * immediately after {@link #onPreExecute()} finishes executing. This step is used
- * to perform background computation that can take a long time. The parameters
- * of the asynchronous task are passed to this step. The result of the computation must
- * be returned by this step and will be passed back to the last step. This step
- * can also use {@link #publishProgress} to publish one or more units
- * of progress. These values are published on the UI thread, in the
- * {@link #onProgressUpdate} step.</li>
- * <li>{@link #onProgressUpdate}, invoked on the UI thread after a
- * call to {@link #publishProgress}. The timing of the execution is
- * undefined. This method is used to display any form of progress in the user
- * interface while the background computation is still executing. For instance,
- * it can be used to animate a progress bar or show logs in a text field.</li>
- * <li>{@link #onPostExecute}, invoked on the UI thread after the background
- * computation finishes. The result of the background computation is passed to
- * this step as a parameter.</li>
- * </ol>
- *
- * <h2>Threading rules</h2>
- * <p>There are a few threading rules that must be followed for this class to
- * work properly:</p>
- * <ul>
- * <li>The task instance must be created on the UI thread.</li>
- * <li>{@link #execute} must be invoked on the UI thread.</li>
- * <li>Do not call {@link #onPreExecute()}, {@link #onPostExecute},
- * {@link #doInBackground}, {@link #onProgressUpdate} manually.</li>
- * <li>The task can be executed only once (an exception will be thrown if
- * a second execution is attempted.)</li>
- * </ul>
- */
-public abstract class AsyncTask<Params, Progress, Result> {
- private static final String LOG_TAG = "AsyncTask";
-
- private static final int CORE_POOL_SIZE = 1;
- private static final int MAXIMUM_POOL_SIZE = 10;
- private static final int KEEP_ALIVE = 10;
-
- private static final BlockingQueue<Runnable> sWorkQueue =
- new LinkedBlockingQueue<Runnable>(MAXIMUM_POOL_SIZE);
-
- private static final ThreadFactory sThreadFactory = new ThreadFactory() {
- private final AtomicInteger mCount = new AtomicInteger(1);
-
- public Thread newThread(Runnable r) {
- return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
- }
- };
-
- private static final ThreadPoolExecutor sExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE,
- MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory);
-
- private static final int MESSAGE_POST_RESULT = 0x1;
- private static final int MESSAGE_POST_PROGRESS = 0x2;
- private static final int MESSAGE_POST_CANCEL = 0x3;
-
- private static final InternalHandler sHandler = new InternalHandler();
-
- private final WorkerRunnable<Params, Result> mWorker;
- private final FutureTask<Result> mFuture;
-
- private volatile Status mStatus = Status.PENDING;
-
- /**
- * Indicates the current status of the task. Each status will be set only once
- * during the lifetime of a task.
- */
- public enum Status {
- /**
- * Indicates that the task has not been executed yet.
- */
- PENDING,
- /**
- * Indicates that the task is running.
- */
- RUNNING,
- /**
- * Indicates that {@link AsyncTask#onPostExecute} has finished.
- */
- FINISHED,
- }
-
- /**
- * Creates a new asynchronous task. This constructor must be invoked on the UI thread.
- */
- public AsyncTask() {
- mWorker = new WorkerRunnable<Params, Result>() {
- public Result call() throws Exception {
- Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
- return doInBackground(mParams);
- }
- };
-
- mFuture = new FutureTask<Result>(mWorker) {
- @Override
- protected void done() {
- Message message;
- Result result = null;
-
- try {
- result = get();
- } catch (InterruptedException e) {
- android.util.Log.w(LOG_TAG, e);
- } catch (ExecutionException e) {
- throw new RuntimeException("An error occured while executing doInBackground()",
- e.getCause());
- } catch (CancellationException e) {
- message = sHandler.obtainMessage(MESSAGE_POST_CANCEL,
- new AsyncTaskResult<Result>(AsyncTask.this, (Result[]) null));
- message.sendToTarget();
- return;
- } catch (Throwable t) {
- throw new RuntimeException("An error occured while executing "
- + "doInBackground()", t);
- }
-
- message = sHandler.obtainMessage(MESSAGE_POST_RESULT,
- new AsyncTaskResult<Result>(AsyncTask.this, result));
- message.sendToTarget();
- }
- };
- }
-
- /**
- * Returns the current status of this task.
- *
- * @return The current status.
- */
- public final Status getStatus() {
- return mStatus;
- }
-
- /**
- * Override this method to perform a computation on a background thread. The
- * specified parameters are the parameters passed to {@link #execute}
- * by the caller of this task.
- *
- * This method can call {@link #publishProgress} to publish updates
- * on the UI thread.
- *
- * @param params The parameters of the task.
- *
- * @return A result, defined by the subclass of this task.
- *
- * @see #onPreExecute()
- * @see #onPostExecute
- * @see #publishProgress
- */
- protected abstract Result doInBackground(Params... params);
-
- /**
- * Runs on the UI thread before {@link #doInBackground}.
- *
- * @see #onPostExecute
- * @see #doInBackground
- */
- protected void onPreExecute() {
- }
-
- /**
- * Runs on the UI thread after {@link #doInBackground}. The
- * specified result is the value returned by {@link #doInBackground}
- * or null if the task was cancelled or an exception occured.
- *
- * @param result The result of the operation computed by {@link #doInBackground}.
- *
- * @see #onPreExecute
- * @see #doInBackground
- */
- @SuppressWarnings({"UnusedDeclaration"})
- protected void onPostExecute(Result result) {
- }
-
- /**
- * Runs on the UI thread after {@link #publishProgress} is invoked.
- * The specified values are the values passed to {@link #publishProgress}.
- *
- * @param values The values indicating progress.
- *
- * @see #publishProgress
- * @see #doInBackground
- */
- @SuppressWarnings({"UnusedDeclaration"})
- protected void onProgressUpdate(Progress... values) {
- }
-
- /**
- * Runs on the UI thread after {@link #cancel(boolean)} is invoked.
- *
- * @see #cancel(boolean)
- * @see #isCancelled()
- */
- protected void onCancelled() {
- }
-
- /**
- * Returns <tt>true</tt> if this task was cancelled before it completed
- * normally.
- *
- * @return <tt>true</tt> if task was cancelled before it completed
- *
- * @see #cancel(boolean)
- */
- public final boolean isCancelled() {
- return mFuture.isCancelled();
- }
-
- /**
- * Attempts to cancel execution of this task. This attempt will
- * fail if the task has already completed, already been cancelled,
- * or could not be cancelled for some other reason. If successful,
- * and this task has not started when <tt>cancel</tt> is called,
- * this task should never run. If the task has already started,
- * then the <tt>mayInterruptIfRunning</tt> parameter determines
- * whether the thread executing this task should be interrupted in
- * an attempt to stop the task.
- *
- * @param mayInterruptIfRunning <tt>true</tt> if the thread executing this
- * task should be interrupted; otherwise, in-progress tasks are allowed
- * to complete.
- *
- * @return <tt>false</tt> if the task could not be cancelled,
- * typically because it has already completed normally;
- * <tt>true</tt> otherwise
- *
- * @see #isCancelled()
- * @see #onCancelled()
- */
- public final boolean cancel(boolean mayInterruptIfRunning) {
- return mFuture.cancel(mayInterruptIfRunning);
- }
-
- /**
- * Waits if necessary for the computation to complete, and then
- * retrieves its result.
- *
- * @return The computed result.
- *
- * @throws CancellationException If the computation was cancelled.
- * @throws ExecutionException If the computation threw an exception.
- * @throws InterruptedException If the current thread was interrupted
- * while waiting.
- */
- public final Result get() throws InterruptedException, ExecutionException {
- return mFuture.get();
- }
-
- /**
- * Waits if necessary for at most the given time for the computation
- * to complete, and then retrieves its result.
- *
- * @param timeout Time to wait before cancelling the operation.
- * @param unit The time unit for the timeout.
- *
- * @return The computed result.
- *
- * @throws CancellationException If the computation was cancelled.
- * @throws ExecutionException If the computation threw an exception.
- * @throws InterruptedException If the current thread was interrupted
- * while waiting.
- * @throws TimeoutException If the wait timed out.
- */
- public final Result get(long timeout, TimeUnit unit) throws InterruptedException,
- ExecutionException, TimeoutException {
- return mFuture.get(timeout, unit);
- }
-
- /**
- * Executes the task with the specified parameters. The task returns
- * itself (this) so that the caller can keep a reference to it.
- *
- * This method must be invoked on the UI thread.
- *
- * @param params The parameters of the task.
- *
- * @return This instance of AsyncTask.
- *
- * @throws IllegalStateException If {@link #getStatus()} returns either
- * {@link AsyncTask.Status#RUNNING} or {@link AsyncTask.Status#FINISHED}.
- */
- public final AsyncTask<Params, Progress, Result> execute(Params... params) {
- if (mStatus != Status.PENDING) {
- switch (mStatus) {
- case RUNNING:
- throw new IllegalStateException("Cannot execute task:"
- + " the task is already running.");
- case FINISHED:
- throw new IllegalStateException("Cannot execute task:"
- + " the task has already been executed "
- + "(a task can be executed only once)");
- }
- }
-
- mStatus = Status.RUNNING;
-
- onPreExecute();
-
- mWorker.mParams = params;
- sExecutor.execute(mFuture);
-
- return this;
- }
-
- /**
- * This method can be invoked from {@link #doInBackground} to
- * publish updates on the UI thread while the background computation is
- * still running. Each call to this method will trigger the execution of
- * {@link #onProgressUpdate} on the UI thread.
- *
- * @param values The progress values to update the UI with.
- *
- * @see #onProgressUpdate
- * @see #doInBackground
- */
- protected final void publishProgress(Progress... values) {
- sHandler.obtainMessage(MESSAGE_POST_PROGRESS,
- new AsyncTaskResult<Progress>(this, values)).sendToTarget();
- }
-
- private void finish(Result result) {
- onPostExecute(result);
- mStatus = Status.FINISHED;
- }
-
- private static class InternalHandler extends Handler {
- @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
- @Override
- public void handleMessage(Message msg) {
- AsyncTaskResult result = (AsyncTaskResult) msg.obj;
- switch (msg.what) {
- case MESSAGE_POST_RESULT:
- // There is only one result
- result.mTask.finish(result.mData[0]);
- break;
- case MESSAGE_POST_PROGRESS:
- result.mTask.onProgressUpdate(result.mData);
- break;
- case MESSAGE_POST_CANCEL:
- result.mTask.onCancelled();
- break;
- }
- }
- }
-
- private static abstract class WorkerRunnable<Params, Result> implements Callable<Result> {
- Params[] mParams;
- }
-
- @SuppressWarnings({"RawUseOfParameterizedType"})
- private static class AsyncTaskResult<Data> {
- final AsyncTask mTask;
- final Data[] mData;
-
- AsyncTaskResult(AsyncTask task, Data... data) {
- mTask = task;
- mData = data;
- }
- }
-}
diff --git a/core/java/android/os/BadParcelableException.java b/core/java/android/os/BadParcelableException.java
deleted file mode 100644
index a1c5bb2..0000000
--- a/core/java/android/os/BadParcelableException.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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 android.os;
-import android.util.AndroidRuntimeException;
-
-/**
- * The object you are calling has died, because its hosting process
- * no longer exists.
- */
-public class BadParcelableException extends AndroidRuntimeException {
- public BadParcelableException(String msg) {
- super(msg);
- }
- public BadParcelableException(Exception cause) {
- super(cause);
- }
-}
diff --git a/core/java/android/os/Base64Utils.java b/core/java/android/os/Base64Utils.java
deleted file mode 100644
index 684a469..0000000
--- a/core/java/android/os/Base64Utils.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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 android.os;
-
-/**
- * {@hide}
- */
-public class Base64Utils
-{
- // TODO add encode api here if possible
-
- public static byte [] decodeBase64(String data) {
- return decodeBase64Native(data);
- }
- private static native byte[] decodeBase64Native(String data);
-}
-
diff --git a/core/java/android/os/BatteryManager.java b/core/java/android/os/BatteryManager.java
deleted file mode 100644
index 8f1a756..0000000
--- a/core/java/android/os/BatteryManager.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2008 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 android.os;
-
-/**
- * The BatteryManager class contains strings and constants used for values
- * in the ACTION_BATTERY_CHANGED Intent.
- */
-public class BatteryManager {
-
- // values for "status" field in the ACTION_BATTERY_CHANGED Intent
- public static final int BATTERY_STATUS_UNKNOWN = 1;
- public static final int BATTERY_STATUS_CHARGING = 2;
- public static final int BATTERY_STATUS_DISCHARGING = 3;
- public static final int BATTERY_STATUS_NOT_CHARGING = 4;
- public static final int BATTERY_STATUS_FULL = 5;
-
- // values for "health" field in the ACTION_BATTERY_CHANGED Intent
- public static final int BATTERY_HEALTH_UNKNOWN = 1;
- public static final int BATTERY_HEALTH_GOOD = 2;
- public static final int BATTERY_HEALTH_OVERHEAT = 3;
- public static final int BATTERY_HEALTH_DEAD = 4;
- public static final int BATTERY_HEALTH_OVER_VOLTAGE = 5;
- public static final int BATTERY_HEALTH_UNSPECIFIED_FAILURE = 6;
-
- // values of the "plugged" field in the ACTION_BATTERY_CHANGED intent.
- // These must be powers of 2.
- /** Power source is an AC charger. */
- public static final int BATTERY_PLUGGED_AC = 1;
- /** Power source is a USB port. */
- public static final int BATTERY_PLUGGED_USB = 2;
-}
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
deleted file mode 100644
index 6f9d6c6..0000000
--- a/core/java/android/os/BatteryStats.java
+++ /dev/null
@@ -1,795 +0,0 @@
-package android.os;
-
-import java.io.PrintWriter;
-import java.util.Formatter;
-import java.util.Map;
-
-import android.util.Log;
-import android.util.Printer;
-import android.util.SparseArray;
-
-/**
- * A class providing access to battery usage statistics, including information on
- * wakelocks, processes, packages, and services. All times are represented in microseconds
- * except where indicated otherwise.
- * @hide
- */
-public abstract class BatteryStats implements Parcelable {
-
- /**
- * A constant indicating a partial wake lock timer.
- */
- public static final int WAKE_TYPE_PARTIAL = 0;
-
- /**
- * A constant indicating a full wake lock timer.
- */
- public static final int WAKE_TYPE_FULL = 1;
-
- /**
- * A constant indicating a window wake lock timer.
- */
- public static final int WAKE_TYPE_WINDOW = 2;
-
- /**
- * A constant indicating a sensor timer.
- *
- * {@hide}
- */
- public static final int SENSOR = 3;
-
- /**
- * Include all of the data in the stats, including previously saved data.
- */
- public static final int STATS_TOTAL = 0;
-
- /**
- * Include only the last run in the stats.
- */
- public static final int STATS_LAST = 1;
-
- /**
- * Include only the current run in the stats.
- */
- public static final int STATS_CURRENT = 2;
-
- /**
- * Include only the run since the last time the device was unplugged in the stats.
- */
- public static final int STATS_UNPLUGGED = 3;
-
- /**
- * Bump the version on this if the checkin format changes.
- */
- private static final int BATTERY_STATS_CHECKIN_VERSION = 1;
-
- // TODO: Update this list if you add/change any stats above.
- private static final String[] STAT_NAMES = { "total", "last", "current", "unplugged" };
-
- private static final String APK_DATA = "apk";
- private static final String PROCESS_DATA = "process";
- private static final String SENSOR_DATA = "sensor";
- private static final String WAKELOCK_DATA = "wakelock";
- private static final String NETWORK_DATA = "network";
- private static final String BATTERY_DATA = "battery";
-
- private final StringBuilder mFormatBuilder = new StringBuilder(8);
- private final Formatter mFormatter = new Formatter(mFormatBuilder);
-
- /**
- * State for keeping track of timing information.
- */
- public static abstract class Timer {
-
- /**
- * Returns the count associated with this Timer for the
- * selected type of statistics.
- *
- * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
- */
- public abstract int getCount(int which);
-
- /**
- * Returns the total time in microseconds associated with this Timer for the
- * selected type of statistics.
- *
- * @param now system uptime time in microseconds
- * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
- * @return a time in microseconds
- */
- public abstract long getTotalTime(long now, int which);
-
- /**
- * Temporary for debugging.
- */
- public abstract void logState();
- }
-
- /**
- * The statistics associated with a particular uid.
- */
- public static abstract class Uid {
-
- /**
- * Returns a mapping containing wakelock statistics.
- *
- * @return a Map from Strings to Uid.Wakelock objects.
- */
- public abstract Map<String, ? extends Wakelock> getWakelockStats();
-
- /**
- * The statistics associated with a particular wake lock.
- */
- public static abstract class Wakelock {
- public abstract Timer getWakeTime(int type);
- }
-
- /**
- * Returns a mapping containing sensor statistics.
- *
- * @return a Map from Integer sensor ids to Uid.Sensor objects.
- */
- public abstract Map<Integer, ? extends Sensor> getSensorStats();
-
- /**
- * Returns a mapping containing process statistics.
- *
- * @return a Map from Strings to Uid.Proc objects.
- */
- public abstract Map<String, ? extends Proc> getProcessStats();
-
- /**
- * Returns a mapping containing package statistics.
- *
- * @return a Map from Strings to Uid.Pkg objects.
- */
- public abstract Map<String, ? extends Pkg> getPackageStats();
-
- /**
- * {@hide}
- */
- public abstract int getUid();
-
- /**
- * {@hide}
- */
- public abstract long getTcpBytesReceived(int which);
-
- /**
- * {@hide}
- */
- public abstract long getTcpBytesSent(int which);
-
- public static abstract class Sensor {
- // Magic sensor number for the GPS.
- public static final int GPS = -10000;
-
- public abstract int getHandle();
-
- public abstract Timer getSensorTime();
- }
-
- /**
- * The statistics associated with a particular process.
- */
- public static abstract class Proc {
-
- /**
- * Returns the total time (in 1/100 sec) spent executing in user code.
- *
- * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
- */
- public abstract long getUserTime(int which);
-
- /**
- * Returns the total time (in 1/100 sec) spent executing in system code.
- *
- * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
- */
- public abstract long getSystemTime(int which);
-
- /**
- * Returns the number of times the process has been started.
- *
- * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
- */
- public abstract int getStarts(int which);
- }
-
- /**
- * The statistics associated with a particular package.
- */
- public static abstract class Pkg {
-
- /**
- * Returns the number of times this package has done something that could wake up the
- * device from sleep.
- *
- * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
- */
- public abstract int getWakeups(int which);
-
- /**
- * Returns a mapping containing service statistics.
- */
- public abstract Map<String, ? extends Serv> getServiceStats();
-
- /**
- * The statistics associated with a particular service.
- */
- public abstract class Serv {
-
- /**
- * Returns the amount of time spent started.
- *
- * @param now elapsed realtime in microseconds.
- * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
- * @return
- */
- public abstract long getStartTime(long now, int which);
-
- /**
- * Returns the total number of times startService() has been called.
- *
- * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
- */
- public abstract int getStarts(int which);
-
- /**
- * Returns the total number times the service has been launched.
- *
- * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
- */
- public abstract int getLaunches(int which);
- }
- }
- }
-
- /**
- * Returns the number of times the device has been started.
- */
- public abstract int getStartCount();
-
- /**
- * Returns the time in milliseconds that the screen has been on while the device was
- * running on battery.
- *
- * {@hide}
- */
- public abstract long getBatteryScreenOnTime();
-
- /**
- * Returns the time in milliseconds that the screen has been on while the device was
- * plugged in.
- *
- * {@hide}
- */
- public abstract long getPluggedScreenOnTime();
-
- /**
- * Return whether we are currently running on battery.
- */
- public abstract boolean getIsOnBattery();
-
- /**
- * Returns a SparseArray containing the statistics for each uid.
- */
- public abstract SparseArray<? extends Uid> getUidStats();
-
- /**
- * Returns the current battery uptime in microseconds.
- *
- * @param curTime the amount of elapsed realtime in microseconds.
- */
- public abstract long getBatteryUptime(long curTime);
-
- /**
- * Returns the current battery realtime in microseconds.
- *
- * @param curTime the amount of elapsed realtime in microseconds.
- */
- public abstract long getBatteryRealtime(long curTime);
-
- /**
- * Returns the total, last, or current battery uptime in microseconds.
- *
- * @param curTime the elapsed realtime in microseconds.
- * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
- */
- public abstract long computeBatteryUptime(long curTime, int which);
-
- /**
- * Returns the total, last, or current battery realtime in microseconds.
- *
- * @param curTime the current elapsed realtime in microseconds.
- * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
- */
- public abstract long computeBatteryRealtime(long curTime, int which);
-
- /**
- * Returns the total, last, or current uptime in microseconds.
- *
- * @param curTime the current elapsed realtime in microseconds.
- * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
- */
- public abstract long computeUptime(long curTime, int which);
-
- /**
- * Returns the total, last, or current realtime in microseconds.
- * *
- * @param curTime the current elapsed realtime in microseconds.
- * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
- */
- public abstract long computeRealtime(long curTime, int which);
-
- private final static void formatTime(StringBuilder out, long seconds) {
- long days = seconds / (60 * 60 * 24);
- if (days != 0) {
- out.append(days);
- out.append("d ");
- }
- long used = days * 60 * 60 * 24;
-
- long hours = (seconds - used) / (60 * 60);
- if (hours != 0 || used != 0) {
- out.append(hours);
- out.append("h ");
- }
- used += hours * 60 * 60;
-
- long mins = (seconds-used) / 60;
- if (mins != 0 || used != 0) {
- out.append(mins);
- out.append("m ");
- }
- used += mins * 60;
-
- if (seconds != 0 || used != 0) {
- out.append(seconds-used);
- out.append("s ");
- }
- }
-
- private final static String formatTime(long time) {
- long sec = time / 100;
- StringBuilder sb = new StringBuilder();
- formatTime(sb, sec);
- sb.append((time - (sec * 100)) * 10);
- sb.append("ms ");
- return sb.toString();
- }
-
- private final static String formatTimeMs(long time) {
- long sec = time / 1000;
- StringBuilder sb = new StringBuilder();
- formatTime(sb, sec);
- sb.append(time - (sec * 1000));
- sb.append("ms ");
- return sb.toString();
- }
-
- private final String formatRatioLocked(long num, long den) {
- if (den == 0L) {
- return "---%";
- }
- float perc = ((float)num) / ((float)den) * 100;
- mFormatBuilder.setLength(0);
- mFormatter.format("%.1f%%", perc);
- return mFormatBuilder.toString();
- }
-
- /**
- *
- * @param sb a StringBuilder object.
- * @param timer a Timer object contining the wakelock times.
- * @param now the current time in microseconds.
- * @param name the name of the wakelock.
- * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
- * @param linePrefix a String to be prepended to each line of output.
- * @return the line prefix
- */
- private static final String printWakeLock(StringBuilder sb, Timer timer, long now,
- String name, int which, String linePrefix) {
-
- if (timer != null) {
- // Convert from microseconds to milliseconds with rounding
- long totalTimeMicros = timer.getTotalTime(now, which);
- long totalTimeMillis = (totalTimeMicros + 500) / 1000;
-
- int count = timer.getCount(which);
- if (totalTimeMillis != 0) {
- sb.append(linePrefix);
- sb.append(formatTimeMs(totalTimeMillis));
- sb.append(name);
- sb.append(' ');
- sb.append('(');
- sb.append(count);
- sb.append(" times)");
- return ", ";
- }
- }
- return linePrefix;
- }
-
- /**
- * Checkin version of wakelock printer. Prints simple comma-separated list.
- *
- * @param sb a StringBuilder object.
- * @param timer a Timer object contining the wakelock times.
- * @param now the current time in microseconds.
- * @param name the name of the wakelock.
- * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
- * @param linePrefix a String to be prepended to each line of output.
- * @return the line prefix
- */
- private static final String printWakeLockCheckin(StringBuilder sb, Timer timer, long now,
- String name, int which, String linePrefix) {
- long totalTimeMicros = 0;
- int count = 0;
- if (timer != null) {
- totalTimeMicros = timer.getTotalTime(now, which);
- count = timer.getCount(which);
- }
- sb.append(linePrefix);
- sb.append((totalTimeMicros + 500) / 1000); // microseconds to milliseconds with rounding
- sb.append(',');
- sb.append(name);
- sb.append(',');
- sb.append(count);
- return ",";
- }
-
- /**
- * Dump a comma-separated line of values for terse checkin mode.
- *
- * @param pw the PageWriter to dump log to
- * @param category category of data (e.g. "total", "last", "unplugged", "current" )
- * @param type type of data (e.g. "wakelock", "sensor", "process", "apk" , "process", "network")
- * @param args type-dependent data arguments
- */
- private static final void dumpLine(PrintWriter pw, int uid, String category, String type,
- Object... args ) {
- pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(',');
- pw.print(uid); pw.print(',');
- pw.print(category); pw.print(',');
- pw.print(type);
-
- for (Object arg : args) {
- pw.print(',');
- pw.print(arg);
- }
- pw.print('\n');
- }
-
- /**
- * Checkin server version of dump to produce more compact, computer-readable log.
- *
- * NOTE: all times are expressed in 'ms'.
- * @param fd
- * @param pw
- * @param which
- */
- private final void dumpCheckinLocked(PrintWriter pw, int which) {
- long uSecTime = SystemClock.elapsedRealtime() * 1000;
- final long uSecNow = getBatteryUptime(uSecTime);
-
- StringBuilder sb = new StringBuilder(128);
- long batteryUptime = computeBatteryUptime(uSecNow, which);
- long batteryRealtime = computeBatteryRealtime(getBatteryRealtime(uSecTime), which);
- long elapsedRealtime = computeRealtime(uSecTime, which);
- long uptime = computeUptime(SystemClock.uptimeMillis() * 1000, which);
-
- String category = STAT_NAMES[which];
-
- // Dump "battery" stat
- dumpLine(pw, 0 /* uid */, category, BATTERY_DATA,
- which == STATS_TOTAL ? getStartCount() : "N/A",
- batteryUptime / 1000,
- formatRatioLocked(batteryUptime, elapsedRealtime),
- batteryRealtime / 1000,
- formatRatioLocked(batteryRealtime, elapsedRealtime),
- uptime / 1000,
- elapsedRealtime / 1000);
-
- SparseArray<? extends Uid> uidStats = getUidStats();
- final int NU = uidStats.size();
- for (int iu = 0; iu < NU; iu++) {
- final int uid = uidStats.keyAt(iu);
- Uid u = uidStats.valueAt(iu);
- // Dump Network stats per uid, if any
- long rx = u.getTcpBytesReceived(which);
- long tx = u.getTcpBytesSent(which);
- if (rx > 0 || tx > 0) dumpLine(pw, uid, category, NETWORK_DATA, rx, tx);
-
- Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
- if (wakelocks.size() > 0) {
- for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
- : wakelocks.entrySet()) {
- Uid.Wakelock wl = ent.getValue();
- String linePrefix = "";
- sb.setLength(0);
- linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_FULL), uSecNow,
- "full", which, linePrefix);
- linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), uSecNow,
- "partial", which, linePrefix);
- linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), uSecNow,
- "window", which, linePrefix);
-
- // Only log if we had at lease one wakelock...
- if (sb.length() > 0) {
- dumpLine(pw, uid, category, WAKELOCK_DATA, ent.getKey(), sb.toString());
- }
- }
- }
-
- Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
- if (sensors.size() > 0) {
- for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
- : sensors.entrySet()) {
- Uid.Sensor se = ent.getValue();
- int sensorNumber = ent.getKey();
- Timer timer = se.getSensorTime();
- if (timer != null) {
- // Convert from microseconds to milliseconds with rounding
- long totalTime = (timer.getTotalTime(uSecNow, which) + 500) / 1000;
- int count = timer.getCount(which);
- if (totalTime != 0) {
- dumpLine(pw, uid, category, SENSOR_DATA, sensorNumber, totalTime, count);
- }
- }
- }
- }
-
- Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
- if (processStats.size() > 0) {
- for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
- : processStats.entrySet()) {
- Uid.Proc ps = ent.getValue();
-
- long userTime = ps.getUserTime(which);
- long systemTime = ps.getSystemTime(which);
- int starts = ps.getStarts(which);
-
- if (userTime != 0 || systemTime != 0 || starts != 0) {
- dumpLine(pw, uid, category, PROCESS_DATA,
- ent.getKey(), // proc
- userTime * 10, // cpu time in ms
- systemTime * 10, // user time in ms
- starts); // process starts
- }
- }
- }
-
- Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats();
- if (packageStats.size() > 0) {
- for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
- : packageStats.entrySet()) {
-
- Uid.Pkg ps = ent.getValue();
- int wakeups = ps.getWakeups(which);
- Map<String, ? extends Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
- for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent
- : serviceStats.entrySet()) {
- BatteryStats.Uid.Pkg.Serv ss = sent.getValue();
- long startTime = ss.getStartTime(uSecNow, which);
- int starts = ss.getStarts(which);
- int launches = ss.getLaunches(which);
- if (startTime != 0 || starts != 0 || launches != 0) {
- dumpLine(pw, uid, category, APK_DATA,
- wakeups, // wakeup alarms
- ent.getKey(), // Apk
- sent.getKey(), // service
- startTime / 1000, // time spent started, in ms
- starts,
- launches);
- }
- }
- }
- }
- }
- }
-
- @SuppressWarnings("unused")
- private final void dumpLocked(Printer pw, String prefix, int which) {
- long uSecTime = SystemClock.elapsedRealtime() * 1000;
- final long uSecNow = getBatteryUptime(uSecTime);
-
- StringBuilder sb = new StringBuilder(128);
- long batteryUptime = computeBatteryUptime(uSecNow, which);
- long batteryRealtime = computeBatteryRealtime(getBatteryRealtime(uSecTime), which);
- long elapsedRealtime = computeRealtime(uSecTime, which);
- long uptime = computeUptime(SystemClock.uptimeMillis() * 1000, which);
-
- pw.println(prefix
- + " Time on battery: " + formatTimeMs(batteryUptime / 1000) + "("
- + formatRatioLocked(batteryUptime, elapsedRealtime)
- + ") uptime, "
- + formatTimeMs(batteryRealtime / 1000) + "("
- + formatRatioLocked(batteryRealtime, elapsedRealtime)
- + ") realtime");
- pw.println(prefix
- + " Total: "
- + formatTimeMs(uptime / 1000)
- + "uptime, "
- + formatTimeMs(elapsedRealtime / 1000)
- + "realtime");
-
- pw.println(" ");
-
- SparseArray<? extends Uid> uidStats = getUidStats();
- final int NU = uidStats.size();
- for (int iu=0; iu<NU; iu++) {
- final int uid = uidStats.keyAt(iu);
- Uid u = uidStats.valueAt(iu);
- pw.println(prefix + " #" + uid + ":");
- boolean uidActivity = false;
-
- long tcpReceived = u.getTcpBytesReceived(which);
- long tcpSent = u.getTcpBytesSent(which);
- if (tcpReceived != 0 || tcpSent != 0) {
- pw.println(prefix + " Network: " + tcpReceived + " bytes received, "
- + tcpSent + " bytes sent");
- }
-
- Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
- if (wakelocks.size() > 0) {
- for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
- : wakelocks.entrySet()) {
- Uid.Wakelock wl = ent.getValue();
- String linePrefix = ": ";
- sb.setLength(0);
- sb.append(prefix);
- sb.append(" Wake lock ");
- sb.append(ent.getKey());
- linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_FULL), uSecNow,
- "full", which, linePrefix);
- linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), uSecNow,
- "partial", which, linePrefix);
- linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), uSecNow,
- "window", which, linePrefix);
- if (!linePrefix.equals(": ")) {
- sb.append(" realtime");
- } else {
- sb.append(": (nothing executed)");
- }
- pw.println(sb.toString());
- uidActivity = true;
- }
- }
-
- Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
- if (sensors.size() > 0) {
- for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
- : sensors.entrySet()) {
- Uid.Sensor se = ent.getValue();
- int sensorNumber = ent.getKey();
- sb.setLength(0);
- sb.append(prefix);
- sb.append(" Sensor ");
- int handle = se.getHandle();
- if (handle == Uid.Sensor.GPS) {
- sb.append("GPS");
- } else {
- sb.append(handle);
- }
- sb.append(": ");
-
- Timer timer = se.getSensorTime();
- if (timer != null) {
- // Convert from microseconds to milliseconds with rounding
- long totalTime = (timer.getTotalTime(uSecNow, which) + 500) / 1000;
- int count = timer.getCount(which);
- //timer.logState();
- if (totalTime != 0) {
- sb.append(formatTimeMs(totalTime));
- sb.append("realtime (");
- sb.append(count);
- sb.append(" times)");
- } else {
- sb.append("(not used)");
- }
- } else {
- sb.append("(not used)");
- }
-
- pw.println(sb.toString());
- uidActivity = true;
- }
- }
-
- Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
- if (processStats.size() > 0) {
- for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
- : processStats.entrySet()) {
- Uid.Proc ps = ent.getValue();
- long userTime;
- long systemTime;
- int starts;
-
- userTime = ps.getUserTime(which);
- systemTime = ps.getSystemTime(which);
- starts = ps.getStarts(which);
-
- if (userTime != 0 || systemTime != 0 || starts != 0) {
- pw.println(prefix + " Proc " + ent.getKey() + ":");
- pw.println(prefix + " CPU: " + formatTime(userTime) + "user + "
- + formatTime(systemTime) + "kernel");
- pw.println(prefix + " " + starts + " process starts");
- uidActivity = true;
- }
- }
- }
-
- Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats();
- if (packageStats.size() > 0) {
- for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
- : packageStats.entrySet()) {
- pw.println(prefix + " Apk " + ent.getKey() + ":");
- boolean apkActivity = false;
- Uid.Pkg ps = ent.getValue();
- int wakeups = ps.getWakeups(which);
- if (wakeups != 0) {
- pw.println(prefix + " " + wakeups + " wakeup alarms");
- apkActivity = true;
- }
- Map<String, ? extends Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
- if (serviceStats.size() > 0) {
- for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent
- : serviceStats.entrySet()) {
- BatteryStats.Uid.Pkg.Serv ss = sent.getValue();
- long startTime = ss.getStartTime(uSecNow, which);
- int starts = ss.getStarts(which);
- int launches = ss.getLaunches(which);
- if (startTime != 0 || starts != 0 || launches != 0) {
- pw.println(prefix + " Service " + sent.getKey() + ":");
- pw.println(prefix + " Created for: "
- + formatTimeMs(startTime / 1000)
- + " uptime");
- pw.println(prefix + " Starts: " + starts
- + ", launches: " + launches);
- apkActivity = true;
- }
- }
- }
- if (!apkActivity) {
- pw.println(prefix + " (nothing executed)");
- }
- uidActivity = true;
- }
- }
- if (!uidActivity) {
- pw.println(prefix + " (nothing executed)");
- }
- }
- }
-
- /**
- * Dumps a human-readable summary of the battery statistics to the given PrintWriter.
- *
- * @param pw a Printer to receive the dump output.
- */
- @SuppressWarnings("unused")
- public void dumpLocked(Printer pw) {
- pw.println("Total Statistics (Current and Historic):");
- pw.println(" System starts: " + getStartCount()
- + ", currently on battery: " + getIsOnBattery());
- dumpLocked(pw, "", STATS_TOTAL);
- pw.println("");
- pw.println("Last Run Statistics (Previous run of system):");
- dumpLocked(pw, "", STATS_LAST);
- pw.println("");
- pw.println("Current Battery Statistics (Currently running system):");
- dumpLocked(pw, "", STATS_CURRENT);
- pw.println("");
- pw.println("Unplugged Statistics (Since last unplugged from power):");
- dumpLocked(pw, "", STATS_UNPLUGGED);
- }
-
- @SuppressWarnings("unused")
- public void dumpCheckinLocked(PrintWriter pw, String[] args) {
- dumpCheckinLocked(pw, STATS_TOTAL);
- dumpCheckinLocked(pw, STATS_LAST);
- dumpCheckinLocked(pw, STATS_UNPLUGGED);
- dumpCheckinLocked(pw, STATS_CURRENT);
- }
-}
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java
deleted file mode 100644
index df10c6a..0000000
--- a/core/java/android/os/Binder.java
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * 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 android.os;
-
-import android.util.Config;
-import android.util.Log;
-
-import java.io.FileDescriptor;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.lang.ref.WeakReference;
-import java.lang.reflect.Modifier;
-
-/**
- * Base class for a remotable object, the core part of a lightweight
- * remote procedure call mechanism defined by {@link IBinder}.
- * This class is an implementation of IBinder that provides
- * the standard support creating a local implementation of such an object.
- *
- * <p>Most developers will not implement this class directly, instead using the
- * <a href="{@docRoot}guide/developing/tools/aidl.html">aidl</a> tool to describe the desired
- * interface, having it generate the appropriate Binder subclass. You can,
- * however, derive directly from Binder to implement your own custom RPC
- * protocol or simply instantiate a raw Binder object directly to use as a
- * token that can be shared across processes.
- *
- * @see IBinder
- */
-public class Binder implements IBinder {
- /*
- * Set this flag to true to detect anonymous, local or member classes
- * that extend this Binder class and that are not static. These kind
- * of classes can potentially create leaks.
- */
- private static final boolean FIND_POTENTIAL_LEAKS = false;
- private static final String TAG = "Binder";
-
- private int mObject;
- private IInterface mOwner;
- private String mDescriptor;
-
- /**
- * Return the ID of the process that sent you the current transaction
- * that is being processed. This pid can be used with higher-level
- * system services to determine its identity and check permissions.
- * If the current thread is not currently executing an incoming transaction,
- * then its own pid is returned.
- */
- public static final native int getCallingPid();
-
- /**
- * Return the ID of the user assigned to the process that sent you the
- * current transaction that is being processed. This uid can be used with
- * higher-level system services to determine its identity and check
- * permissions. If the current thread is not currently executing an
- * incoming transaction, then its own uid is returned.
- */
- public static final native int getCallingUid();
-
- /**
- * Reset the identity of the incoming IPC to the local process. This can
- * be useful if, while handling an incoming call, you will be calling
- * on interfaces of other objects that may be local to your process and
- * need to do permission checks on the calls coming into them (so they
- * will check the permission of your own local process, and not whatever
- * process originally called you).
- *
- * @return Returns an opaque token that can be used to restore the
- * original calling identity by passing it to
- * {@link #restoreCallingIdentity(long)}.
- *
- * @see #getCallingPid()
- * @see #getCallingUid()
- * @see #restoreCallingIdentity(long)
- */
- public static final native long clearCallingIdentity();
-
- /**
- * Restore the identity of the incoming IPC back to a previously identity
- * that was returned by {@link #clearCallingIdentity}.
- *
- * @param token The opaque token that was previously returned by
- * {@link #clearCallingIdentity}.
- *
- * @see #clearCallingIdentity
- */
- public static final native void restoreCallingIdentity(long token);
-
- /**
- * Flush any Binder commands pending in the current thread to the kernel
- * driver. This can be
- * useful to call before performing an operation that may block for a long
- * time, to ensure that any pending object references have been released
- * in order to prevent the process from holding on to objects longer than
- * it needs to.
- */
- public static final native void flushPendingCommands();
-
- /**
- * Add the calling thread to the IPC thread pool. This function does
- * not return until the current process is exiting.
- */
- public static final native void joinThreadPool();
-
- /**
- * Default constructor initializes the object.
- */
- public Binder() {
- init();
-
- if (FIND_POTENTIAL_LEAKS) {
- final Class<? extends Binder> klass = getClass();
- if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
- (klass.getModifiers() & Modifier.STATIC) == 0) {
- Log.w(TAG, "The following Binder class should be static or leaks might occur: " +
- klass.getCanonicalName());
- }
- }
- }
-
- /**
- * Convenience method for associating a specific interface with the Binder.
- * After calling, queryLocalInterface() will be implemented for you
- * to return the given owner IInterface when the corresponding
- * descriptor is requested.
- */
- public void attachInterface(IInterface owner, String descriptor) {
- mOwner = owner;
- mDescriptor = descriptor;
- }
-
- /**
- * Default implementation returns an empty interface name.
- */
- public String getInterfaceDescriptor() {
- return mDescriptor;
- }
-
- /**
- * Default implementation always returns true -- if you got here,
- * the object is alive.
- */
- public boolean pingBinder() {
- return true;
- }
-
- /**
- * {@inheritDoc}
- *
- * Note that if you're calling on a local binder, this always returns true
- * because your process is alive if you're calling it.
- */
- public boolean isBinderAlive() {
- return true;
- }
-
- /**
- * Use information supplied to attachInterface() to return the
- * associated IInterface if it matches the requested
- * descriptor.
- */
- public IInterface queryLocalInterface(String descriptor) {
- if (mDescriptor.equals(descriptor)) {
- return mOwner;
- }
- return null;
- }
-
- /**
- * Default implementation is a stub that returns false. You will want
- * to override this to do the appropriate unmarshalling of transactions.
- *
- * <p>If you want to call this, call transact().
- */
- protected boolean onTransact(int code, Parcel data, Parcel reply,
- int flags) throws RemoteException {
- if (code == INTERFACE_TRANSACTION) {
- reply.writeString(getInterfaceDescriptor());
- return true;
- } else if (code == DUMP_TRANSACTION) {
- ParcelFileDescriptor fd = data.readFileDescriptor();
- String[] args = data.readStringArray();
- if (fd != null) {
- try {
- dump(fd.getFileDescriptor(), args);
- } finally {
- try {
- fd.close();
- } catch (IOException e) {
- }
- }
- }
- return true;
- }
- return false;
- }
-
- /**
- * Implemented to call the more convenient version
- * {@link #dump(FileDescriptor, PrintWriter, String[])}.
- */
- public void dump(FileDescriptor fd, String[] args) {
- FileOutputStream fout = new FileOutputStream(fd);
- PrintWriter pw = new PrintWriter(fout);
- try {
- dump(fd, pw, args);
- } finally {
- pw.flush();
- }
- }
-
- /**
- * Print the object's state into the given stream.
- *
- * @param fd The raw file descriptor that the dump is being sent to.
- * @param fout The file to which you should dump your state. This will be
- * closed for you after you return.
- * @param args additional arguments to the dump request.
- */
- protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) {
- }
-
- /**
- * Default implementation rewinds the parcels and calls onTransact. On
- * the remote side, transact calls into the binder to do the IPC.
- */
- public final boolean transact(int code, Parcel data, Parcel reply,
- int flags) throws RemoteException {
- if (Config.LOGV) Log.v("Binder", "Transact: " + code + " to " + this);
- if (data != null) {
- data.setDataPosition(0);
- }
- boolean r = onTransact(code, data, reply, flags);
- if (reply != null) {
- reply.setDataPosition(0);
- }
- return r;
- }
-
- /**
- * Local implementation is a no-op.
- */
- public void linkToDeath(DeathRecipient recipient, int flags) {
- }
-
- /**
- * Local implementation is a no-op.
- */
- public boolean unlinkToDeath(DeathRecipient recipient, int flags) {
- return true;
- }
-
- protected void finalize() throws Throwable {
- try {
- destroy();
- } finally {
- super.finalize();
- }
- }
-
- private native final void init();
- private native final void destroy();
- private boolean execTransact(int code, int dataObj, int replyObj,
- int flags) {
- Parcel data = Parcel.obtain(dataObj);
- Parcel reply = Parcel.obtain(replyObj);
- // theoretically, we should call transact, which will call onTransact,
- // but all that does is rewind it, and we just got these from an IPC,
- // so we'll just call it directly.
- boolean res;
- try {
- res = onTransact(code, data, reply, flags);
- } catch (RemoteException e) {
- reply.writeException(e);
- res = true;
- } catch (RuntimeException e) {
- reply.writeException(e);
- res = true;
- }
- reply.recycle();
- data.recycle();
- return res;
- }
-}
-
-final class BinderProxy implements IBinder {
- public native boolean pingBinder();
- public native boolean isBinderAlive();
-
- public IInterface queryLocalInterface(String descriptor) {
- return null;
- }
-
- public native String getInterfaceDescriptor() throws RemoteException;
- public native boolean transact(int code, Parcel data, Parcel reply,
- int flags) throws RemoteException;
- public native void linkToDeath(DeathRecipient recipient, int flags)
- throws RemoteException;
- public native boolean unlinkToDeath(DeathRecipient recipient, int flags);
-
- public void dump(FileDescriptor fd, String[] args) throws RemoteException {
- Parcel data = Parcel.obtain();
- data.writeFileDescriptor(fd);
- data.writeStringArray(args);
- try {
- transact(DUMP_TRANSACTION, data, null, 0);
- } finally {
- data.recycle();
- }
- }
-
- BinderProxy() {
- mSelf = new WeakReference(this);
- }
-
- @Override
- protected void finalize() throws Throwable {
- try {
- destroy();
- } finally {
- super.finalize();
- }
- }
-
- private native final void destroy();
-
- private static final void sendDeathNotice(DeathRecipient recipient) {
- if (Config.LOGV) Log.v("JavaBinder", "sendDeathNotice to " + recipient);
- try {
- recipient.binderDied();
- }
- catch (RuntimeException exc) {
- Log.w("BinderNative", "Uncaught exception from death notification",
- exc);
- }
- }
-
- final private WeakReference mSelf;
- private int mObject;
-}
diff --git a/core/java/android/os/Broadcaster.java b/core/java/android/os/Broadcaster.java
deleted file mode 100644
index 96dc61a..0000000
--- a/core/java/android/os/Broadcaster.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * 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 android.os;
-
-/** @hide */
-public class Broadcaster
-{
- public Broadcaster()
- {
- }
-
- /**
- * Sign up for notifications about something.
- *
- * When this broadcaster pushes a message with senderWhat in the what field,
- * target will be sent a copy of that message with targetWhat in the what field.
- */
- public void request(int senderWhat, Handler target, int targetWhat)
- {
- synchronized (this) {
- Registration r = null;
- if (mReg == null) {
- r = new Registration();
- r.senderWhat = senderWhat;
- r.targets = new Handler[1];
- r.targetWhats = new int[1];
- r.targets[0] = target;
- r.targetWhats[0] = targetWhat;
- mReg = r;
- r.next = r;
- r.prev = r;
- } else {
- // find its place in the map
- Registration start = mReg;
- r = start;
- do {
- if (r.senderWhat >= senderWhat) {
- break;
- }
- r = r.next;
- } while (r != start);
- int n;
- if (r.senderWhat != senderWhat) {
- // we didn't find a senderWhat match, but r is right
- // after where it goes
- Registration reg = new Registration();
- reg.senderWhat = senderWhat;
- reg.targets = new Handler[1];
- reg.targetWhats = new int[1];
- reg.next = r;
- reg.prev = r.prev;
- r.prev.next = reg;
- r.prev = reg;
-
- if (r == mReg && r.senderWhat > reg.senderWhat) {
- mReg = reg;
- }
-
- r = reg;
- n = 0;
- } else {
- n = r.targets.length;
- Handler[] oldTargets = r.targets;
- int[] oldWhats = r.targetWhats;
- // check for duplicates, and don't do it if we are dup.
- for (int i=0; i<n; i++) {
- if (oldTargets[i] == target && oldWhats[i] == targetWhat) {
- return;
- }
- }
- r.targets = new Handler[n+1];
- System.arraycopy(oldTargets, 0, r.targets, 0, n);
- r.targetWhats = new int[n+1];
- System.arraycopy(oldWhats, 0, r.targetWhats, 0, n);
- }
- r.targets[n] = target;
- r.targetWhats[n] = targetWhat;
- }
- }
- }
-
- /**
- * Unregister for notifications for this senderWhat/target/targetWhat tuple.
- */
- public void cancelRequest(int senderWhat, Handler target, int targetWhat)
- {
- synchronized (this) {
- Registration start = mReg;
- Registration r = start;
-
- if (r == null) {
- return;
- }
-
- do {
- if (r.senderWhat >= senderWhat) {
- break;
- }
- r = r.next;
- } while (r != start);
-
- if (r.senderWhat == senderWhat) {
- Handler[] targets = r.targets;
- int[] whats = r.targetWhats;
- int oldLen = targets.length;
- for (int i=0; i<oldLen; i++) {
- if (targets[i] == target && whats[i] == targetWhat) {
- r.targets = new Handler[oldLen-1];
- r.targetWhats = new int[oldLen-1];
- if (i > 0) {
- System.arraycopy(targets, 0, r.targets, 0, i);
- System.arraycopy(whats, 0, r.targetWhats, 0, i);
- }
-
- int remainingLen = oldLen-i-1;
- if (remainingLen != 0) {
- System.arraycopy(targets, i+1, r.targets, i,
- remainingLen);
- System.arraycopy(whats, i+1, r.targetWhats, i,
- remainingLen);
- }
- break;
- }
- }
- }
- }
- }
-
- /**
- * For debugging purposes, print the registrations to System.out
- */
- public void dumpRegistrations()
- {
- synchronized (this) {
- Registration start = mReg;
- System.out.println("Broadcaster " + this + " {");
- if (start != null) {
- Registration r = start;
- do {
- System.out.println(" senderWhat=" + r.senderWhat);
- int n = r.targets.length;
- for (int i=0; i<n; i++) {
- System.out.println(" [" + r.targetWhats[i]
- + "] " + r.targets[i]);
- }
- r = r.next;
- } while (r != start);
- }
- System.out.println("}");
- }
- }
-
- /**
- * Send out msg. Anyone who has registered via the request() method will be
- * sent the message.
- */
- public void broadcast(Message msg)
- {
- synchronized (this) {
- if (mReg == null) {
- return;
- }
-
- int senderWhat = msg.what;
- Registration start = mReg;
- Registration r = start;
- do {
- if (r.senderWhat >= senderWhat) {
- break;
- }
- r = r.next;
- } while (r != start);
- if (r.senderWhat == senderWhat) {
- Handler[] targets = r.targets;
- int[] whats = r.targetWhats;
- int n = targets.length;
- for (int i=0; i<n; i++) {
- Handler target = targets[i];
- Message m = Message.obtain();
- m.copyFrom(msg);
- m.what = whats[i];
- target.sendMessage(m);
- }
- }
- }
- }
-
- private class Registration
- {
- Registration next;
- Registration prev;
-
- int senderWhat;
- Handler[] targets;
- int[] targetWhats;
- }
- private Registration mReg;
-}
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
deleted file mode 100644
index 467c17f..0000000
--- a/core/java/android/os/Build.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2007 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 android.os;
-
-/**
- * Information about the current build, extracted from system properties.
- */
-public class Build {
- /** Value used for when a build property is unknown. */
- private static final String UNKNOWN = "unknown";
-
- /** Either a changelist number, or a label like "M4-rc20". */
- public static final String ID = getString("ro.build.id");
-
- /** A build ID string meant for displaying to the user */
- public static final String DISPLAY = getString("ro.build.display.id");
-
- /** The name of the overall product. */
- public static final String PRODUCT = getString("ro.product.name");
-
- /** The name of the industrial design. */
- public static final String DEVICE = getString("ro.product.device");
-
- /** The name of the underlying board, like "goldfish". */
- public static final String BOARD = getString("ro.product.board");
-
- /** The brand (e.g., carrier) the software is customized for, if any. */
- public static final String BRAND = getString("ro.product.brand");
-
- /** The end-user-visible name for the end product. */
- public static final String MODEL = getString("ro.product.model");
-
- /** Various version strings. */
- public static class VERSION {
- /**
- * The internal value used by the underlying source control to
- * represent this build. E.g., a perforce changelist number
- * or a git hash.
- */
- public static final String INCREMENTAL = getString("ro.build.version.incremental");
-
- /**
- * The user-visible version string. E.g., "1.0" or "3.4b5".
- */
- public static final String RELEASE = getString("ro.build.version.release");
-
- /**
- * The user-visible SDK version of the framework. It is an integer starting at 1.
- */
- public static final String SDK = getString("ro.build.version.sdk");
- }
-
- /** The type of build, like "user" or "eng". */
- public static final String TYPE = getString("ro.build.type");
-
- /** Comma-separated tags describing the build, like "unsigned,debug". */
- public static final String TAGS = getString("ro.build.tags");
-
- /** A string that uniquely identifies this build. Do not attempt to parse this value. */
- public static final String FINGERPRINT = getString("ro.build.fingerprint");
-
- // The following properties only make sense for internal engineering builds.
- public static final long TIME = getLong("ro.build.date.utc") * 1000;
- public static final String USER = getString("ro.build.user");
- public static final String HOST = getString("ro.build.host");
-
- private static String getString(String property) {
- return SystemProperties.get(property, UNKNOWN);
- }
-
- private static long getLong(String property) {
- try {
- return Long.parseLong(SystemProperties.get(property));
- } catch (NumberFormatException e) {
- return -1;
- }
- }
-}
diff --git a/core/java/android/os/Bundle.aidl b/core/java/android/os/Bundle.aidl
deleted file mode 100644
index b9e1224..0000000
--- a/core/java/android/os/Bundle.aidl
+++ /dev/null
@@ -1,20 +0,0 @@
-/* //device/java/android/android/os/Bundle.aidl
-**
-** Copyright 2007, 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 android.os;
-
-parcelable Bundle;
diff --git a/core/java/android/os/Bundle.java b/core/java/android/os/Bundle.java
deleted file mode 100644
index b669fa2..0000000
--- a/core/java/android/os/Bundle.java
+++ /dev/null
@@ -1,1452 +0,0 @@
-/*
- * Copyright (C) 2007 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 android.os;
-
-import android.util.Log;
-import android.util.SparseArray;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * A mapping from String values to various Parcelable types.
- *
- */
-public final class Bundle implements Parcelable, Cloneable {
- private static final String LOG_TAG = "Bundle";
- public static final Bundle EMPTY;
-
- static {
- EMPTY = new Bundle();
- EMPTY.mMap = Collections.unmodifiableMap(new HashMap<String, Object>());
- }
-
- // Invariant - exactly one of mMap / mParcelledData will be null
- // (except inside a call to unparcel)
-
- /* package */ Map<String, Object> mMap = null;
-
- /*
- * If mParcelledData is non-null, then mMap will be null and the
- * data are stored as a Parcel containing a Bundle. When the data
- * are unparcelled, mParcelledData willbe set to null.
- */
- /* package */ Parcel mParcelledData = null;
-
- private boolean mHasFds = false;
- private boolean mFdsKnown = true;
-
- /**
- * The ClassLoader used when unparcelling data from mParcelledData.
- */
- private ClassLoader mClassLoader;
-
- /**
- * Constructs a new, empty Bundle.
- */
- public Bundle() {
- mMap = new HashMap<String, Object>();
- mClassLoader = getClass().getClassLoader();
- }
-
- /**
- * Constructs a Bundle whose data is stored as a Parcel. The data
- * will be unparcelled on first contact, using the assigned ClassLoader.
- *
- * @param parcelledData a Parcel containing a Bundle
- */
- Bundle(Parcel parcelledData) {
- readFromParcel(parcelledData);
- }
-
- /**
- * Constructs a new, empty Bundle that uses a specific ClassLoader for
- * instantiating Parcelable and Serializable objects.
- *
- * @param loader An explicit ClassLoader to use when instantiating objects
- * inside of the Bundle.
- */
- public Bundle(ClassLoader loader) {
- mMap = new HashMap<String, Object>();
- mClassLoader = loader;
- }
-
- /**
- * Constructs a new, empty Bundle sized to hold the given number of
- * elements. The Bundle will grow as needed.
- *
- * @param capacity the initial capacity of the Bundle
- */
- public Bundle(int capacity) {
- mMap = new HashMap<String, Object>(capacity);
- mClassLoader = getClass().getClassLoader();
- }
-
- /**
- * Constructs a Bundle containing a copy of the mappings from the given
- * Bundle.
- *
- * @param b a Bundle to be copied.
- */
- public Bundle(Bundle b) {
- if (b.mParcelledData != null) {
- mParcelledData = Parcel.obtain();
- mParcelledData.appendFrom(b.mParcelledData, 0, b.mParcelledData.dataSize());
- mParcelledData.setDataPosition(0);
- } else {
- mParcelledData = null;
- }
-
- if (b.mMap != null) {
- mMap = new HashMap<String, Object>(b.mMap);
- } else {
- mMap = null;
- }
-
- mHasFds = b.mHasFds;
- mFdsKnown = b.mFdsKnown;
- mClassLoader = b.mClassLoader;
- }
-
- /**
- * Changes the ClassLoader this Bundle uses when instantiating objects.
- *
- * @param loader An explicit ClassLoader to use when instantiating objects
- * inside of the Bundle.
- */
- public void setClassLoader(ClassLoader loader) {
- mClassLoader = loader;
- }
-
- /**
- * Clones the current Bundle. The internal map is cloned, but the keys and
- * values to which it refers are copied by reference.
- */
- @Override
- public Object clone() {
- return new Bundle(this);
- }
-
- /**
- * If the underlying data are stored as a Parcel, unparcel them
- * using the currently assigned class loader.
- */
- /* package */ synchronized void unparcel() {
- if (mParcelledData == null) {
- return;
- }
-
- mParcelledData.setDataPosition(0);
- Bundle b = mParcelledData.readBundleUnpacked(mClassLoader);
- mMap = b.mMap;
-
- mHasFds = mParcelledData.hasFileDescriptors();
- mFdsKnown = true;
-
- mParcelledData.recycle();
- mParcelledData = null;
- }
-
- /**
- * Returns the number of mappings contained in this Bundle.
- *
- * @return the number of mappings as an int.
- */
- public int size() {
- unparcel();
- return mMap.size();
- }
-
- /**
- * Returns true if the mapping of this Bundle is empty, false otherwise.
- */
- public boolean isEmpty() {
- unparcel();
- return mMap.isEmpty();
- }
-
- /**
- * Removes all elements from the mapping of this Bundle.
- */
- public void clear() {
- unparcel();
- mMap.clear();
- mHasFds = false;
- mFdsKnown = true;
- }
-
- /**
- * Returns true if the given key is contained in the mapping
- * of this Bundle.
- *
- * @param key a String key
- * @return true if the key is part of the mapping, false otherwise
- */
- public boolean containsKey(String key) {
- unparcel();
- return mMap.containsKey(key);
- }
-
- /**
- * Returns the entry with the given key as an object.
- *
- * @param key a String key
- * @return an Object, or null
- */
- public Object get(String key) {
- unparcel();
- return mMap.get(key);
- }
-
- /**
- * Removes any entry with the given key from the mapping of this Bundle.
- *
- * @param key a String key
- */
- public void remove(String key) {
- unparcel();
- mMap.remove(key);
- }
-
- /**
- * Inserts all mappings from the given Bundle into this Bundle.
- *
- * @param map a Bundle
- */
- public void putAll(Bundle map) {
- unparcel();
- map.unparcel();
- mMap.putAll(map.mMap);
-
- // fd state is now known if and only if both bundles already knew
- mHasFds |= map.mHasFds;
- mFdsKnown = mFdsKnown && map.mFdsKnown;
- }
-
- /**
- * Returns a Set containing the Strings used as keys in this Bundle.
- *
- * @return a Set of String keys
- */
- public Set<String> keySet() {
- unparcel();
- return mMap.keySet();
- }
-
- /**
- * Reports whether the bundle contains any parcelled file descriptors.
- */
- public boolean hasFileDescriptors() {
- if (!mFdsKnown) {
- boolean fdFound = false; // keep going until we find one or run out of data
-
- if (mParcelledData != null) {
- if (mParcelledData.hasFileDescriptors()) {
- fdFound = true;
- }
- } else {
- // It's been unparcelled, so we need to walk the map
- Iterator<Map.Entry<String, Object>> iter = mMap.entrySet().iterator();
- while (!fdFound && iter.hasNext()) {
- Object obj = iter.next().getValue();
- if (obj instanceof Parcelable) {
- if ((((Parcelable)obj).describeContents()
- & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0) {
- fdFound = true;
- break;
- }
- } else if (obj instanceof Parcelable[]) {
- Parcelable[] array = (Parcelable[]) obj;
- for (int n = array.length - 1; n >= 0; n--) {
- if ((array[n].describeContents()
- & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0) {
- fdFound = true;
- break;
- }
- }
- } else if (obj instanceof SparseArray) {
- SparseArray<? extends Parcelable> array =
- (SparseArray<? extends Parcelable>) obj;
- for (int n = array.size() - 1; n >= 0; n--) {
- if ((array.get(n).describeContents()
- & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0) {
- fdFound = true;
- break;
- }
- }
- } else if (obj instanceof ArrayList) {
- ArrayList array = (ArrayList) obj;
- // an ArrayList here might contain either Strings or
- // Parcelables; only look inside for Parcelables
- if ((array.size() > 0)
- && (array.get(0) instanceof Parcelable)) {
- for (int n = array.size() - 1; n >= 0; n--) {
- Parcelable p = (Parcelable) array.get(n);
- if (p != null && ((p.describeContents()
- & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0)) {
- fdFound = true;
- break;
- }
- }
- }
- }
- }
- }
-
- mHasFds = fdFound;
- mFdsKnown = true;
- }
- return mHasFds;
- }
-
- /**
- * Inserts a Boolean value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value a Boolean, or null
- */
- public void putBoolean(String key, boolean value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a byte value into the mapping of this Bundle, replacing
- * any existing value for the given key.
- *
- * @param key a String, or null
- * @param value a byte
- */
- public void putByte(String key, byte value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a char value into the mapping of this Bundle, replacing
- * any existing value for the given key.
- *
- * @param key a String, or null
- * @param value a char, or null
- */
- public void putChar(String key, char value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a short value into the mapping of this Bundle, replacing
- * any existing value for the given key.
- *
- * @param key a String, or null
- * @param value a short
- */
- public void putShort(String key, short value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts an int value into the mapping of this Bundle, replacing
- * any existing value for the given key.
- *
- * @param key a String, or null
- * @param value an int, or null
- */
- public void putInt(String key, int value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a long value into the mapping of this Bundle, replacing
- * any existing value for the given key.
- *
- * @param key a String, or null
- * @param value a long
- */
- public void putLong(String key, long value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a float value into the mapping of this Bundle, replacing
- * any existing value for the given key.
- *
- * @param key a String, or null
- * @param value a float
- */
- public void putFloat(String key, float value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a double value into the mapping of this Bundle, replacing
- * any existing value for the given key.
- *
- * @param key a String, or null
- * @param value a double
- */
- public void putDouble(String key, double value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a String value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value a String, or null
- */
- public void putString(String key, String value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a CharSequence value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value a CharSequence, or null
- */
- public void putCharSequence(String key, CharSequence value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a Parcelable value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value a Parcelable object, or null
- */
- public void putParcelable(String key, Parcelable value) {
- unparcel();
- mMap.put(key, value);
- mFdsKnown = false;
- }
-
- /**
- * Inserts an array of Parcelable values into the mapping of this Bundle,
- * replacing any existing value for the given key. Either key or value may
- * be null.
- *
- * @param key a String, or null
- * @param value an array of Parcelable objects, or null
- */
- public void putParcelableArray(String key, Parcelable[] value) {
- unparcel();
- mMap.put(key, value);
- mFdsKnown = false;
- }
-
- /**
- * Inserts a List of Parcelable values into the mapping of this Bundle,
- * replacing any existing value for the given key. Either key or value may
- * be null.
- *
- * @param key a String, or null
- * @param value an ArrayList of Parcelable objects, or null
- */
- public void putParcelableArrayList(String key,
- ArrayList<? extends Parcelable> value) {
- unparcel();
- mMap.put(key, value);
- mFdsKnown = false;
- }
-
- /**
- * Inserts a SparceArray of Parcelable values into the mapping of this
- * Bundle, replacing any existing value for the given key. Either key
- * or value may be null.
- *
- * @param key a String, or null
- * @param value a SparseArray of Parcelable objects, or null
- */
- public void putSparseParcelableArray(String key,
- SparseArray<? extends Parcelable> value) {
- unparcel();
- mMap.put(key, value);
- mFdsKnown = false;
- }
-
- /**
- * Inserts an ArrayList<Integer> value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value an ArrayList<Integer> object, or null
- */
- public void putIntegerArrayList(String key, ArrayList<Integer> value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts an ArrayList<String> value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value an ArrayList<String> object, or null
- */
- public void putStringArrayList(String key, ArrayList<String> value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a Serializable value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value a Serializable object, or null
- */
- public void putSerializable(String key, Serializable value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a boolean array value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value a boolean array object, or null
- */
- public void putBooleanArray(String key, boolean[] value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a byte array value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value a byte array object, or null
- */
- public void putByteArray(String key, byte[] value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a short array value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value a short array object, or null
- */
- public void putShortArray(String key, short[] value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a char array value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value a char array object, or null
- */
- public void putCharArray(String key, char[] value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts an int array value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value an int array object, or null
- */
- public void putIntArray(String key, int[] value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a long array value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value a long array object, or null
- */
- public void putLongArray(String key, long[] value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a float array value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value a float array object, or null
- */
- public void putFloatArray(String key, float[] value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a double array value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value a double array object, or null
- */
- public void putDoubleArray(String key, double[] value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a String array value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value a String array object, or null
- */
- public void putStringArray(String key, String[] value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts a Bundle value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value a Bundle object, or null
- */
- public void putBundle(String key, Bundle value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Inserts an IBinder value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value an IBinder object, or null
- *
- * @deprecated
- * @hide
- */
- @Deprecated
- public void putIBinder(String key, IBinder value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
- * Returns the value associated with the given key, or false if
- * no mapping of the desired type exists for the given key.
- *
- * @param key a String
- * @return a boolean value
- */
- public boolean getBoolean(String key) {
- unparcel();
- return getBoolean(key, false);
- }
-
- // Log a message if the value was non-null but not of the expected type
- private void typeWarning(String key, Object value, String className,
- Object defaultValue, ClassCastException e) {
- StringBuilder sb = new StringBuilder();
- sb.append("Key ");
- sb.append(key);
- sb.append(" expected ");
- sb.append(className);
- sb.append(" but value was a ");
- sb.append(value.getClass().getName());
- sb.append(". The default value ");
- sb.append(defaultValue);
- sb.append(" was returned.");
- Log.w(LOG_TAG, sb.toString());
- Log.w(LOG_TAG, "Attempt to cast generated internal exception:", e);
- }
-
- private void typeWarning(String key, Object value, String className,
- ClassCastException e) {
- typeWarning(key, value, className, "<null>", e);
- }
-
- /**
- * Returns the value associated with the given key, or defaultValue if
- * no mapping of the desired type exists for the given key.
- *
- * @param key a String
- * @return a boolean value
- */
- public boolean getBoolean(String key, boolean defaultValue) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return defaultValue;
- }
- try {
- return (Boolean) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "Boolean", defaultValue, e);
- return defaultValue;
- }
- }
-
- /**
- * Returns the value associated with the given key, or (byte) 0 if
- * no mapping of the desired type exists for the given key.
- *
- * @param key a String
- * @return a byte value
- */
- public byte getByte(String key) {
- unparcel();
- return getByte(key, (byte) 0);
- }
-
- /**
- * Returns the value associated with the given key, or defaultValue if
- * no mapping of the desired type exists for the given key.
- *
- * @param key a String
- * @return a byte value
- */
- public Byte getByte(String key, byte defaultValue) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return defaultValue;
- }
- try {
- return (Byte) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "Byte", defaultValue, e);
- return defaultValue;
- }
- }
-
- /**
- * Returns the value associated with the given key, or false if
- * no mapping of the desired type exists for the given key.
- *
- * @param key a String
- * @return a char value
- */
- public char getChar(String key) {
- unparcel();
- return getChar(key, (char) 0);
- }
-
- /**
- * Returns the value associated with the given key, or (char) 0 if
- * no mapping of the desired type exists for the given key.
- *
- * @param key a String
- * @return a char value
- */
- public char getChar(String key, char defaultValue) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return defaultValue;
- }
- try {
- return (Character) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "Character", defaultValue, e);
- return defaultValue;
- }
- }
-
- /**
- * Returns the value associated with the given key, or (short) 0 if
- * no mapping of the desired type exists for the given key.
- *
- * @param key a String
- * @return a short value
- */
- public short getShort(String key) {
- unparcel();
- return getShort(key, (short) 0);
- }
-
- /**
- * Returns the value associated with the given key, or defaultValue if
- * no mapping of the desired type exists for the given key.
- *
- * @param key a String
- * @return a short value
- */
- public short getShort(String key, short defaultValue) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return defaultValue;
- }
- try {
- return (Short) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "Short", defaultValue, e);
- return defaultValue;
- }
- }
-
- /**
- * Returns the value associated with the given key, or 0 if
- * no mapping of the desired type exists for the given key.
- *
- * @param key a String
- * @return an int value
- */
- public int getInt(String key) {
- unparcel();
- return getInt(key, 0);
- }
-
- /**
- * Returns the value associated with the given key, or defaultValue if
- * no mapping of the desired type exists for the given key.
- *
- * @param key a String
- * @return an int value
- */
- public int getInt(String key, int defaultValue) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return defaultValue;
- }
- try {
- return (Integer) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "Integer", defaultValue, e);
- return defaultValue;
- }
- }
-
- /**
- * Returns the value associated with the given key, or 0L if
- * no mapping of the desired type exists for the given key.
- *
- * @param key a String
- * @return a long value
- */
- public long getLong(String key) {
- unparcel();
- return getLong(key, 0L);
- }
-
- /**
- * Returns the value associated with the given key, or defaultValue if
- * no mapping of the desired type exists for the given key.
- *
- * @param key a String
- * @return a long value
- */
- public long getLong(String key, long defaultValue) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return defaultValue;
- }
- try {
- return (Long) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "Long", defaultValue, e);
- return defaultValue;
- }
- }
-
- /**
- * Returns the value associated with the given key, or 0.0f if
- * no mapping of the desired type exists for the given key.
- *
- * @param key a String
- * @return a float value
- */
- public float getFloat(String key) {
- unparcel();
- return getFloat(key, 0.0f);
- }
-
- /**
- * Returns the value associated with the given key, or defaultValue if
- * no mapping of the desired type exists for the given key.
- *
- * @param key a String
- * @return a float value
- */
- public float getFloat(String key, float defaultValue) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return defaultValue;
- }
- try {
- return (Float) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "Float", defaultValue, e);
- return defaultValue;
- }
- }
-
- /**
- * Returns the value associated with the given key, or 0.0 if
- * no mapping of the desired type exists for the given key.
- *
- * @param key a String
- * @return a double value
- */
- public double getDouble(String key) {
- unparcel();
- return getDouble(key, 0.0);
- }
-
- /**
- * Returns the value associated with the given key, or defaultValue if
- * no mapping of the desired type exists for the given key.
- *
- * @param key a String
- * @return a double value
- */
- public double getDouble(String key, double defaultValue) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return defaultValue;
- }
- try {
- return (Double) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "Double", defaultValue, e);
- return defaultValue;
- }
- }
-
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return a String value, or null
- */
- public String getString(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (String) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "String", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return a CharSequence value, or null
- */
- public CharSequence getCharSequence(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (CharSequence) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "CharSequence", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return a Bundle value, or null
- */
- public Bundle getBundle(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (Bundle) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "Bundle", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return a Parcelable value, or null
- */
- public <T extends Parcelable> T getParcelable(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (T) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "Parcelable", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return a Parcelable[] value, or null
- */
- public Parcelable[] getParcelableArray(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (Parcelable[]) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "Parcelable[]", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return an ArrayList<T> value, or null
- */
- public <T extends Parcelable> ArrayList<T> getParcelableArrayList(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (ArrayList<T>) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "ArrayList", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- *
- * @return a SparseArray of T values, or null
- */
- public <T extends Parcelable> SparseArray<T> getSparseParcelableArray(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (SparseArray<T>) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "SparseArray", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return a Serializable value, or null
- */
- public Serializable getSerializable(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (Serializable) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "Serializable", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return an ArrayList<String> value, or null
- */
- public ArrayList<Integer> getIntegerArrayList(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (ArrayList<Integer>) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "ArrayList<Integer>", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return an ArrayList<String> value, or null
- */
- public ArrayList<String> getStringArrayList(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (ArrayList<String>) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "ArrayList<String>", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return a boolean[] value, or null
- */
- public boolean[] getBooleanArray(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (boolean[]) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "byte[]", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return a byte[] value, or null
- */
- public byte[] getByteArray(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (byte[]) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "byte[]", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return a short[] value, or null
- */
- public short[] getShortArray(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (short[]) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "short[]", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return a char[] value, or null
- */
- public char[] getCharArray(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (char[]) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "char[]", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return an int[] value, or null
- */
- public int[] getIntArray(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (int[]) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "int[]", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return a long[] value, or null
- */
- public long[] getLongArray(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (long[]) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "long[]", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return a float[] value, or null
- */
- public float[] getFloatArray(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (float[]) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "float[]", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return a double[] value, or null
- */
- public double[] getDoubleArray(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (double[]) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "double[]", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return a String[] value, or null
- */
- public String[] getStringArray(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (String[]) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "String[]", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
- * @return an IBinder value, or null
- *
- * @deprecated
- * @hide
- */
- @Deprecated
- public IBinder getIBinder(String key) {
- unparcel();
- Object o = mMap.get(key);
- if (o == null) {
- return null;
- }
- try {
- return (IBinder) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "IBinder", e);
- return null;
- }
- }
-
- public static final Parcelable.Creator<Bundle> CREATOR =
- new Parcelable.Creator<Bundle>() {
- public Bundle createFromParcel(Parcel in) {
- return in.readBundle();
- }
-
- public Bundle[] newArray(int size) {
- return new Bundle[size];
- }
- };
-
- /**
- * Report the nature of this Parcelable's contents
- */
- public int describeContents() {
- int mask = 0;
- if (hasFileDescriptors()) {
- mask |= Parcelable.CONTENTS_FILE_DESCRIPTOR;
- }
- return mask;
- }
-
- /**
- * Writes the Bundle contents to a Parcel, typically in order for
- * it to be passed through an IBinder connection.
- * @param parcel The parcel to copy this bundle to.
- */
- public void writeToParcel(Parcel parcel, int flags) {
- parcel.writeBundle(this);
- }
-
- /**
- * Reads the Parcel contents into this Bundle, typically in order for
- * it to be passed through an IBinder connection.
- * @param parcel The parcel to overwrite this bundle from.
- */
- public void readFromParcel(Parcel parcel) {
- mParcelledData = parcel;
- mHasFds = mParcelledData.hasFileDescriptors();
- mFdsKnown = true;
- }
-
- @Override
- public synchronized String toString() {
- if (mParcelledData != null) {
- return "Bundle[mParcelledData.dataSize=" +
- mParcelledData.dataSize() + "]";
- }
- return "Bundle[" + mMap.toString() + "]";
- }
-}
diff --git a/core/java/android/os/ConditionVariable.java b/core/java/android/os/ConditionVariable.java
deleted file mode 100644
index 95a9259..0000000
--- a/core/java/android/os/ConditionVariable.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * 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 android.os;
-
-/**
- * Class that implements the condition variable locking paradigm.
- *
- * <p>
- * This differs from the built-in java.lang.Object wait() and notify()
- * in that this class contains the condition to wait on itself. That means
- * open(), close() and block() are sticky. If open() is called before block(),
- * block() will not block, and instead return immediately.
- *
- * <p>
- * This class uses itself is at the object to wait on, so if you wait()
- * or notify() on a ConditionVariable, the results are undefined.
- */
-public class ConditionVariable
-{
- private volatile boolean mCondition;
-
- /**
- * Create the ConditionVariable in the default closed state.
- */
- public ConditionVariable()
- {
- mCondition = false;
- }
-
- /**
- * Create the ConditionVariable with the given state.
- *
- * <p>
- * Pass true for opened and false for closed.
- */
- public ConditionVariable(boolean state)
- {
- mCondition = state;
- }
-
- /**
- * Open the condition, and release all threads that are blocked.
- *
- * <p>
- * Any threads that later approach block() will not block unless close()
- * is called.
- */
- public void open()
- {
- synchronized (this) {
- boolean old = mCondition;
- mCondition = true;
- if (!old) {
- this.notifyAll();
- }
- }
- }
-
- /**
- * Reset the condition to the closed state.
- *
- * <p>
- * Any threads that call block() will block until someone calls open.
- */
- public void close()
- {
- synchronized (this) {
- mCondition = false;
- }
- }
-
- /**
- * Block the current thread until the condition is opened.
- *
- * <p>
- * If the condition is already opened, return immediately.
- */
- public void block()
- {
- synchronized (this) {
- while (!mCondition) {
- try {
- this.wait();
- }
- catch (InterruptedException e) {
- }
- }
- }
- }
-
- /**
- * Block the current thread until the condition is opened or until
- * timeout milliseconds have passed.
- *
- * <p>
- * If the condition is already opened, return immediately.
- *
- * @param timeout the minimum time to wait in milliseconds.
- *
- * @return true if the condition was opened, false if the call returns
- * because of the timeout.
- */
- public boolean block(long timeout)
- {
- // Object.wait(0) means wait forever, to mimic this, we just
- // call the other block() method in that case. It simplifies
- // this code for the common case.
- if (timeout != 0) {
- synchronized (this) {
- long now = System.currentTimeMillis();
- long end = now + timeout;
- while (!mCondition && now < end) {
- try {
- this.wait(end-now);
- }
- catch (InterruptedException e) {
- }
- now = System.currentTimeMillis();
- }
- return mCondition;
- }
- } else {
- this.block();
- return true;
- }
- }
-}
diff --git a/core/java/android/os/CountDownTimer.java b/core/java/android/os/CountDownTimer.java
deleted file mode 100644
index 0c5c615..0000000
--- a/core/java/android/os/CountDownTimer.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2008 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 android.os;
-
-import android.util.Log;
-
-/**
- * Schedule a countdown until a time in the future, with
- * regular notifications on intervals along the way.
- *
- * Example of showing a 30 second countdown in a text field:
- *
- * <pre class="prettyprint">
- * new CountdownTimer(30000, 1000) {
- *
- * public void onTick(long millisUntilFinished) {
- * mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
- * }
- *
- * public void onFinish() {
- * mTextField.setText("done!");
- * }
- * }.start();
- * </pre>
- *
- * The calls to {@link #onTick(long)} are synchronized to this object so that
- * one call to {@link #onTick(long)} won't ever occur before the previous
- * callback is complete. This is only relevant when the implementation of
- * {@link #onTick(long)} takes an amount of time to execute that is significant
- * compared to the countdown interval.
- */
-public abstract class CountDownTimer {
-
- /**
- * Millis since epoch when alarm should stop.
- */
- private final long mMillisInFuture;
-
- /**
- * The interval in millis that the user receives callbacks
- */
- private final long mCountdownInterval;
-
- private long mStopTimeInFuture;
-
- /**
- * @param millisInFuture The number of millis in the future from the call
- * to {@link #start()} until the countdown is done and {@link #onFinish()}
- * is called.
- * @param countDownInterval The interval along the way to receive
- * {@link #onTick(long)} callbacks.
- */
- public CountDownTimer(long millisInFuture, long countDownInterval) {
- mMillisInFuture = millisInFuture;
- mCountdownInterval = countDownInterval;
- }
-
- /**
- * Cancel the countdown.
- */
- public final void cancel() {
- mHandler.removeMessages(MSG);
- }
-
- /**
- * Start the countdown.
- */
- public synchronized final CountDownTimer start() {
- if (mMillisInFuture <= 0) {
- onFinish();
- return this;
- }
- mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;
- mHandler.sendMessage(mHandler.obtainMessage(MSG));
- return this;
- }
-
-
- /**
- * Callback fired on regular interval.
- * @param millisUntilFinished The amount of time until finished.
- */
- public abstract void onTick(long millisUntilFinished);
-
- /**
- * Callback fired when the time is up.
- */
- public abstract void onFinish();
-
-
- private static final int MSG = 1;
-
-
- // handles counting down
- private Handler mHandler = new Handler() {
-
- @Override
- public void handleMessage(Message msg) {
-
- synchronized (CountDownTimer.this) {
- final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();
-
- if (millisLeft <= 0) {
- onFinish();
- } else if (millisLeft < mCountdownInterval) {
- // no tick, just delay until done
- sendMessageDelayed(obtainMessage(MSG), millisLeft);
- } else {
- long lastTickStart = SystemClock.elapsedRealtime();
- onTick(millisLeft);
-
- // take into account user's onTick taking time to execute
- long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();
-
- // special case: user's onTick took more than interval to
- // complete, skip to next interval
- while (delay < 0) delay += mCountdownInterval;
-
- sendMessageDelayed(obtainMessage(MSG), delay);
- }
- }
- }
- };
-}
diff --git a/core/java/android/os/DeadObjectException.java b/core/java/android/os/DeadObjectException.java
deleted file mode 100644
index 94c5387..0000000
--- a/core/java/android/os/DeadObjectException.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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 android.os;
-import android.os.RemoteException;
-
-/**
- * The object you are calling has died, because its hosting process
- * no longer exists.
- */
-public class DeadObjectException extends RemoteException {
- public DeadObjectException() {
- super();
- }
-}
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
deleted file mode 100644
index 950bb09..0000000
--- a/core/java/android/os/Debug.java
+++ /dev/null
@@ -1,717 +0,0 @@
-/*
- * Copyright (C) 2007 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 android.os;
-
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-
-import org.apache.harmony.dalvik.ddmc.Chunk;
-import org.apache.harmony.dalvik.ddmc.ChunkHandler;
-import org.apache.harmony.dalvik.ddmc.DdmServer;
-
-import dalvik.bytecode.Opcodes;
-import dalvik.system.VMDebug;
-
-
-/**
- * Provides various debugging functions for Android applications, including
- * tracing and allocation counts.
- * <p><strong>Logging Trace Files</strong></p>
- * <p>Debug can create log files that give details about an application, such as
- * a call stack and start/stop times for any running methods. See <a
-href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Log Viewer</a> for
- * information about reading trace files. To start logging trace files, call one
- * of the startMethodTracing() methods. To stop tracing, call
- * {@link #stopMethodTracing()}.
- */
-public final class Debug
-{
- /**
- * Flags for startMethodTracing(). These can be ORed together.
- *
- * TRACE_COUNT_ALLOCS adds the results from startAllocCounting to the
- * trace key file.
- */
- public static final int TRACE_COUNT_ALLOCS = VMDebug.TRACE_COUNT_ALLOCS;
-
- /**
- * Flags for printLoadedClasses(). Default behavior is to only show
- * the class name.
- */
- public static final int SHOW_FULL_DETAIL = 1;
- public static final int SHOW_CLASSLOADER = (1 << 1);
- public static final int SHOW_INITIALIZED = (1 << 2);
-
- // set/cleared by waitForDebugger()
- private static volatile boolean mWaiting = false;
-
- private Debug() {}
-
- /*
- * How long to wait for the debugger to finish sending requests. I've
- * seen this hit 800msec on the device while waiting for a response
- * to travel over USB and get processed, so we take that and add
- * half a second.
- */
- private static final int MIN_DEBUGGER_IDLE = 1300; // msec
-
- /* how long to sleep when polling for activity */
- private static final int SPIN_DELAY = 200; // msec
-
- /**
- * Default trace file path and file
- */
- private static final String DEFAULT_TRACE_PATH_PREFIX = "/sdcard/";
- private static final String DEFAULT_TRACE_BODY = "dmtrace";
- private static final String DEFAULT_TRACE_EXTENSION = ".trace";
- private static final String DEFAULT_TRACE_FILE_PATH =
- DEFAULT_TRACE_PATH_PREFIX + DEFAULT_TRACE_BODY
- + DEFAULT_TRACE_EXTENSION;
-
-
- /**
- * This class is used to retrieved various statistics about the memory mappings for this
- * process. The returns info broken down by dalvik, native, and other. All results are in kB.
- */
- public static class MemoryInfo {
- /** The proportional set size for dalvik. */
- public int dalvikPss;
- /** The private dirty pages used by dalvik. */
- public int dalvikPrivateDirty;
- /** The shared dirty pages used by dalvik. */
- public int dalvikSharedDirty;
-
- /** The proportional set size for the native heap. */
- public int nativePss;
- /** The private dirty pages used by the native heap. */
- public int nativePrivateDirty;
- /** The shared dirty pages used by the native heap. */
- public int nativeSharedDirty;
-
- /** The proportional set size for everything else. */
- public int otherPss;
- /** The private dirty pages used by everything else. */
- public int otherPrivateDirty;
- /** The shared dirty pages used by everything else. */
- public int otherSharedDirty;
- }
-
-
- /**
- * Wait until a debugger attaches. As soon as the debugger attaches,
- * this returns, so you will need to place a breakpoint after the
- * waitForDebugger() call if you want to start tracing immediately.
- */
- public static void waitForDebugger() {
- if (!VMDebug.isDebuggingEnabled()) {
- //System.out.println("debugging not enabled, not waiting");
- return;
- }
- if (isDebuggerConnected())
- return;
-
- // if DDMS is listening, inform them of our plight
- System.out.println("Sending WAIT chunk");
- byte[] data = new byte[] { 0 }; // 0 == "waiting for debugger"
- Chunk waitChunk = new Chunk(ChunkHandler.type("WAIT"), data, 0, 1);
- DdmServer.sendChunk(waitChunk);
-
- mWaiting = true;
- while (!isDebuggerConnected()) {
- try { Thread.sleep(SPIN_DELAY); }
- catch (InterruptedException ie) {}
- }
- mWaiting = false;
-
- System.out.println("Debugger has connected");
-
- /*
- * There is no "ready to go" signal from the debugger, and we're
- * not allowed to suspend ourselves -- the debugger expects us to
- * be running happily, and gets confused if we aren't. We need to
- * allow the debugger a chance to set breakpoints before we start
- * running again.
- *
- * Sit and spin until the debugger has been idle for a short while.
- */
- while (true) {
- long delta = VMDebug.lastDebuggerActivity();
- if (delta < 0) {
- System.out.println("debugger detached?");
- break;
- }
-
- if (delta < MIN_DEBUGGER_IDLE) {
- System.out.println("waiting for debugger to settle...");
- try { Thread.sleep(SPIN_DELAY); }
- catch (InterruptedException ie) {}
- } else {
- System.out.println("debugger has settled (" + delta + ")");
- break;
- }
- }
- }
-
- /**
- * Returns "true" if one or more threads is waiting for a debugger
- * to attach.
- */
- public static boolean waitingForDebugger() {
- return mWaiting;
- }
-
- /**
- * Determine if a debugger is currently attached.
- */
- public static boolean isDebuggerConnected() {
- return VMDebug.isDebuggerConnected();
- }
-
- /**
- * Change the JDWP port.
- *
- * @deprecated no longer needed or useful
- */
- @Deprecated
- public static void changeDebugPort(int port) {}
-
- /**
- * This is the pathname to the sysfs file that enables and disables
- * tracing on the qemu emulator.
- */
- private static final String SYSFS_QEMU_TRACE_STATE = "/sys/qemu_trace/state";
-
- /**
- * Enable qemu tracing. For this to work requires running everything inside
- * the qemu emulator; otherwise, this method will have no effect. The trace
- * file is specified on the command line when the emulator is started. For
- * example, the following command line <br />
- * <code>emulator -trace foo</code><br />
- * will start running the emulator and create a trace file named "foo". This
- * method simply enables writing the trace records to the trace file.
- *
- * <p>
- * The main differences between this and {@link #startMethodTracing()} are
- * that tracing in the qemu emulator traces every cpu instruction of every
- * process, including kernel code, so we have more complete information,
- * including all context switches. We can also get more detailed information
- * such as cache misses. The sequence of calls is determined by
- * post-processing the instruction trace. The qemu tracing is also done
- * without modifying the application or perturbing the timing of calls
- * because no instrumentation is added to the application being traced.
- * </p>
- *
- * <p>
- * One limitation of using this method compared to using
- * {@link #startMethodTracing()} on the real device is that the emulator
- * does not model all of the real hardware effects such as memory and
- * bus contention. The emulator also has a simple cache model and cannot
- * capture all the complexities of a real cache.
- * </p>
- */
- public static void startNativeTracing() {
- // Open the sysfs file for writing and write "1" to it.
- PrintWriter outStream = null;
- try {
- FileOutputStream fos = new FileOutputStream(SYSFS_QEMU_TRACE_STATE);
- outStream = new PrintWriter(new OutputStreamWriter(fos));
- outStream.println("1");
- } catch (Exception e) {
- } finally {
- if (outStream != null)
- outStream.close();
- }
-
- VMDebug.startEmulatorTracing();
- }
-
- /**
- * Stop qemu tracing. See {@link #startNativeTracing()} to start tracing.
- *
- * <p>Tracing can be started and stopped as many times as desired. When
- * the qemu emulator itself is stopped then the buffered trace records
- * are flushed and written to the trace file. In fact, it is not necessary
- * to call this method at all; simply killing qemu is sufficient. But
- * starting and stopping a trace is useful for examining a specific
- * region of code.</p>
- */
- public static void stopNativeTracing() {
- VMDebug.stopEmulatorTracing();
-
- // Open the sysfs file for writing and write "0" to it.
- PrintWriter outStream = null;
- try {
- FileOutputStream fos = new FileOutputStream(SYSFS_QEMU_TRACE_STATE);
- outStream = new PrintWriter(new OutputStreamWriter(fos));
- outStream.println("0");
- } catch (Exception e) {
- // We could print an error message here but we probably want
- // to quietly ignore errors if we are not running in the emulator.
- } finally {
- if (outStream != null)
- outStream.close();
- }
- }
-
- /**
- * Enable "emulator traces", in which information about the current
- * method is made available to the "emulator -trace" feature. There
- * is no corresponding "disable" call -- this is intended for use by
- * the framework when tracing should be turned on and left that way, so
- * that traces captured with F9/F10 will include the necessary data.
- *
- * This puts the VM into "profile" mode, which has performance
- * consequences.
- *
- * To temporarily enable tracing, use {@link #startNativeTracing()}.
- */
- public static void enableEmulatorTraceOutput() {
- VMDebug.startEmulatorTracing();
- }
-
- /**
- * Start method tracing with default log name and buffer size. See <a
-href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Log Viewer</a> for
- * information about reading these files. Call stopMethodTracing() to stop
- * tracing.
- */
- public static void startMethodTracing() {
- VMDebug.startMethodTracing(DEFAULT_TRACE_FILE_PATH, 0, 0);
- }
-
- /**
- * Start method tracing, specifying the trace log file name. The trace
- * file will be put under "/sdcard" unless an absolute path is given.
- * See <a
- href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Log Viewer</a> for
- * information about reading trace files.
- *
- * @param traceName Name for the trace log file to create.
- * If no name argument is given, this value defaults to "/sdcard/dmtrace.trace".
- * If the files already exist, they will be truncated.
- * If the trace file given does not end in ".trace", it will be appended for you.
- */
- public static void startMethodTracing(String traceName) {
- startMethodTracing(traceName, 0, 0);
- }
-
- /**
- * Start method tracing, specifying the trace log file name and the
- * buffer size. The trace files will be put under "/sdcard" unless an
- * absolute path is given. See <a
- href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Log Viewer</a> for
- * information about reading trace files.
- * @param traceName Name for the trace log file to create.
- * If no name argument is given, this value defaults to "/sdcard/dmtrace.trace".
- * If the files already exist, they will be truncated.
- * If the trace file given does not end in ".trace", it will be appended for you.
- *
- * @param bufferSize The maximum amount of trace data we gather. If not given, it defaults to 8MB.
- */
- public static void startMethodTracing(String traceName, int bufferSize) {
- startMethodTracing(traceName, bufferSize, 0);
- }
-
- /**
- * Start method tracing, specifying the trace log file name and the
- * buffer size. The trace files will be put under "/sdcard" unless an
- * absolute path is given. See <a
- href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Log Viewer</a> for
- * information about reading trace files.
- *
- * <p>
- * When method tracing is enabled, the VM will run more slowly than
- * usual, so the timings from the trace files should only be considered
- * in relative terms (e.g. was run #1 faster than run #2). The times
- * for native methods will not change, so don't try to use this to
- * compare the performance of interpreted and native implementations of the
- * same method. As an alternative, consider using "native" tracing
- * in the emulator via {@link #startNativeTracing()}.
- * </p>
- *
- * @param traceName Name for the trace log file to create.
- * If no name argument is given, this value defaults to "/sdcard/dmtrace.trace".
- * If the files already exist, they will be truncated.
- * If the trace file given does not end in ".trace", it will be appended for you.
- * @param bufferSize The maximum amount of trace data we gather. If not given, it defaults to 8MB.
- */
- public static void startMethodTracing(String traceName, int bufferSize,
- int flags) {
-
- String pathName = traceName;
- if (pathName.charAt(0) != '/')
- pathName = DEFAULT_TRACE_PATH_PREFIX + pathName;
- if (!pathName.endsWith(DEFAULT_TRACE_EXTENSION))
- pathName = pathName + DEFAULT_TRACE_EXTENSION;
-
- VMDebug.startMethodTracing(pathName, bufferSize, flags);
- }
-
- /**
- * Stop method tracing.
- */
- public static void stopMethodTracing() {
- VMDebug.stopMethodTracing();
- }
-
- /**
- * Get an indication of thread CPU usage. The value returned
- * indicates the amount of time that the current thread has spent
- * executing code or waiting for certain types of I/O.
- *
- * The time is expressed in nanoseconds, and is only meaningful
- * when compared to the result from an earlier call. Note that
- * nanosecond resolution does not imply nanosecond accuracy.
- *
- * On system which don't support this operation, the call returns -1.
- */
- public static long threadCpuTimeNanos() {
- return VMDebug.threadCpuTimeNanos();
- }
-
- /**
- * Count the number and aggregate size of memory allocations between
- * two points.
- *
- * The "start" function resets the counts and enables counting. The
- * "stop" function disables the counting so that the analysis code
- * doesn't cause additional allocations. The "get" function returns
- * the specified value.
- *
- * Counts are kept for the system as a whole and for each thread.
- * The per-thread counts for threads other than the current thread
- * are not cleared by the "reset" or "start" calls.
- */
- public static void startAllocCounting() {
- VMDebug.startAllocCounting();
- }
- public static void stopAllocCounting() {
- VMDebug.stopAllocCounting();
- }
-
- public static int getGlobalAllocCount() {
- return VMDebug.getAllocCount(VMDebug.KIND_GLOBAL_ALLOCATED_OBJECTS);
- }
- public static int getGlobalAllocSize() {
- return VMDebug.getAllocCount(VMDebug.KIND_GLOBAL_ALLOCATED_BYTES);
- }
- public static int getGlobalFreedCount() {
- return VMDebug.getAllocCount(VMDebug.KIND_GLOBAL_FREED_OBJECTS);
- }
- public static int getGlobalFreedSize() {
- return VMDebug.getAllocCount(VMDebug.KIND_GLOBAL_FREED_BYTES);
- }
- public static int getGlobalExternalAllocCount() {
- return VMDebug.getAllocCount(VMDebug.KIND_GLOBAL_EXT_ALLOCATED_OBJECTS);
- }
- public static int getGlobalExternalAllocSize() {
- return VMDebug.getAllocCount(VMDebug.KIND_GLOBAL_EXT_ALLOCATED_BYTES);
- }
- public static int getGlobalExternalFreedCount() {
- return VMDebug.getAllocCount(VMDebug.KIND_GLOBAL_EXT_FREED_OBJECTS);
- }
- public static int getGlobalExternalFreedSize() {
- return VMDebug.getAllocCount(VMDebug.KIND_GLOBAL_EXT_FREED_BYTES);
- }
- public static int getGlobalGcInvocationCount() {
- return VMDebug.getAllocCount(VMDebug.KIND_GLOBAL_GC_INVOCATIONS);
- }
- public static int getThreadAllocCount() {
- return VMDebug.getAllocCount(VMDebug.KIND_THREAD_ALLOCATED_OBJECTS);
- }
- public static int getThreadAllocSize() {
- return VMDebug.getAllocCount(VMDebug.KIND_THREAD_ALLOCATED_BYTES);
- }
- public static int getThreadExternalAllocCount() {
- return VMDebug.getAllocCount(VMDebug.KIND_THREAD_EXT_ALLOCATED_OBJECTS);
- }
- public static int getThreadExternalAllocSize() {
- return VMDebug.getAllocCount(VMDebug.KIND_THREAD_EXT_ALLOCATED_BYTES);
- }
- public static int getThreadGcInvocationCount() {
- return VMDebug.getAllocCount(VMDebug.KIND_THREAD_GC_INVOCATIONS);
- }
-
- public static void resetGlobalAllocCount() {
- VMDebug.resetAllocCount(VMDebug.KIND_GLOBAL_ALLOCATED_OBJECTS);
- }
- public static void resetGlobalAllocSize() {
- VMDebug.resetAllocCount(VMDebug.KIND_GLOBAL_ALLOCATED_BYTES);
- }
- public static void resetGlobalFreedCount() {
- VMDebug.resetAllocCount(VMDebug.KIND_GLOBAL_FREED_OBJECTS);
- }
- public static void resetGlobalFreedSize() {
- VMDebug.resetAllocCount(VMDebug.KIND_GLOBAL_FREED_BYTES);
- }
- public static void resetGlobalExternalAllocCount() {
- VMDebug.resetAllocCount(VMDebug.KIND_GLOBAL_EXT_ALLOCATED_OBJECTS);
- }
- public static void resetGlobalExternalAllocSize() {
- VMDebug.resetAllocCount(VMDebug.KIND_GLOBAL_EXT_ALLOCATED_BYTES);
- }
- public static void resetGlobalExternalFreedCount() {
- VMDebug.resetAllocCount(VMDebug.KIND_GLOBAL_EXT_FREED_OBJECTS);
- }
- public static void resetGlobalExternalFreedSize() {
- VMDebug.resetAllocCount(VMDebug.KIND_GLOBAL_EXT_FREED_BYTES);
- }
- public static void resetGlobalGcInvocationCount() {
- VMDebug.resetAllocCount(VMDebug.KIND_GLOBAL_GC_INVOCATIONS);
- }
- public static void resetThreadAllocCount() {
- VMDebug.resetAllocCount(VMDebug.KIND_THREAD_ALLOCATED_OBJECTS);
- }
- public static void resetThreadAllocSize() {
- VMDebug.resetAllocCount(VMDebug.KIND_THREAD_ALLOCATED_BYTES);
- }
- public static void resetThreadExternalAllocCount() {
- VMDebug.resetAllocCount(VMDebug.KIND_THREAD_EXT_ALLOCATED_OBJECTS);
- }
- public static void resetThreadExternalAllocSize() {
- VMDebug.resetAllocCount(VMDebug.KIND_THREAD_EXT_ALLOCATED_BYTES);
- }
- public static void resetThreadGcInvocationCount() {
- VMDebug.resetAllocCount(VMDebug.KIND_THREAD_GC_INVOCATIONS);
- }
- public static void resetAllCounts() {
- VMDebug.resetAllocCount(VMDebug.KIND_ALL_COUNTS);
- }
-
- /**
- * Returns the size of the native heap.
- * @return The size of the native heap in bytes.
- */
- public static native long getNativeHeapSize();
-
- /**
- * Returns the amount of allocated memory in the native heap.
- * @return The allocated size in bytes.
- */
- public static native long getNativeHeapAllocatedSize();
-
- /**
- * Returns the amount of free memory in the native heap.
- * @return The freed size in bytes.
- */
- public static native long getNativeHeapFreeSize();
-
- /**
- * Retrieves information about this processes memory usages. This information is broken down by
- * how much is in use by dalivk, the native heap, and everything else.
- */
- public static native void getMemoryInfo(MemoryInfo memoryInfo);
-
- /**
- * Establish an object allocation limit in the current thread. Useful
- * for catching regressions in code that is expected to operate
- * without causing any allocations.
- *
- * Pass in the maximum number of allowed allocations. Use -1 to disable
- * the limit. Returns the previous limit.
- *
- * The preferred way to use this is:
- *
- * int prevLimit = -1;
- * try {
- * prevLimit = Debug.setAllocationLimit(0);
- * ... do stuff that's not expected to allocate memory ...
- * } finally {
- * Debug.setAllocationLimit(prevLimit);
- * }
- *
- * This allows limits to be nested. The try/finally ensures that the
- * limit is reset if something fails.
- *
- * Exceeding the limit causes a dalvik.system.AllocationLimitError to
- * be thrown from a memory allocation call. The limit is reset to -1
- * when this happens.
- *
- * The feature may be disabled in the VM configuration. If so, this
- * call has no effect, and always returns -1.
- */
- public static int setAllocationLimit(int limit) {
- return VMDebug.setAllocationLimit(limit);
- }
-
- /**
- * Establish a global object allocation limit. This is similar to
- * {@link #setAllocationLimit(int)} but applies to all threads in
- * the VM. It will coexist peacefully with per-thread limits.
- *
- * [ The value of "limit" is currently restricted to 0 (no allocations
- * allowed) or -1 (no global limit). This may be changed in a future
- * release. ]
- */
- public static int setGlobalAllocationLimit(int limit) {
- if (limit != 0 && limit != -1)
- throw new IllegalArgumentException("limit must be 0 or -1");
- return VMDebug.setGlobalAllocationLimit(limit);
- }
-
- /**
- * Dump a list of all currently loaded class to the log file.
- *
- * @param flags See constants above.
- */
- public static void printLoadedClasses(int flags) {
- VMDebug.printLoadedClasses(flags);
- }
-
- /**
- * Get the number of loaded classes.
- * @return the number of loaded classes.
- */
- public static int getLoadedClassCount() {
- return VMDebug.getLoadedClassCount();
- }
-
- /**
- * Dump "hprof" data to the specified file. This will cause a GC.
- *
- * @param fileName Full pathname of output file (e.g. "/sdcard/dump.hprof").
- * @throws UnsupportedOperationException if the VM was built without
- * HPROF support.
- * @throws IOException if an error occurs while opening or writing files.
- */
- public static void dumpHprofData(String fileName) throws IOException {
- VMDebug.dumpHprofData(fileName);
- }
-
- /**
- * Returns the number of sent transactions from this process.
- * @return The number of sent transactions or -1 if it could not read t.
- */
- public static native int getBinderSentTransactions();
-
- /**
- * Returns the number of received transactions from the binder driver.
- * @return The number of received transactions or -1 if it could not read the stats.
- */
- public static native int getBinderReceivedTransactions();
-
- /**
- * Returns the number of active local Binder objects that exist in the
- * current process.
- */
- public static final native int getBinderLocalObjectCount();
-
- /**
- * Returns the number of references to remote proxy Binder objects that
- * exist in the current process.
- */
- public static final native int getBinderProxyObjectCount();
-
- /**
- * Returns the number of death notification links to Binder objects that
- * exist in the current process.
- */
- public static final native int getBinderDeathObjectCount();
-
- /**
- * API for gathering and querying instruction counts.
- *
- * Example usage:
- * Debug.InstructionCount icount = new Debug.InstructionCount();
- * icount.resetAndStart();
- * [... do lots of stuff ...]
- * if (icount.collect()) {
- * System.out.println("Total instructions executed: "
- * + icount.globalTotal());
- * System.out.println("Method invocations: "
- * + icount.globalMethodInvocations());
- * }
- */
- public static class InstructionCount {
- private static final int NUM_INSTR = 256;
-
- private int[] mCounts;
-
- public InstructionCount() {
- mCounts = new int[NUM_INSTR];
- }
-
- /**
- * Reset counters and ensure counts are running. Counts may
- * have already been running.
- *
- * @return true if counting was started
- */
- public boolean resetAndStart() {
- try {
- VMDebug.startInstructionCounting();
- VMDebug.resetInstructionCount();
- } catch (UnsupportedOperationException uoe) {
- return false;
- }
- return true;
- }
-
- /**
- * Collect instruction counts. May or may not stop the
- * counting process.
- */
- public boolean collect() {
- try {
- VMDebug.stopInstructionCounting();
- VMDebug.getInstructionCount(mCounts);
- } catch (UnsupportedOperationException uoe) {
- return false;
- }
- return true;
- }
-
- /**
- * Return the total number of instructions executed globally (i.e. in
- * all threads).
- */
- public int globalTotal() {
- int count = 0;
- for (int i = 0; i < NUM_INSTR; i++)
- count += mCounts[i];
- return count;
- }
-
- /**
- * Return the total number of method-invocation instructions
- * executed globally.
- */
- public int globalMethodInvocations() {
- int count = 0;
-
- //count += mCounts[Opcodes.OP_EXECUTE_INLINE];
- count += mCounts[Opcodes.OP_INVOKE_VIRTUAL];
- count += mCounts[Opcodes.OP_INVOKE_SUPER];
- count += mCounts[Opcodes.OP_INVOKE_DIRECT];
- count += mCounts[Opcodes.OP_INVOKE_STATIC];
- count += mCounts[Opcodes.OP_INVOKE_INTERFACE];
- count += mCounts[Opcodes.OP_INVOKE_VIRTUAL_RANGE];
- count += mCounts[Opcodes.OP_INVOKE_SUPER_RANGE];
- count += mCounts[Opcodes.OP_INVOKE_DIRECT_RANGE];
- count += mCounts[Opcodes.OP_INVOKE_STATIC_RANGE];
- count += mCounts[Opcodes.OP_INVOKE_INTERFACE_RANGE];
- //count += mCounts[Opcodes.OP_INVOKE_DIRECT_EMPTY];
- count += mCounts[Opcodes.OP_INVOKE_VIRTUAL_QUICK];
- count += mCounts[Opcodes.OP_INVOKE_VIRTUAL_QUICK_RANGE];
- count += mCounts[Opcodes.OP_INVOKE_SUPER_QUICK];
- count += mCounts[Opcodes.OP_INVOKE_SUPER_QUICK_RANGE];
- return count;
- }
- };
-}
diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
deleted file mode 100644
index f761e8e..0000000
--- a/core/java/android/os/Environment.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2007 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 android.os;
-
-import java.io.File;
-
-/**
- * Provides access to environment variables.
- */
-public class Environment {
-
- private static final File ROOT_DIRECTORY
- = getDirectory("ANDROID_ROOT", "/system");
-
- /**
- * Gets the Android root directory.
- */
- public static File getRootDirectory() {
- return ROOT_DIRECTORY;
- }
-
- private static final File DATA_DIRECTORY
- = getDirectory("ANDROID_DATA", "/data");
-
- private static final File EXTERNAL_STORAGE_DIRECTORY
- = getDirectory("EXTERNAL_STORAGE", "/sdcard");
-
- private static final File DOWNLOAD_CACHE_DIRECTORY
- = getDirectory("DOWNLOAD_CACHE", "/cache");
-
- /**
- * Gets the Android data directory.
- */
- public static File getDataDirectory() {
- return DATA_DIRECTORY;
- }
-
- /**
- * Gets the Android external storage directory.
- */
- public static File getExternalStorageDirectory() {
- return EXTERNAL_STORAGE_DIRECTORY;
- }
-
- /**
- * Gets the Android Download/Cache content directory.
- */
- public static File getDownloadCacheDirectory() {
- return DOWNLOAD_CACHE_DIRECTORY;
- }
-
- /**
- * getExternalStorageState() returns MEDIA_REMOVED if the media is not present.
- */
- public static final String MEDIA_REMOVED = "removed";
-
- /**
- * getExternalStorageState() returns MEDIA_UNMOUNTED if the media is present
- * but not mounted.
- */
- public static final String MEDIA_UNMOUNTED = "unmounted";
-
- /**
- * getExternalStorageState() returns MEDIA_CHECKING if the media is present
- * and being disk-checked
- */
- public static final String MEDIA_CHECKING = "checking";
-
- /**
- * getExternalStorageState() returns MEDIA_NOFS if the media is present
- * but is blank or is using an unsupported filesystem
- */
- public static final String MEDIA_NOFS = "nofs";
-
- /**
- * getExternalStorageState() returns MEDIA_MOUNTED if the media is present
- * and mounted at its mount point with read/write access.
- */
- public static final String MEDIA_MOUNTED = "mounted";
-
- /**
- * getExternalStorageState() returns MEDIA_MOUNTED_READ_ONLY if the media is present
- * and mounted at its mount point with read only access.
- */
- public static final String MEDIA_MOUNTED_READ_ONLY = "mounted_ro";
-
- /**
- * getExternalStorageState() returns MEDIA_SHARED if the media is present
- * not mounted, and shared via USB mass storage.
- */
- public static final String MEDIA_SHARED = "shared";
-
- /**
- * getExternalStorageState() returns MEDIA_BAD_REMOVAL if the media was
- * removed before it was unmounted.
- */
- public static final String MEDIA_BAD_REMOVAL = "bad_removal";
-
- /**
- * getExternalStorageState() returns MEDIA_UNMOUNTABLE if the media is present
- * but cannot be mounted. Typically this happens if the file system on the
- * media is corrupted.
- */
- public static final String MEDIA_UNMOUNTABLE = "unmountable";
-
- /**
- * Gets the current state of the external storage device.
- */
- public static String getExternalStorageState() {
- return SystemProperties.get("EXTERNAL_STORAGE_STATE", MEDIA_REMOVED);
- }
-
- static File getDirectory(String variableName, String defaultPath) {
- String path = System.getenv(variableName);
- return path == null ? new File(defaultPath) : new File(path);
- }
-}
diff --git a/core/java/android/os/Exec.java b/core/java/android/os/Exec.java
deleted file mode 100644
index a50d5fe..0000000
--- a/core/java/android/os/Exec.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2007 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 android.os;
-
-import java.io.FileDescriptor;
-
-/**
- * @hide
- * Tools for executing commands. Not for public consumption.
- */
-
-public class Exec
-{
- /**
- * @param cmd The command to execute
- * @param arg0 The first argument to the command, may be null
- * @param arg1 the second argument to the command, may be null
- * @return the file descriptor of the started process.
- *
- */
- public static FileDescriptor createSubprocess(
- String cmd, String arg0, String arg1) {
- return createSubprocess(cmd, arg0, arg1, null);
- }
-
- /**
- * @param cmd The command to execute
- * @param arg0 The first argument to the command, may be null
- * @param arg1 the second argument to the command, may be null
- * @param processId A one-element array to which the process ID of the
- * started process will be written.
- * @return the file descriptor of the started process.
- *
- */
- public static native FileDescriptor createSubprocess(
- String cmd, String arg0, String arg1, int[] processId);
-
- public static native void setPtyWindowSize(FileDescriptor fd,
- int row, int col, int xpixel, int ypixel);
- /**
- * Causes the calling thread to wait for the process associated with the
- * receiver to finish executing.
- *
- * @return The exit value of the Process being waited on
- *
- */
- public static native int waitFor(int processId);
-}
-
diff --git a/core/java/android/os/FileObserver.java b/core/java/android/os/FileObserver.java
deleted file mode 100644
index d9804ea..0000000
--- a/core/java/android/os/FileObserver.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * 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 android.os;
-
-import android.util.Log;
-
-import com.android.internal.os.RuntimeInit;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.HashMap;
-
-public abstract class FileObserver {
- public static final int ACCESS = 0x00000001; /* File was accessed */
- public static final int MODIFY = 0x00000002; /* File was modified */
- public static final int ATTRIB = 0x00000004; /* Metadata changed */
- public static final int CLOSE_WRITE = 0x00000008; /* Writtable file was closed */
- public static final int CLOSE_NOWRITE = 0x00000010; /* Unwrittable file closed */
- public static final int OPEN = 0x00000020; /* File was opened */
- public static final int MOVED_FROM = 0x00000040; /* File was moved from X */
- public static final int MOVED_TO = 0x00000080; /* File was moved to Y */
- public static final int CREATE = 0x00000100; /* Subfile was created */
- public static final int DELETE = 0x00000200; /* Subfile was deleted */
- public static final int DELETE_SELF = 0x00000400; /* Self was deleted */
- public static final int MOVE_SELF = 0x00000800; /* Self was moved */
- public static final int ALL_EVENTS = ACCESS | MODIFY | ATTRIB | CLOSE_WRITE
- | CLOSE_NOWRITE | OPEN | MOVED_FROM | MOVED_TO | DELETE | CREATE
- | DELETE_SELF | MOVE_SELF;
-
- private static final String LOG_TAG = "FileObserver";
-
- private static class ObserverThread extends Thread {
- private HashMap<Integer, WeakReference> m_observers = new HashMap<Integer, WeakReference>();
- private int m_fd;
-
- public ObserverThread() {
- super("FileObserver");
- m_fd = init();
- }
-
- public void run() {
- observe(m_fd);
- }
-
- public int startWatching(String path, int mask, FileObserver observer) {
- int wfd = startWatching(m_fd, path, mask);
-
- Integer i = new Integer(wfd);
- if (wfd >= 0) {
- synchronized (m_observers) {
- m_observers.put(i, new WeakReference(observer));
- }
- }
-
- return i;
- }
-
- public void stopWatching(int descriptor) {
- stopWatching(m_fd, descriptor);
- }
-
- public void onEvent(int wfd, int mask, String path) {
- // look up our observer, fixing up the map if necessary...
- FileObserver observer;
-
- synchronized (m_observers) {
- WeakReference weak = m_observers.get(wfd);
- observer = (FileObserver) weak.get();
- if (observer == null) {
- m_observers.remove(wfd);
- }
- }
-
- // ...then call out to the observer without the sync lock held
- if (observer != null) {
- try {
- observer.onEvent(mask, path);
- } catch (Throwable throwable) {
- Log.e(LOG_TAG, "Unhandled throwable " + throwable.toString() +
- " (returned by observer " + observer + ")", throwable);
- RuntimeInit.crash("FileObserver", throwable);
- }
- }
- }
-
- private native int init();
- private native void observe(int fd);
- private native int startWatching(int fd, String path, int mask);
- private native void stopWatching(int fd, int wfd);
- }
-
- private static ObserverThread s_observerThread;
-
- static {
- s_observerThread = new ObserverThread();
- s_observerThread.start();
- }
-
- // instance
- private String m_path;
- private Integer m_descriptor;
- private int m_mask;
-
- public FileObserver(String path) {
- this(path, ALL_EVENTS);
- }
-
- public FileObserver(String path, int mask) {
- m_path = path;
- m_mask = mask;
- m_descriptor = -1;
- }
-
- protected void finalize() {
- stopWatching();
- }
-
- public void startWatching() {
- if (m_descriptor < 0) {
- m_descriptor = s_observerThread.startWatching(m_path, m_mask, this);
- }
- }
-
- public void stopWatching() {
- if (m_descriptor >= 0) {
- s_observerThread.stopWatching(m_descriptor);
- m_descriptor = -1;
- }
- }
-
- public abstract void onEvent(int event, String path);
-}
diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java
deleted file mode 100644
index 51dfb5b..0000000
--- a/core/java/android/os/FileUtils.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * 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 android.os;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.regex.Pattern;
-
-
-/**
- * Tools for managing files. Not for public consumption.
- * @hide
- */
-public class FileUtils
-{
- public static final int S_IRWXU = 00700;
- public static final int S_IRUSR = 00400;
- public static final int S_IWUSR = 00200;
- public static final int S_IXUSR = 00100;
-
- public static final int S_IRWXG = 00070;
- public static final int S_IRGRP = 00040;
- public static final int S_IWGRP = 00020;
- public static final int S_IXGRP = 00010;
-
- public static final int S_IRWXO = 00007;
- public static final int S_IROTH = 00004;
- public static final int S_IWOTH = 00002;
- public static final int S_IXOTH = 00001;
-
-
- /**
- * File status information. This class maps directly to the POSIX stat structure.
- * @hide
- */
- public static final class FileStatus {
- public int dev;
- public int ino;
- public int mode;
- public int nlink;
- public int uid;
- public int gid;
- public int rdev;
- public long size;
- public int blksize;
- public long blocks;
- public long atime;
- public long mtime;
- public long ctime;
- }
-
- /**
- * Get the status for the given path. This is equivalent to the POSIX stat(2) system call.
- * @param path The path of the file to be stat'd.
- * @param status Optional argument to fill in. It will only fill in the status if the file
- * exists.
- * @return true if the file exists and false if it does not exist. If you do not have
- * permission to stat the file, then this method will return false.
- */
- public static native boolean getFileStatus(String path, FileStatus status);
-
- /** Regular expression for safe filenames: no spaces or metacharacters */
- private static final Pattern SAFE_FILENAME_PATTERN = Pattern.compile("[\\w%+,./=_-]+");
-
- public static native int setPermissions(String file, int mode, int uid, int gid);
-
- public static native int getPermissions(String file, int[] outPermissions);
-
- /** returns the FAT file system volume ID for the volume mounted
- * at the given mount point, or -1 for failure
- * @param mount point for FAT volume
- * @return volume ID or -1
- */
- public static native int getFatVolumeId(String mountPoint);
-
- // copy a file from srcFile to destFile, return true if succeed, return
- // false if fail
- public static boolean copyFile(File srcFile, File destFile) {
- boolean result = false;
- try {
- InputStream in = new FileInputStream(srcFile);
- try {
- result = copyToFile(in, destFile);
- } finally {
- in.close();
- }
- } catch (IOException e) {
- result = false;
- }
- return result;
- }
-
- /**
- * Copy data from a source stream to destFile.
- * Return true if succeed, return false if failed.
- */
- public static boolean copyToFile(InputStream inputStream, File destFile) {
- try {
- OutputStream out = new FileOutputStream(destFile);
- try {
- byte[] buffer = new byte[4096];
- int bytesRead;
- while ((bytesRead = inputStream.read(buffer)) >= 0) {
- out.write(buffer, 0, bytesRead);
- }
- } finally {
- out.close();
- }
- return true;
- } catch (IOException e) {
- return false;
- }
- }
-
- /**
- * Check if a filename is "safe" (no metacharacters or spaces).
- * @param file The file to check
- */
- public static boolean isFilenameSafe(File file) {
- // Note, we check whether it matches what's known to be safe,
- // rather than what's known to be unsafe. Non-ASCII, control
- // characters, etc. are all unsafe by default.
- return SAFE_FILENAME_PATTERN.matcher(file.getPath()).matches();
- }
-
- /**
- * Read a text file into a String, optionally limiting the length.
- * @param file to read (will not seek, so things like /proc files are OK)
- * @param max length (positive for head, negative of tail, 0 for no limit)
- * @param ellipsis to add of the file was truncated (can be null)
- * @return the contents of the file, possibly truncated
- * @throws IOException if something goes wrong reading the file
- */
- public static String readTextFile(File file, int max, String ellipsis) throws IOException {
- InputStream input = new FileInputStream(file);
- try {
- if (max > 0) { // "head" mode: read the first N bytes
- byte[] data = new byte[max + 1];
- int length = input.read(data);
- if (length <= 0) return "";
- if (length <= max) return new String(data, 0, length);
- if (ellipsis == null) return new String(data, 0, max);
- return new String(data, 0, max) + ellipsis;
- } else if (max < 0) { // "tail" mode: read it all, keep the last N
- int len;
- boolean rolled = false;
- byte[] last = null, data = null;
- do {
- if (last != null) rolled = true;
- byte[] tmp = last; last = data; data = tmp;
- if (data == null) data = new byte[-max];
- len = input.read(data);
- } while (len == data.length);
-
- if (last == null && len <= 0) return "";
- if (last == null) return new String(data, 0, len);
- if (len > 0) {
- rolled = true;
- System.arraycopy(last, len, last, 0, last.length - len);
- System.arraycopy(data, 0, last, last.length - len, len);
- }
- if (ellipsis == null || !rolled) return new String(last);
- return ellipsis + new String(last);
- } else { // "cat" mode: read it all
- ByteArrayOutputStream contents = new ByteArrayOutputStream();
- int len;
- byte[] data = new byte[1024];
- do {
- len = input.read(data);
- if (len > 0) contents.write(data, 0, len);
- } while (len == data.length);
- return contents.toString();
- }
- } finally {
- input.close();
- }
- }
-}
diff --git a/core/java/android/os/Handler.java b/core/java/android/os/Handler.java
deleted file mode 100644
index 2a32e54..0000000
--- a/core/java/android/os/Handler.java
+++ /dev/null
@@ -1,594 +0,0 @@
-/*
- * 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 android.os;
-
-import android.util.Log;
-import android.util.Printer;
-
-import java.lang.reflect.Modifier;
-
-/**
- * A Handler allows you to send and process {@link Message} and Runnable
- * objects associated with a thread's {@link MessageQueue}. Each Handler
- * instance is associated with a single thread and that thread's message
- * queue. When you create a new Handler, it is bound to the thread /
- * message queue of the thread that is creating it -- from that point on,
- * it will deliver messages and runnables to that message queue and execute
- * them as they come out of the message queue.
- *
- * <p>There are two main uses for a Handler: (1) to schedule messages and
- * runnables to be executed as some point in the future; and (2) to enqueue
- * an action to be performed on a different thread than your own.
- *
- * <p>Scheduling messages is accomplished with the
- * {@link #post}, {@link #postAtTime(Runnable, long)},
- * {@link #postDelayed}, {@link #sendEmptyMessage},
- * {@link #sendMessage}, {@link #sendMessageAtTime}, and
- * {@link #sendMessageDelayed} methods. The <em>post</em> versions allow
- * you to enqueue Runnable objects to be called by the message queue when
- * they are received; the <em>sendMessage</em> versions allow you to enqueue
- * a {@link Message} object containing a bundle of data that will be
- * processed by the Handler's {@link #handleMessage} method (requiring that
- * you implement a subclass of Handler).
- *
- * <p>When posting or sending to a Handler, you can either
- * allow the item to be processed as soon as the message queue is ready
- * to do so, or specify a delay before it gets processed or absolute time for
- * it to be processed. The latter two allow you to implement timeouts,
- * ticks, and other timing-based behavior.
- *
- * <p>When a
- * process is created for your application, its main thread is dedicated to
- * running a message queue that takes care of managing the top-level
- * application objects (activities, broadcast receivers, etc) and any windows
- * they create. You can create your own threads, and communicate back with
- * the main application thread through a Handler. This is done by calling
- * the same <em>post</em> or <em>sendMessage</em> methods as before, but from
- * your new thread. The given Runnable or Message will than be scheduled
- * in the Handler's message queue and processed when appropriate.
- */
-public class Handler {
- /*
- * Set this flag to true to detect anonymous, local or member classes
- * that extend this Handler class and that are not static. These kind
- * of classes can potentially create leaks.
- */
- private static final boolean FIND_POTENTIAL_LEAKS = false;
- private static final String TAG = "Handler";
-
- /**
- * Callback interface you can use when instantiating a Handler to avoid
- * having to implement your own subclass of Handler.
- */
- public interface Callback {
- public boolean handleMessage(Message msg);
- }
-
- /**
- * Subclasses must implement this to receive messages.
- */
- public void handleMessage(Message msg) {
- }
-
- /**
- * Handle system messages here.
- */
- public void dispatchMessage(Message msg) {
- if (msg.callback != null) {
- handleCallback(msg);
- } else {
- if (mCallback != null) {
- if (mCallback.handleMessage(msg)) {
- return;
- }
- }
- handleMessage(msg);
- }
- }
-
- /**
- * Default constructor associates this handler with the queue for the
- * current thread.
- *
- * If there isn't one, this handler won't be able to receive messages.
- */
- public Handler() {
- if (FIND_POTENTIAL_LEAKS) {
- final Class<? extends Handler> klass = getClass();
- if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
- (klass.getModifiers() & Modifier.STATIC) == 0) {
- Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
- klass.getCanonicalName());
- }
- }
-
- mLooper = Looper.myLooper();
- if (mLooper == null) {
- throw new RuntimeException(
- "Can't create handler inside thread that has not called Looper.prepare()");
- }
- mQueue = mLooper.mQueue;
- mCallback = null;
- }
-
- /**
- * Constructor associates this handler with the queue for the
- * current thread and takes a callback interface in which you can handle
- * messages.
- */
- public Handler(Callback callback) {
- if (FIND_POTENTIAL_LEAKS) {
- final Class<? extends Handler> klass = getClass();
- if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
- (klass.getModifiers() & Modifier.STATIC) == 0) {
- Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
- klass.getCanonicalName());
- }
- }
-
- mLooper = Looper.myLooper();
- if (mLooper == null) {
- throw new RuntimeException(
- "Can't create handler inside thread that has not called Looper.prepare()");
- }
- mQueue = mLooper.mQueue;
- mCallback = callback;
- }
-
- /**
- * Use the provided queue instead of the default one.
- */
- public Handler(Looper looper) {
- mLooper = looper;
- mQueue = looper.mQueue;
- mCallback = null;
- }
-
- /**
- * Use the provided queue instead of the default one and take a callback
- * interface in which to handle messages.
- */
- public Handler(Looper looper, Callback callback) {
- mLooper = looper;
- mQueue = looper.mQueue;
- mCallback = callback;
- }
-
- /**
- * Returns a new {@link android.os.Message Message} from the global message pool. More efficient than
- * creating and allocating new instances. The retrieved message has its handler set to this instance (Message.target == this).
- * If you don't want that facility, just call Message.obtain() instead.
- */
- public final Message obtainMessage()
- {
- return Message.obtain(this);
- }
-
- /**
- * Same as {@link #obtainMessage()}, except that it also sets the what member of the returned Message.
- *
- * @param what Value to assign to the returned Message.what field.
- * @return A Message from the global message pool.
- */
- public final Message obtainMessage(int what)
- {
- return Message.obtain(this, what);
- }
-
- /**
- *
- * Same as {@link #obtainMessage()}, except that it also sets the what and obj members
- * of the returned Message.
- *
- * @param what Value to assign to the returned Message.what field.
- * @param obj Value to assign to the returned Message.obj field.
- * @return A Message from the global message pool.
- */
- public final Message obtainMessage(int what, Object obj)
- {
- return Message.obtain(this, what, obj);
- }
-
- /**
- *
- * Same as {@link #obtainMessage()}, except that it also sets the what, arg1 and arg2 members of the returned
- * Message.
- * @param what Value to assign to the returned Message.what field.
- * @param arg1 Value to assign to the returned Message.arg1 field.
- * @param arg2 Value to assign to the returned Message.arg2 field.
- * @return A Message from the global message pool.
- */
- public final Message obtainMessage(int what, int arg1, int arg2)
- {
- return Message.obtain(this, what, arg1, arg2);
- }
-
- /**
- *
- * Same as {@link #obtainMessage()}, except that it also sets the what, obj, arg1,and arg2 values on the
- * returned Message.
- * @param what Value to assign to the returned Message.what field.
- * @param arg1 Value to assign to the returned Message.arg1 field.
- * @param arg2 Value to assign to the returned Message.arg2 field.
- * @param obj Value to assign to the returned Message.obj field.
- * @return A Message from the global message pool.
- */
- public final Message obtainMessage(int what, int arg1, int arg2, Object obj)
- {
- return Message.obtain(this, what, arg1, arg2, obj);
- }
-
- /**
- * Causes the Runnable r to be added to the message queue.
- * The runnable will be run on the thread to which this handler is
- * attached.
- *
- * @param r The Runnable that will be executed.
- *
- * @return Returns true if the Runnable was successfully placed in to the
- * message queue. Returns false on failure, usually because the
- * looper processing the message queue is exiting.
- */
- public final boolean post(Runnable r)
- {
- return sendMessageDelayed(getPostMessage(r), 0);
- }
-
- /**
- * Causes the Runnable r to be added to the message queue, to be run
- * at a specific time given by <var>uptimeMillis</var>.
- * <b>The time-base is {@link android.os.SystemClock#uptimeMillis}.</b>
- * The runnable will be run on the thread to which this handler is attached.
- *
- * @param r The Runnable that will be executed.
- * @param uptimeMillis The absolute time at which the callback should run,
- * using the {@link android.os.SystemClock#uptimeMillis} time-base.
- *
- * @return Returns true if the Runnable was successfully placed in to the
- * message queue. Returns false on failure, usually because the
- * looper processing the message queue is exiting. Note that a
- * result of true does not mean the Runnable will be processed -- if
- * the looper is quit before the delivery time of the message
- * occurs then the message will be dropped.
- */
- public final boolean postAtTime(Runnable r, long uptimeMillis)
- {
- return sendMessageAtTime(getPostMessage(r), uptimeMillis);
- }
-
- /**
- * Causes the Runnable r to be added to the message queue, to be run
- * at a specific time given by <var>uptimeMillis</var>.
- * <b>The time-base is {@link android.os.SystemClock#uptimeMillis}.</b>
- * The runnable will be run on the thread to which this handler is attached.
- *
- * @param r The Runnable that will be executed.
- * @param uptimeMillis The absolute time at which the callback should run,
- * using the {@link android.os.SystemClock#uptimeMillis} time-base.
- *
- * @return Returns true if the Runnable was successfully placed in to the
- * message queue. Returns false on failure, usually because the
- * looper processing the message queue is exiting. Note that a
- * result of true does not mean the Runnable will be processed -- if
- * the looper is quit before the delivery time of the message
- * occurs then the message will be dropped.
- *
- * @see android.os.SystemClock#uptimeMillis
- */
- public final boolean postAtTime(Runnable r, Object token, long uptimeMillis)
- {
- return sendMessageAtTime(getPostMessage(r, token), uptimeMillis);
- }
-
- /**
- * Causes the Runnable r to be added to the message queue, to be run
- * after the specified amount of time elapses.
- * The runnable will be run on the thread to which this handler
- * is attached.
- *
- * @param r The Runnable that will be executed.
- * @param delayMillis The delay (in milliseconds) until the Runnable
- * will be executed.
- *
- * @return Returns true if the Runnable was successfully placed in to the
- * message queue. Returns false on failure, usually because the
- * looper processing the message queue is exiting. Note that a
- * result of true does not mean the Runnable will be processed --
- * if the looper is quit before the delivery time of the message
- * occurs then the message will be dropped.
- */
- public final boolean postDelayed(Runnable r, long delayMillis)
- {
- return sendMessageDelayed(getPostMessage(r), delayMillis);
- }
-
- /**
- * Posts a message to an object that implements Runnable.
- * Causes the Runnable r to executed on the next iteration through the
- * message queue. The runnable will be run on the thread to which this
- * handler is attached.
- * <b>This method is only for use in very special circumstances -- it
- * can easily starve the message queue, cause ordering problems, or have
- * other unexpected side-effects.</b>
- *
- * @param r The Runnable that will be executed.
- *
- * @return Returns true if the message was successfully placed in to the
- * message queue. Returns false on failure, usually because the
- * looper processing the message queue is exiting.
- */
- public final boolean postAtFrontOfQueue(Runnable r)
- {
- return sendMessageAtFrontOfQueue(getPostMessage(r));
- }
-
- /**
- * Remove any pending posts of Runnable r that are in the message queue.
- */
- public final void removeCallbacks(Runnable r)
- {
- mQueue.removeMessages(this, r, null);
- }
-
- /**
- * Remove any pending posts of Runnable <var>r</var> with Object
- * <var>token</var> that are in the message queue.
- */
- public final void removeCallbacks(Runnable r, Object token)
- {
- mQueue.removeMessages(this, r, token);
- }
-
- /**
- * Pushes a message onto the end of the message queue after all pending messages
- * before the current time. It will be received in {@link #handleMessage},
- * in the thread attached to this handler.
- *
- * @return Returns true if the message was successfully placed in to the
- * message queue. Returns false on failure, usually because the
- * looper processing the message queue is exiting.
- */
- public final boolean sendMessage(Message msg)
- {
- return sendMessageDelayed(msg, 0);
- }
-
- /**
- * Sends a Message containing only the what value.
- *
- * @return Returns true if the message was successfully placed in to the
- * message queue. Returns false on failure, usually because the
- * looper processing the message queue is exiting.
- */
- public final boolean sendEmptyMessage(int what)
- {
- return sendEmptyMessageDelayed(what, 0);
- }
-
- /**
- * Sends a Message containing only the what value, to be delivered
- * after the specified amount of time elapses.
- * @see #sendMessageDelayed(android.os.Message, long)
- *
- * @return Returns true if the message was successfully placed in to the
- * message queue. Returns false on failure, usually because the
- * looper processing the message queue is exiting.
- */
- public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {
- Message msg = Message.obtain();
- msg.what = what;
- return sendMessageDelayed(msg, delayMillis);
- }
-
- /**
- * Sends a Message containing only the what value, to be delivered
- * at a specific time.
- * @see #sendMessageAtTime(android.os.Message, long)
- *
- * @return Returns true if the message was successfully placed in to the
- * message queue. Returns false on failure, usually because the
- * looper processing the message queue is exiting.
- */
-
- public final boolean sendEmptyMessageAtTime(int what, long uptimeMillis) {
- Message msg = Message.obtain();
- msg.what = what;
- return sendMessageAtTime(msg, uptimeMillis);
- }
-
- /**
- * Enqueue a message into the message queue after all pending messages
- * before (current time + delayMillis). You will receive it in
- * {@link #handleMessage}, in the thread attached to this handler.
- *
- * @return Returns true if the message was successfully placed in to the
- * message queue. Returns false on failure, usually because the
- * looper processing the message queue is exiting. Note that a
- * result of true does not mean the message will be processed -- if
- * the looper is quit before the delivery time of the message
- * occurs then the message will be dropped.
- */
- public final boolean sendMessageDelayed(Message msg, long delayMillis)
- {
- if (delayMillis < 0) {
- delayMillis = 0;
- }
- return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
- }
-
- /**
- * Enqueue a message into the message queue after all pending messages
- * before the absolute time (in milliseconds) <var>uptimeMillis</var>.
- * <b>The time-base is {@link android.os.SystemClock#uptimeMillis}.</b>
- * You will receive it in {@link #handleMessage}, in the thread attached
- * to this handler.
- *
- * @param uptimeMillis The absolute time at which the message should be
- * delivered, using the
- * {@link android.os.SystemClock#uptimeMillis} time-base.
- *
- * @return Returns true if the message was successfully placed in to the
- * message queue. Returns false on failure, usually because the
- * looper processing the message queue is exiting. Note that a
- * result of true does not mean the message will be processed -- if
- * the looper is quit before the delivery time of the message
- * occurs then the message will be dropped.
- */
- public boolean sendMessageAtTime(Message msg, long uptimeMillis)
- {
- boolean sent = false;
- MessageQueue queue = mQueue;
- if (queue != null) {
- msg.target = this;
- sent = queue.enqueueMessage(msg, uptimeMillis);
- }
- else {
- RuntimeException e = new RuntimeException(
- this + " sendMessageAtTime() called with no mQueue");
- Log.w("Looper", e.getMessage(), e);
- }
- return sent;
- }
-
- /**
- * Enqueue a message at the front of the message queue, to be processed on
- * the next iteration of the message loop. You will receive it in
- * {@link #handleMessage}, in the thread attached to this handler.
- * <b>This method is only for use in very special circumstances -- it
- * can easily starve the message queue, cause ordering problems, or have
- * other unexpected side-effects.</b>
- *
- * @return Returns true if the message was successfully placed in to the
- * message queue. Returns false on failure, usually because the
- * looper processing the message queue is exiting.
- */
- public final boolean sendMessageAtFrontOfQueue(Message msg)
- {
- boolean sent = false;
- MessageQueue queue = mQueue;
- if (queue != null) {
- msg.target = this;
- sent = queue.enqueueMessage(msg, 0);
- }
- else {
- RuntimeException e = new RuntimeException(
- this + " sendMessageAtTime() called with no mQueue");
- Log.w("Looper", e.getMessage(), e);
- }
- return sent;
- }
-
- /**
- * Remove any pending posts of messages with code 'what' that are in the
- * message queue.
- */
- public final void removeMessages(int what) {
- mQueue.removeMessages(this, what, null, true);
- }
-
- /**
- * Remove any pending posts of messages with code 'what' and whose obj is
- * 'object' that are in the message queue.
- */
- public final void removeMessages(int what, Object object) {
- mQueue.removeMessages(this, what, object, true);
- }
-
- /**
- * Remove any pending posts of callbacks and sent messages whose
- * <var>obj</var> is <var>token</var>.
- */
- public final void removeCallbacksAndMessages(Object token) {
- mQueue.removeCallbacksAndMessages(this, token);
- }
-
- /**
- * Check if there are any pending posts of messages with code 'what' in
- * the message queue.
- */
- public final boolean hasMessages(int what) {
- return mQueue.removeMessages(this, what, null, false);
- }
-
- /**
- * Check if there are any pending posts of messages with code 'what' and
- * whose obj is 'object' in the message queue.
- */
- public final boolean hasMessages(int what, Object object) {
- return mQueue.removeMessages(this, what, object, false);
- }
-
- // if we can get rid of this method, the handler need not remember its loop
- // we could instead export a getMessageQueue() method...
- public final Looper getLooper() {
- return mLooper;
- }
-
- public final void dump(Printer pw, String prefix) {
- pw.println(prefix + this + " @ " + SystemClock.uptimeMillis());
- if (mLooper == null) {
- pw.println(prefix + "looper uninitialized");
- } else {
- mLooper.dump(pw, prefix + " ");
- }
- }
-
- @Override
- public String toString() {
- return "Handler{"
- + Integer.toHexString(System.identityHashCode(this))
- + "}";
- }
-
- final IMessenger getIMessenger() {
- synchronized (mQueue) {
- if (mMessenger != null) {
- return mMessenger;
- }
- mMessenger = new MessengerImpl();
- return mMessenger;
- }
- }
-
- private final class MessengerImpl extends IMessenger.Stub {
- public void send(Message msg) {
- Handler.this.sendMessage(msg);
- }
- }
-
- private final Message getPostMessage(Runnable r) {
- Message m = Message.obtain();
- m.callback = r;
- return m;
- }
-
- private final Message getPostMessage(Runnable r, Object token) {
- Message m = Message.obtain();
- m.obj = token;
- m.callback = r;
- return m;
- }
-
- private final void handleCallback(Message message) {
- message.callback.run();
- }
-
- final MessageQueue mQueue;
- final Looper mLooper;
- final Callback mCallback;
- IMessenger mMessenger;
-}
diff --git a/core/java/android/os/HandlerState.java b/core/java/android/os/HandlerState.java
deleted file mode 100644
index 0708f7d..0000000
--- a/core/java/android/os/HandlerState.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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 android.os;
-
-/**
- * {@hide}
- */
-public abstract class HandlerState {
- public HandlerState() {
- }
-
- public void enter(Message message) {
- }
-
- public abstract void processMessage(Message message);
-
- public void exit(Message message) {
- }
-}
diff --git a/core/java/android/os/HandlerStateMachine.java b/core/java/android/os/HandlerStateMachine.java
deleted file mode 100644
index d004a25..0000000
--- a/core/java/android/os/HandlerStateMachine.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * 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 android.os;
-
-import android.util.Log;
-import android.util.LogPrinter;
-
-/**
- * {@hide}
- *
- * Implement a state machine where each state is an object,
- * HandlerState. Each HandlerState must implement processMessage
- * and optionally enter/exit. When a state machine is created
- * the initial state must be set. When messages are sent to
- * a state machine the current state's processMessage method is
- * invoked. If this is the first message for this state the
- * enter method is called prior to processMessage and when
- * transtionTo is invoked the state's exit method will be
- * called after returning from processMessage.
- *
- * If a message should be handled in a different state the
- * processMessage method may call deferMessage. This causes
- * the message to be saved on a list until transitioning
- * to a new state, at which time all of the deferred messages
- * will be put on the front of the state machines queue and
- * processed by the new current state's processMessage
- * method.
- *
- * Below is an example state machine with two state's, S1 and S2.
- * The initial state is S1 which defers all messages and only
- * transition to S2 when message.what == TEST_WHAT_2. State S2
- * will process each messages until it receives TEST_WHAT_2
- * where it will transition back to S1:
-<code>
- class StateMachine1 extends HandlerStateMachine {
- private static final int TEST_WHAT_1 = 1;
- private static final int TEST_WHAT_2 = 2;
-
- StateMachine1(String name) {
- super(name);
- setInitialState(mS1);
- }
-
- class S1 extends HandlerState {
- @Override public void enter(Message message) {
- }
-
- @Override public void processMessage(Message message) {
- deferMessage(message);
- if (message.what == TEST_WHAT_2) {
- transitionTo(mS2);
- }
- }
-
- @Override public void exit(Message message) {
- }
- }
-
- class S2 extends HandlerState {
- @Override public void processMessage(Message message) {
- // Do some processing
- if (message.what == TEST_WHAT_2) {
- transtionTo(mS1);
- }
- }
- }
-
- private S1 mS1 = new S1();
- private S2 mS2 = new S2();
- }
-</code>
- */
-public class HandlerStateMachine {
-
- private boolean mDbg = false;
- private static final String TAG = "HandlerStateMachine";
- private String mName;
- private SmHandler mHandler;
- private HandlerThread mHandlerThread;
-
- /**
- * Handle messages sent to the state machine by calling
- * the current state's processMessage. It also handles
- * the enter/exit calls and placing any deferred messages
- * back onto the queue when transitioning to a new state.
- */
- class SmHandler extends Handler {
-
- SmHandler(Looper looper) {
- super(looper);
- }
-
- /**
- * This will dispatch the message to the
- * current state's processMessage.
- */
- @Override
- final public void handleMessage(Message msg) {
- if (mDbg) Log.d(TAG, "SmHandler.handleMessage E");
- if (mDestState != null) {
- if (mDbg) Log.d(TAG, "SmHandler.handleMessage; new destation call enter");
- mCurrentState = mDestState;
- mDestState = null;
- mCurrentState.enter(msg);
- }
- if (mCurrentState != null) {
- if (mDbg) Log.d(TAG, "SmHandler.handleMessage; call processMessage");
- mCurrentState.processMessage(msg);
- } else {
- /* Strange no state to execute */
- Log.e(TAG, "handleMessage: no current state, did you call setInitialState");
- }
-
- if (mDestState != null) {
- if (mDbg) Log.d(TAG, "SmHandler.handleMessage; new destination call exit");
- mCurrentState.exit(msg);
-
- /**
- * Place the messages from the deferred queue:t
- * on to the Handler's message queue in the
- * same order that they originally arrived.
- *
- * We set cur.when = 0 to circumvent the check
- * that this message has already been sent.
- */
- while (mDeferredMessages != null) {
- Message cur = mDeferredMessages;
- mDeferredMessages = mDeferredMessages.next;
- cur.when = 0;
- if (mDbg) Log.d(TAG, "SmHandler.handleMessage; queue deferred message what="
- + cur.what + " target=" + cur.target);
- sendMessageAtFrontOfQueue(cur);
- }
- if (mDbg) Log.d(TAG, "SmHandler.handleMessage X");
- }
- }
-
- public HandlerState mCurrentState;
- public HandlerState mDestState;
- public Message mDeferredMessages;
- }
-
- /**
- * Create an active StateMachine, one that has a
- * dedicated thread/looper/queue.
- */
- public HandlerStateMachine(String name) {
- mName = name;
- mHandlerThread = new HandlerThread(name);
- mHandlerThread.start();
- mHandler = new SmHandler(mHandlerThread.getLooper());
- }
-
- /**
- * Get a message and set Message.target = this.
- */
- public final Message obtainMessage()
- {
- Message msg = Message.obtain(mHandler);
- if (mDbg) Log.d(TAG, "StateMachine.obtainMessage() EX target=" + msg.target);
- return msg;
- }
-
- /**
- * Get a message and set Message.target = this and
- * Message.what = what.
- */
- public final Message obtainMessage(int what) {
- Message msg = Message.obtain(mHandler, what);
- if (mDbg) {
- Log.d(TAG, "StateMachine.obtainMessage(what) EX what=" + msg.what +
- " target=" + msg.target);
- }
- return msg;
- }
-
- /**
- * Enqueue a message to this state machine.
- */
- public final void sendMessage(Message msg) {
- if (mDbg) Log.d(TAG, "StateMachine.sendMessage EX msg.what=" + msg.what);
- mHandler.sendMessage(msg);
- }
-
- /**
- * Enqueue a message to this state machine after a delay.
- */
- public final void sendMessageDelayed(Message msg, long delayMillis) {
- if (mDbg) {
- Log.d(TAG, "StateMachine.sendMessageDelayed EX msg.what="
- + msg.what + " delay=" + delayMillis);
- }
- mHandler.sendMessageDelayed(msg, delayMillis);
- }
-
- /**
- * Set the initial state. This must be invoked before
- * and messages are sent to the state machine.
- */
- public void setInitialState(HandlerState initialState) {
- if (mDbg) {
- Log.d(TAG, "StateMachine.setInitialState EX initialState"
- + initialState.getClass().getName());
- }
- mHandler.mDestState = initialState;
- }
-
- /**
- * transition to destination state. Upon returning
- * from processMessage the current state's exit will
- * be executed and upon the next message arriving
- * destState.enter will be invoked.
- */
- final public void transitionTo(HandlerState destState) {
- if (mDbg) {
- Log.d(TAG, "StateMachine.transitionTo EX destState"
- + destState.getClass().getName());
- }
- mHandler.mDestState = destState;
- }
-
- /**
- * Defer this message until next state transition.
- * Upon transitioning all deferred messages will be
- * placed on the queue and reprocessed in the original
- * order. (i.e. The next state the oldest messages will
- * be processed first)
- */
- final public void deferMessage(Message msg) {
- if (mDbg) {
- Log.d(TAG, "StateMachine.deferMessage EX mDeferredMessages="
- + mHandler.mDeferredMessages);
- }
-
- /* Copy the "msg" to "newMsg" as "msg" will be recycled */
- Message newMsg = obtainMessage();
- newMsg.copyFrom(msg);
-
- /* Place on front of queue */
- newMsg.next = mHandler.mDeferredMessages;
- mHandler.mDeferredMessages = newMsg;
- }
-
- /**
- * @return the name
- */
- public String getName() {
- return mName;
- }
-
- /**
- * @return Handler
- */
- public Handler getHandler() {
- return mHandler;
- }
-
- /**
- * @return if debugging is enabled
- */
- public boolean isDbg() {
- return mDbg;
- }
-
- /**
- * Set debug enable/disabled.
- */
- public void setDbg(boolean dbg) {
- mDbg = dbg;
- if (mDbg) {
- mHandlerThread.getLooper().setMessageLogging(new LogPrinter(Log.VERBOSE, TAG));
- } else {
- mHandlerThread.getLooper().setMessageLogging(null);
- }
- }
-}
diff --git a/core/java/android/os/HandlerThread.java b/core/java/android/os/HandlerThread.java
deleted file mode 100644
index 0ce86db..0000000
--- a/core/java/android/os/HandlerThread.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * 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 android.os;
-
-/**
- * Handy class for starting a new thread that has a looper. The looper can then be
- * used to create handler classes. Note that start() must still be called.
- */
-public class HandlerThread extends Thread {
- private int mPriority;
- private int mTid = -1;
- private Looper mLooper;
-
- public HandlerThread(String name) {
- super(name);
- mPriority = Process.THREAD_PRIORITY_DEFAULT;
- }
-
- /**
- * Constructs a HandlerThread.
- * @param name
- * @param priority The priority to run the thread at. The value supplied must be from
- * {@link android.os.Process} and not from java.lang.Thread.
- */
- public HandlerThread(String name, int priority) {
- super(name);
- mPriority = priority;
- }
-
- /**
- * Call back method that can be explicitly over ridden if needed to execute some
- * setup before Looper loops.
- */
- protected void onLooperPrepared() {
- }
-
- public void run() {
- mTid = Process.myTid();
- Looper.prepare();
- synchronized (this) {
- mLooper = Looper.myLooper();
- Process.setThreadPriority(mPriority);
- notifyAll();
- }
- onLooperPrepared();
- Looper.loop();
- mTid = -1;
- }
-
- /**
- * This method returns the Looper associated with this thread. If this thread not been started
- * or for any reason is isAlive() returns false, this method will return null. If this thread
- * has been started, this method will blocked until the looper has been initialized.
- * @return The looper.
- */
- public Looper getLooper() {
- if (!isAlive()) {
- return null;
- }
-
- // If the thread has been started, wait until the looper has been created.
- synchronized (this) {
- while (isAlive() && mLooper == null) {
- try {
- wait();
- } catch (InterruptedException e) {
- }
- }
- }
- return mLooper;
- }
-
- /**
- * Returns the identifier of this thread. See Process.myTid().
- */
- public int getThreadId() {
- return mTid;
- }
-}
diff --git a/core/java/android/os/Hardware.java b/core/java/android/os/Hardware.java
deleted file mode 100644
index 3b6c9d7..0000000
--- a/core/java/android/os/Hardware.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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 android.os;
-
-/**
- * {@hide}
- */
-public class Hardware
-{
- /**
- * Control the LED.
- */
- public static native int setLedState(int colorARGB, int onMS, int offMS);
-
- /**
- * Control the Flashlight
- */
- public static native boolean getFlashlightEnabled();
- public static native void setFlashlightEnabled(boolean on);
- public static native void enableCameraFlash(int milliseconds);
-
- /**
- * Control the backlights
- */
- public static native void setScreenBacklight(int brightness);
- public static native void setKeyboardBacklight(boolean on);
- public static native void setButtonBacklight(boolean on);
-}
diff --git a/core/java/android/os/IBinder.java b/core/java/android/os/IBinder.java
deleted file mode 100644
index 5c40c9a0..0000000
--- a/core/java/android/os/IBinder.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * 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 android.os;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-
-/**
- * Base interface for a remotable object, the core part of a lightweight
- * remote procedure call mechanism designed for high performance when
- * performing in-process and cross-process calls. This
- * interface describes the abstract protocol for interacting with a
- * remotable object. Do not implement this interface directly, instead
- * extend from {@link Binder}.
- *
- * <p>The key IBinder API is {@link #transact transact()} matched by
- * {@link Binder#onTransact Binder.onTransact()}. These
- * methods allow you to send a call to an IBinder object and receive a
- * call coming in to a Binder object, respectively. This transaction API
- * is synchronous, such that a call to {@link #transact transact()} does not
- * return until the target has returned from
- * {@link Binder#onTransact Binder.onTransact()}; this is the
- * expected behavior when calling an object that exists in the local
- * process, and the underlying inter-process communication (IPC) mechanism
- * ensures that these same semantics apply when going across processes.
- *
- * <p>The data sent through transact() is a {@link Parcel}, a generic buffer
- * of data that also maintains some meta-data about its contents. The meta
- * data is used to manage IBinder object references in the buffer, so that those
- * references can be maintained as the buffer moves across processes. This
- * mechanism ensures that when an IBinder is written into a Parcel and sent to
- * another process, if that other process sends a reference to that same IBinder
- * back to the original process, then the original process will receive the
- * same IBinder object back. These semantics allow IBinder/Binder objects to
- * be used as a unique identity (to serve as a token or for other purposes)
- * that can be managed across processes.
- *
- * <p>The system maintains a pool of transaction threads in each process that
- * it runs in. These threads are used to dispatch all
- * IPCs coming in from other processes. For example, when an IPC is made from
- * process A to process B, the calling thread in A blocks in transact() as
- * it sends the transaction to process B. The next available pool thread in
- * B receives the incoming transaction, calls Binder.onTransact() on the target
- * object, and replies with the result Parcel. Upon receiving its result, the
- * thread in process A returns to allow its execution to continue. In effect,
- * other processes appear to use as additional threads that you did not create
- * executing in your own process.
- *
- * <p>The Binder system also supports recursion across processes. For example
- * if process A performs a transaction to process B, and process B while
- * handling that transaction calls transact() on an IBinder that is implemented
- * in A, then the thread in A that is currently waiting for the original
- * transaction to finish will take care of calling Binder.onTransact() on the
- * object being called by B. This ensures that the recursion semantics when
- * calling remote binder object are the same as when calling local objects.
- *
- * <p>When working with remote objects, you often want to find out when they
- * are no longer valid. There are three ways this can be determined:
- * <ul>
- * <li> The {@link #transact transact()} method will throw a
- * {@link RemoteException} exception if you try to call it on an IBinder
- * whose process no longer exists.
- * <li> The {@link #pingBinder()} method can be called, and will return false
- * if the remote process no longer exists.
- * <li> The {@link #linkToDeath linkToDeath()} method can be used to register
- * a {@link DeathRecipient} with the IBinder, which will be called when its
- * containing process goes away.
- * </ul>
- *
- * @see Binder
- */
-public interface IBinder {
- /**
- * The first transaction code available for user commands.
- */
- int FIRST_CALL_TRANSACTION = 0x00000001;
- /**
- * The last transaction code available for user commands.
- */
- int LAST_CALL_TRANSACTION = 0x00ffffff;
-
- /**
- * IBinder protocol transaction code: pingBinder().
- */
- int PING_TRANSACTION = ('_'<<24)|('P'<<16)|('N'<<8)|'G';
-
- /**
- * IBinder protocol transaction code: dump internal state.
- */
- int DUMP_TRANSACTION = ('_'<<24)|('D'<<16)|('M'<<8)|'P';
-
- /**
- * IBinder protocol transaction code: interrogate the recipient side
- * of the transaction for its canonical interface descriptor.
- */
- int INTERFACE_TRANSACTION = ('_'<<24)|('N'<<16)|('T'<<8)|'F';
-
- /**
- * Flag to {@link #transact}: this is a one-way call, meaning that the
- * caller returns immediately, without waiting for a result from the
- * callee.
- */
- int FLAG_ONEWAY = 0x00000001;
-
- /**
- * Get the canonical name of the interface supported by this binder.
- */
- public String getInterfaceDescriptor() throws RemoteException;
-
- /**
- * Check to see if the object still exists.
- *
- * @return Returns false if the
- * hosting process is gone, otherwise the result (always by default
- * true) returned by the pingBinder() implementation on the other
- * side.
- */
- public boolean pingBinder();
-
- /**
- * Check to see if the process that the binder is in is still alive.
- *
- * @return false if the process is not alive. Note that if it returns
- * true, the process may have died while the call is returning.
- */
- public boolean isBinderAlive();
-
- /**
- * Attempt to retrieve a local implementation of an interface
- * for this Binder object. If null is returned, you will need
- * to instantiate a proxy class to marshall calls through
- * the transact() method.
- */
- public IInterface queryLocalInterface(String descriptor);
-
- /**
- * Print the object's state into the given stream.
- *
- * @param fd The raw file descriptor that the dump is being sent to.
- * @param args additional arguments to the dump request.
- */
- public void dump(FileDescriptor fd, String[] args) throws RemoteException;
-
- /**
- * Perform a generic operation with the object.
- *
- * @param code The action to perform. This should
- * be a number between {@link #FIRST_CALL_TRANSACTION} and
- * {@link #LAST_CALL_TRANSACTION}.
- * @param data Marshalled data to send to the target. Most not be null.
- * If you are not sending any data, you must create an empty Parcel
- * that is given here.
- * @param reply Marshalled data to be received from the target. May be
- * null if you are not interested in the return value.
- * @param flags Additional operation flags. Either 0 for a normal
- * RPC, or {@link #FLAG_ONEWAY} for a one-way RPC.
- */
- public boolean transact(int code, Parcel data, Parcel reply, int flags)
- throws RemoteException;
-
- /**
- * Interface for receiving a callback when the process hosting an IBinder
- * has gone away.
- *
- * @see #linkToDeath
- */
- public interface DeathRecipient {
- public void binderDied();
- }
-
- /**
- * Register the recipient for a notification if this binder
- * goes away. If this binder object unexpectedly goes away
- * (typically because its hosting process has been killed),
- * then the given {@link DeathRecipient}'s
- * {@link DeathRecipient#binderDied DeathRecipient.binderDied()} method
- * will be called.
- *
- * <p>You will only receive death notifications for remote binders,
- * as local binders by definition can't die without you dying as well.
- *
- * @throws Throws {@link RemoteException} if the target IBinder's
- * process has already died.
- *
- * @see #unlinkToDeath
- */
- public void linkToDeath(DeathRecipient recipient, int flags)
- throws RemoteException;
-
- /**
- * Remove a previously registered death notification.
- * The recipient will no longer be called if this object
- * dies.
- *
- * @return Returns true if the <var>recipient</var> is successfully
- * unlinked, assuring you that its
- * {@link DeathRecipient#binderDied DeathRecipient.binderDied()} method
- * will not be called. Returns false if the target IBinder has already
- * died, meaning the method has been (or soon will be) called.
- *
- * @throws Throws {@link java.util.NoSuchElementException} if the given
- * <var>recipient</var> has not been registered with the IBinder, and
- * the IBinder is still alive. Note that if the <var>recipient</var>
- * was never registered, but the IBinder has already died, then this
- * exception will <em>not</em> be thrown, and you will receive a false
- * return value instead.
- */
- public boolean unlinkToDeath(DeathRecipient recipient, int flags);
-}
diff --git a/core/java/android/os/ICheckinService.aidl b/core/java/android/os/ICheckinService.aidl
deleted file mode 100644
index e56b55d..0000000
--- a/core/java/android/os/ICheckinService.aidl
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2007 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 android.os;
-
-import android.os.IParentalControlCallback;
-
-/**
- * System private API for direct access to the checkin service.
- * Users should use the content provider instead.
- *
- * @see android.provider.Checkin
- * {@hide}
- */
-interface ICheckinService {
- /** Synchronously attempt a checkin with the server, return true
- * on success.
- * @throws IllegalStateException whenever an error occurs. The
- * cause of the exception will be the real exception:
- * IOException for network errors, JSONException for invalid
- * server responses, etc.
- */
- boolean checkin();
-
- /** Direct submission of crash data; returns after writing the crash. */
- void reportCrashSync(in byte[] crashData);
-
- /** Asynchronous "fire and forget" version of crash reporting. */
- oneway void reportCrashAsync(in byte[] crashData);
-
- /** Reboot into the recovery system and wipe all user data. */
- void masterClear();
-
- /**
- * Determine if the device is under parental control. Return null if
- * we are unable to check the parental control status.
- */
- void getParentalControlState(IParentalControlCallback p,
- String requestingApp);
-}
diff --git a/core/java/android/os/IHardwareService.aidl b/core/java/android/os/IHardwareService.aidl
deleted file mode 100755
index 4f6029f..0000000
--- a/core/java/android/os/IHardwareService.aidl
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Copyright (c) 2007, 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 android.os;
-
-/** {@hide} */
-interface IHardwareService
-{
- // Vibrator support
- void vibrate(long milliseconds);
- void vibratePattern(in long[] pattern, int repeat, IBinder token);
- void cancelVibrate();
-
- // flashlight support
- boolean getFlashlightEnabled();
- void setFlashlightEnabled(boolean on);
- void enableCameraFlash(int milliseconds);
-
- // backlight support
- void setScreenBacklight(int brightness);
- void setKeyboardBacklight(boolean on);
- void setButtonBacklight(boolean on);
-
- // LED support
- void setLedState(int colorARGB, int onMS, int offMS);
-}
-
diff --git a/core/java/android/os/IInterface.java b/core/java/android/os/IInterface.java
deleted file mode 100644
index 2a2605a..0000000
--- a/core/java/android/os/IInterface.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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 android.os;
-
-/**
- * Base class for Binder interfaces. When defining a new interface,
- * you must derive it from IInterface.
- */
-public interface IInterface
-{
- /**
- * Retrieve the Binder object associated with this interface.
- * You must use this instead of a plain cast, so that proxy objects
- * can return the correct result.
- */
- public IBinder asBinder();
-}
diff --git a/core/java/android/os/IMessenger.aidl b/core/java/android/os/IMessenger.aidl
deleted file mode 100644
index e4a8431..0000000
--- a/core/java/android/os/IMessenger.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/* //device/java/android/android/app/IActivityPendingResult.aidl
-**
-** Copyright 2007, 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 android.os;
-
-import android.os.Message;
-
-/** @hide */
-oneway interface IMessenger {
- void send(in Message msg);
-}
diff --git a/core/java/android/os/IMountService.aidl b/core/java/android/os/IMountService.aidl
deleted file mode 100644
index 88dae85..0000000
--- a/core/java/android/os/IMountService.aidl
+++ /dev/null
@@ -1,66 +0,0 @@
-/* //device/java/android/android/os/IUsb.aidl
-**
-** Copyright 2007, 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 android.os;
-
-/** WARNING! Update IMountService.h and IMountService.cpp if you change this file.
- * In particular, the ordering of the methods below must match the
- * _TRANSACTION enum in IMountService.cpp
- * @hide
- */
-interface IMountService
-{
- /**
- * Is mass storage support enabled?
- */
- boolean getMassStorageEnabled();
-
- /**
- * Enable or disable mass storage support.
- */
- void setMassStorageEnabled(boolean enabled);
-
- /**
- * Is mass storage connected?
- */
- boolean getMassStorageConnected();
-
- /**
- * Mount external storage at given mount point.
- */
- void mountMedia(String mountPoint);
-
- /**
- * Safely unmount external storage at given mount point.
- */
- void unmountMedia(String mountPoint);
-
- /**
- * Format external storage given a mount point
- */
- void formatMedia(String mountPoint);
-
- /**
- * Returns true if media notification sounds are enabled.
- */
- boolean getPlayNotificationSounds();
-
- /**
- * Sets whether or not media notification sounds are played.
- */
- void setPlayNotificationSounds(boolean value);
-}
diff --git a/core/java/android/os/INetStatService.aidl b/core/java/android/os/INetStatService.aidl
deleted file mode 100644
index a8f3de0..0000000
--- a/core/java/android/os/INetStatService.aidl
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2008 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 android.os;
-
-/**
- * Retrieves packet and byte counts for the phone data interface,
- * and for all interfaces.
- * Used for the data activity icon and the phone status in Settings.
- *
- * {@hide}
- */
-interface INetStatService {
- long getMobileTxPackets();
- long getMobileRxPackets();
- long getMobileTxBytes();
- long getMobileRxBytes();
- long getTotalTxPackets();
- long getTotalRxPackets();
- long getTotalTxBytes();
- long getTotalRxBytes();
-}
diff --git a/core/java/android/os/IParentalControlCallback.aidl b/core/java/android/os/IParentalControlCallback.aidl
deleted file mode 100644
index 2f1a563..0000000
--- a/core/java/android/os/IParentalControlCallback.aidl
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2008 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 android.os;
-
-import com.google.android.net.ParentalControlState;
-
-/**
- * This callback interface is used to deliver the parental control state to the calling application.
- * {@hide}
- */
-oneway interface IParentalControlCallback {
- void onResult(in ParentalControlState state);
-}
diff --git a/core/java/android/os/IPermissionController.aidl b/core/java/android/os/IPermissionController.aidl
deleted file mode 100644
index 73a68f1..0000000
--- a/core/java/android/os/IPermissionController.aidl
+++ /dev/null
@@ -1,23 +0,0 @@
-/* //device/java/android/android/os/IPowerManager.aidl
-**
-** Copyright 2007, 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 android.os;
-
-/** @hide */
-interface IPermissionController {
- boolean checkPermission(String permission, int pid, int uid);
-}
diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl
deleted file mode 100644
index 5486920..0000000
--- a/core/java/android/os/IPowerManager.aidl
+++ /dev/null
@@ -1,33 +0,0 @@
-/* //device/java/android/android/os/IPowerManager.aidl
-**
-** Copyright 2007, 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 android.os;
-
-/** @hide */
-interface IPowerManager
-{
- void acquireWakeLock(int flags, IBinder lock, String tag);
- void goToSleep(long time);
- void releaseWakeLock(IBinder lock);
- void userActivity(long when, boolean noChangeLights);
- void userActivityWithForce(long when, boolean noChangeLights, boolean force);
- void setPokeLock(int pokey, IBinder lock, String tag);
- void setStayOnSetting(int val);
- long getScreenOnTime();
- void preventScreenOn(boolean prevent);
- void setScreenBrightnessOverride(int brightness);
-}
diff --git a/core/java/android/os/IServiceManager.java b/core/java/android/os/IServiceManager.java
deleted file mode 100644
index 9a5ff47..0000000
--- a/core/java/android/os/IServiceManager.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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 android.os;
-
-/**
- * Basic interface for finding and publishing system services.
- *
- * An implementation of this interface is usually published as the
- * global context object, which can be retrieved via
- * BinderNative.getContextObject(). An easy way to retrieve this
- * is with the static method BnServiceManager.getDefault().
- *
- * @hide
- */
-public interface IServiceManager extends IInterface
-{
- /**
- * Retrieve an existing service called @a name from the
- * service manager. Blocks for a few seconds waiting for it to be
- * published if it does not already exist.
- */
- public IBinder getService(String name) throws RemoteException;
-
- /**
- * Retrieve an existing service called @a name from the
- * service manager. Non-blocking.
- */
- public IBinder checkService(String name) throws RemoteException;
-
- /**
- * Place a new @a service called @a name into the service
- * manager.
- */
- public void addService(String name, IBinder service) throws RemoteException;
-
- /**
- * Return a list of all currently running services.
- */
- public String[] listServices() throws RemoteException;
-
- /**
- * Assign a permission controller to the service manager. After set, this
- * interface is checked before any services are added.
- */
- public void setPermissionController(IPermissionController controller)
- throws RemoteException;
-
- static final String descriptor = "android.os.IServiceManager";
-
- int GET_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION;
- int CHECK_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+1;
- int ADD_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+2;
- int LIST_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+3;
- int CHECK_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+4;
- int SET_PERMISSION_CONTROLLER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+5;
-}
diff --git a/core/java/android/os/LocalPowerManager.java b/core/java/android/os/LocalPowerManager.java
deleted file mode 100644
index 55d7972..0000000
--- a/core/java/android/os/LocalPowerManager.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2007 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 android.os;
-
-/** @hide */
-public interface LocalPowerManager {
- public static final int OTHER_EVENT = 0;
- public static final int CHEEK_EVENT = 1;
- public static final int TOUCH_EVENT = 2;
- public static final int BUTTON_EVENT = 3; // Button and trackball events.
-
- public static final int POKE_LOCK_IGNORE_CHEEK_EVENTS = 0x1;
- public static final int POKE_LOCK_SHORT_TIMEOUT = 0x2;
- public static final int POKE_LOCK_MEDIUM_TIMEOUT = 0x4;
-
- public static final int POKE_LOCK_TIMEOUT_MASK = 0x6;
-
- void goToSleep(long time);
-
- // notify power manager when keyboard is opened/closed
- void setKeyboardVisibility(boolean visible);
-
- // when the keyguard is up, it manages the power state, and userActivity doesn't do anything.
- void enableUserActivity(boolean enabled);
-
- // the same as the method on PowerManager
- public void userActivity(long time, boolean noChangeLights, int eventType);
-}
diff --git a/core/java/android/os/Looper.java b/core/java/android/os/Looper.java
deleted file mode 100644
index 9581893..0000000
--- a/core/java/android/os/Looper.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * 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 android.os;
-
-import android.util.Config;
-import android.util.Printer;
-
-/**
- * Class used to run a message loop for a thread. Threads by default do
- * not have a message loop associated with them; to create one, call
- * {@link #prepare} in the thread that is to run the loop, and then
- * {@link #loop} to have it process messages until the loop is stopped.
- *
- * <p>Most interaction with a message loop is through the
- * {@link Handler} class.
- *
- * <p>This is a typical example of the implementation of a Looper thread,
- * using the separation of {@link #prepare} and {@link #loop} to create an
- * initial Handler to communicate with the Looper.
- *
- * <pre>
- * class LooperThread extends Thread {
- * public Handler mHandler;
- *
- * public void run() {
- * Looper.prepare();
- *
- * mHandler = new Handler() {
- * public void handleMessage(Message msg) {
- * // process incoming messages here
- * }
- * };
- *
- * Looper.loop();
- * }
- * }</pre>
- */
-public class Looper {
- private static final boolean DEBUG = false;
- private static final boolean localLOGV = DEBUG ? Config.LOGD : Config.LOGV;
-
- // sThreadLocal.get() will return null unless you've called prepare().
- private static final ThreadLocal sThreadLocal = new ThreadLocal();
-
- final MessageQueue mQueue;
- volatile boolean mRun;
- Thread mThread;
- private Printer mLogging = null;
- private static Looper mMainLooper = null;
-
- /** Initialize the current thread as a looper.
- * This gives you a chance to create handlers that then reference
- * this looper, before actually starting the loop. Be sure to call
- * {@link #loop()} after calling this method, and end it by calling
- * {@link #quit()}.
- */
- public static final void prepare() {
- if (sThreadLocal.get() != null) {
- throw new RuntimeException("Only one Looper may be created per thread");
- }
- sThreadLocal.set(new Looper());
- }
-
- /** Initialize the current thread as a looper, marking it as an application's main
- * looper. The main looper for your application is created by the Android environment,
- * so you should never need to call this function yourself.
- * {@link #prepare()}
- */
-
- public static final void prepareMainLooper() {
- prepare();
- setMainLooper(myLooper());
- if (Process.supportsProcesses()) {
- myLooper().mQueue.mQuitAllowed = false;
- }
- }
-
- private synchronized static void setMainLooper(Looper looper) {
- mMainLooper = looper;
- }
-
- /** Returns the application's main looper, which lives in the main thread of the application.
- */
- public synchronized static final Looper getMainLooper() {
- return mMainLooper;
- }
-
- /**
- * Run the message queue in this thread. Be sure to call
- * {@link #quit()} to end the loop.
- */
- public static final void loop() {
- Looper me = myLooper();
- MessageQueue queue = me.mQueue;
- while (true) {
- Message msg = queue.next(); // might block
- //if (!me.mRun) {
- // break;
- //}
- if (msg != null) {
- if (msg.target == null) {
- // No target is a magic identifier for the quit message.
- return;
- }
- if (me.mLogging!= null) me.mLogging.println(
- ">>>>> Dispatching to " + msg.target + " "
- + msg.callback + ": " + msg.what
- );
- msg.target.dispatchMessage(msg);
- if (me.mLogging!= null) me.mLogging.println(
- "<<<<< Finished to " + msg.target + " "
- + msg.callback);
- msg.recycle();
- }
- }
- }
-
- /**
- * Return the Looper object associated with the current thread. Returns
- * null if the calling thread is not associated with a Looper.
- */
- public static final Looper myLooper() {
- return (Looper)sThreadLocal.get();
- }
-
- /**
- * Control logging of messages as they are processed by this Looper. If
- * enabled, a log message will be written to <var>printer</var>
- * at the beginning and ending of each message dispatch, identifying the
- * target Handler and message contents.
- *
- * @param printer A Printer object that will receive log messages, or
- * null to disable message logging.
- */
- public void setMessageLogging(Printer printer) {
- mLogging = printer;
- }
-
- /**
- * Return the {@link MessageQueue} object associated with the current
- * thread. This must be called from a thread running a Looper, or a
- * NullPointerException will be thrown.
- */
- public static final MessageQueue myQueue() {
- return myLooper().mQueue;
- }
-
- private Looper() {
- mQueue = new MessageQueue();
- mRun = true;
- mThread = Thread.currentThread();
- }
-
- public void quit() {
- Message msg = Message.obtain();
- // NOTE: By enqueueing directly into the message queue, the
- // message is left with a null target. This is how we know it is
- // a quit message.
- mQueue.enqueueMessage(msg, 0);
- }
-
- /**
- * Return the Thread associated with this Looper.
- *
- * @since CURRENT
- * {@hide pending API Council approval}
- */
- public Thread getThread() {
- return mThread;
- }
-
- public void dump(Printer pw, String prefix) {
- pw.println(prefix + this);
- pw.println(prefix + "mRun=" + mRun);
- pw.println(prefix + "mThread=" + mThread);
- pw.println(prefix + "mQueue=" + ((mQueue != null) ? mQueue : "(null"));
- if (mQueue != null) {
- synchronized (mQueue) {
- Message msg = mQueue.mMessages;
- int n = 0;
- while (msg != null) {
- pw.println(prefix + " Message " + n + ": " + msg);
- n++;
- msg = msg.next;
- }
- pw.println(prefix + "(Total messages: " + n + ")");
- }
- }
- }
-
- public String toString() {
- return "Looper{"
- + Integer.toHexString(System.identityHashCode(this))
- + "}";
- }
-
- static class HandlerException extends Exception {
-
- HandlerException(Message message, Throwable cause) {
- super(createMessage(cause), cause);
- }
-
- static String createMessage(Throwable cause) {
- String causeMsg = cause.getMessage();
- if (causeMsg == null) {
- causeMsg = cause.toString();
- }
- return causeMsg;
- }
- }
-}
-
diff --git a/core/java/android/os/MailboxNotAvailableException.java b/core/java/android/os/MailboxNotAvailableException.java
deleted file mode 100644
index 574adbd..0000000
--- a/core/java/android/os/MailboxNotAvailableException.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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 android.os;
-
-/** @hide */
-public class MailboxNotAvailableException extends Throwable
-{
- /**
- * This exception represents the case when a request for a
- * named, published mailbox fails because the requested name has not been published
- */
-
- public
- MailboxNotAvailableException()
- {
- }
-
- public
- MailboxNotAvailableException(String s)
- {
- super(s);
- }
-}
diff --git a/core/java/android/os/MemoryFile.java b/core/java/android/os/MemoryFile.java
deleted file mode 100644
index 76e4f47..0000000
--- a/core/java/android/os/MemoryFile.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * Copyright (C) 2008 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 android.os;
-
-import android.util.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-
-/**
- * MemoryFile is a wrapper for the Linux ashmem driver.
- * MemoryFiles are backed by shared memory, which can be optionally
- * set to be purgeable.
- * Purgeable files may have their contents reclaimed by the kernel
- * in low memory conditions (only if allowPurging is set to true).
- * After a file is purged, attempts to read or write the file will
- * cause an IOException to be thrown.
- */
-public class MemoryFile
-{
- private static String TAG = "MemoryFile";
-
- // returns fd
- private native int native_open(String name, int length);
- // returns memory address for ashmem region
- private native int native_mmap(int fd, int length);
- private native void native_close(int fd);
- private native int native_read(int fd, int address, byte[] buffer,
- int srcOffset, int destOffset, int count, boolean isUnpinned);
- private native void native_write(int fd, int address, byte[] buffer,
- int srcOffset, int destOffset, int count, boolean isUnpinned);
- private native void native_pin(int fd, boolean pin);
-
- private int mFD; // ashmem file descriptor
- private int mAddress; // address of ashmem memory
- private int mLength; // total length of our ashmem region
- private boolean mAllowPurging = false; // true if our ashmem region is unpinned
-
- /**
- * MemoryFile constructor.
- *
- * @param name optional name for the file (can be null).
- * @param length of the memory file in bytes.
- */
- public MemoryFile(String name, int length) {
- mLength = length;
- mFD = native_open(name, length);
- mAddress = native_mmap(mFD, length);
- }
-
- /**
- * Closes and releases all resources for the memory file.
- */
- public void close() {
- if (mFD > 0) {
- native_close(mFD);
- mFD = 0;
- }
- }
-
- @Override
- protected void finalize() {
- if (mFD > 0) {
- Log.e(TAG, "MemoryFile.finalize() called while ashmem still open");
- close();
- }
- }
-
- /**
- * Returns the length of the memory file.
- *
- * @return file length.
- */
- public int length() {
- return mLength;
- }
-
- /**
- * Is memory file purging enabled?
- *
- * @return true if the file may be purged.
- */
- public boolean isPurgingAllowed() {
- return mAllowPurging;
- }
-
- /**
- * Enables or disables purging of the memory file.
- *
- * @param allowPurging true if the operating system can purge the contents
- * of the file in low memory situations
- * @return previous value of allowPurging
- */
- synchronized public boolean allowPurging(boolean allowPurging) throws IOException {
- boolean oldValue = mAllowPurging;
- if (oldValue != allowPurging) {
- native_pin(mFD, !allowPurging);
- mAllowPurging = allowPurging;
- }
- return oldValue;
- }
-
- /**
- * Creates a new InputStream for reading from the memory file.
- *
- @return InputStream
- */
- public InputStream getInputStream() {
- return new MemoryInputStream();
- }
-
- /**
- * Creates a new OutputStream for writing to the memory file.
- *
- @return OutputStream
- */
- public OutputStream getOutputStream() {
-
- return new MemoryOutputStream();
- }
-
- /**
- * Reads bytes from the memory file.
- * Will throw an IOException if the file has been purged.
- *
- * @param buffer byte array to read bytes into.
- * @param srcOffset offset into the memory file to read from.
- * @param destOffset offset into the byte array buffer to read into.
- * @param count number of bytes to read.
- * @return number of bytes read.
- */
- public int readBytes(byte[] buffer, int srcOffset, int destOffset, int count)
- throws IOException {
- if (destOffset < 0 || destOffset > buffer.length || count < 0
- || count > buffer.length - destOffset
- || srcOffset < 0 || srcOffset > mLength
- || count > mLength - srcOffset) {
- throw new IndexOutOfBoundsException();
- }
- return native_read(mFD, mAddress, buffer, srcOffset, destOffset, count, mAllowPurging);
- }
-
- /**
- * Write bytes to the memory file.
- * Will throw an IOException if the file has been purged.
- *
- * @param buffer byte array to write bytes from.
- * @param srcOffset offset into the byte array buffer to write from.
- * @param destOffset offset into the memory file to write to.
- * @param count number of bytes to write.
- */
- public void writeBytes(byte[] buffer, int srcOffset, int destOffset, int count)
- throws IOException {
- if (srcOffset < 0 || srcOffset > buffer.length || count < 0
- || count > buffer.length - srcOffset
- || destOffset < 0 || destOffset > mLength
- || count > mLength - destOffset) {
- throw new IndexOutOfBoundsException();
- }
- native_write(mFD, mAddress, buffer, srcOffset, destOffset, count, mAllowPurging);
- }
-
- private class MemoryInputStream extends InputStream {
-
- private int mMark = 0;
- private int mOffset = 0;
- private byte[] mSingleByte;
-
- @Override
- public int available() throws IOException {
- if (mOffset >= mLength) {
- return 0;
- }
- return mLength - mOffset;
- }
-
- @Override
- public boolean markSupported() {
- return true;
- }
-
- @Override
- public void mark(int readlimit) {
- mMark = mOffset;
- }
-
- @Override
- public void reset() throws IOException {
- mOffset = mMark;
- }
-
- @Override
- public int read() throws IOException {
- if (mSingleByte == null) {
- mSingleByte = new byte[1];
- }
- int result = read(mSingleByte, 0, 1);
- if (result != 1) {
- throw new IOException("read() failed");
- }
- return mSingleByte[0];
- }
-
- @Override
- public int read(byte buffer[], int offset, int count) throws IOException {
- int result = readBytes(buffer, mOffset, offset, count);
- if (result > 0) {
- mOffset += result;
- }
- return result;
- }
-
- @Override
- public long skip(long n) throws IOException {
- if (mOffset + n > mLength) {
- n = mLength - mOffset;
- }
- mOffset += n;
- return n;
- }
- }
-
- private class MemoryOutputStream extends OutputStream {
-
- private int mOffset = 0;
- private byte[] mSingleByte;
-
- @Override
- public void write(byte buffer[], int offset, int count) throws IOException {
- writeBytes(buffer, offset, mOffset, count);
- }
-
- @Override
- public void write(int oneByte) throws IOException {
- if (mSingleByte == null) {
- mSingleByte = new byte[1];
- }
- mSingleByte[0] = (byte)oneByte;
- write(mSingleByte, 0, 1);
- }
- }
-}
diff --git a/core/java/android/os/Message.aidl b/core/java/android/os/Message.aidl
deleted file mode 100644
index e8dbb5a..0000000
--- a/core/java/android/os/Message.aidl
+++ /dev/null
@@ -1,20 +0,0 @@
-/* //device/java/android/android/content/Intent.aidl
-**
-** Copyright 2007, 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 android.os;
-
-parcelable Message;
diff --git a/core/java/android/os/Message.java b/core/java/android/os/Message.java
deleted file mode 100644
index 4130109..0000000
--- a/core/java/android/os/Message.java
+++ /dev/null
@@ -1,405 +0,0 @@
-/*
- * 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 android.os;
-
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- *
- * Defines a message containing a description and arbitrary data object that can be
- * sent to a {@link Handler}. This object contains two extra int fields and an
- * extra object field that allow you to not do allocations in many cases.
- *
- * <p class="note">While the constructor of Message is public, the best way to get
- * one of these is to call {@link #obtain Message.obtain()} or one of the
- * {@link Handler#obtainMessage Handler.obtainMessage()} methods, which will pull
- * them from a pool of recycled objects.</p>
- */
-public final class Message implements Parcelable {
- /**
- * User-defined message code so that the recipient can identify
- * what this message is about. Each {@link Handler} has its own name-space
- * for message codes, so you do not need to worry about yours conflicting
- * with other handlers.
- */
- public int what;
-
- // Use these fields instead of using the class's Bundle if you can.
- /** arg1 and arg2 are lower-cost alternatives to using {@link #setData(Bundle) setData()}
- if you only need to store a few integer values. */
- public int arg1;
-
- /** arg1 and arg2 are lower-cost alternatives to using {@link #setData(Bundle) setData()}
- if you only need to store a few integer values.*/
- public int arg2;
-
- /** An arbitrary object to send to the recipient. This must be null when
- * sending messages across processes. */
- public Object obj;
-
- /** Optional Messenger where replies to this message can be sent.
- */
- public Messenger replyTo;
-
- /*package*/ long when;
-
- /*package*/ Bundle data;
-
- /*package*/ Handler target;
-
- /*package*/ Runnable callback;
-
- // sometimes we store linked lists of these things
- /*package*/ Message next;
-
- private static Object mPoolSync = new Object();
- private static Message mPool;
- private static int mPoolSize = 0;
-
- private static final int MAX_POOL_SIZE = 10;
-
- /**
- * Return a new Message instance from the global pool. Allows us to
- * avoid allocating new objects in many cases.
- */
- public static Message obtain() {
- synchronized (mPoolSync) {
- if (mPool != null) {
- Message m = mPool;
- mPool = m.next;
- m.next = null;
- return m;
- }
- }
- return new Message();
- }
-
- /**
- * Same as {@link #obtain()}, but copies the values of an existing
- * message (including its target) into the new one.
- * @param orig Original message to copy.
- * @return A Message object from the global pool.
- */
- public static Message obtain(Message orig) {
- Message m = obtain();
- m.what = orig.what;
- m.arg1 = orig.arg1;
- m.arg2 = orig.arg2;
- m.obj = orig.obj;
- m.replyTo = orig.replyTo;
- if (orig.data != null) {
- m.data = new Bundle(orig.data);
- }
- m.target = orig.target;
- m.callback = orig.callback;
-
- return m;
- }
-
- /**
- * Same as {@link #obtain()}, but sets the value for the <em>target</em> member on the Message returned.
- * @param h Handler to assign to the returned Message object's <em>target</em> member.
- * @return A Message object from the global pool.
- */
- public static Message obtain(Handler h) {
- Message m = obtain();
- m.target = h;
-
- return m;
- }
-
- /**
- * Same as {@link #obtain(Handler)}, but assigns a callback Runnable on
- * the Message that is returned.
- * @param h Handler to assign to the returned Message object's <em>target</em> member.
- * @param callback Runnable that will execute when the message is handled.
- * @return A Message object from the global pool.
- */
- public static Message obtain(Handler h, Runnable callback) {
- Message m = obtain();
- m.target = h;
- m.callback = callback;
-
- return m;
- }
-
- /**
- * Same as {@link #obtain()}, but sets the values for both <em>target</em> and
- * <em>what</em> members on the Message.
- * @param h Value to assign to the <em>target</em> member.
- * @param what Value to assign to the <em>what</em> member.
- * @return A Message object from the global pool.
- */
- public static Message obtain(Handler h, int what) {
- Message m = obtain();
- m.target = h;
- m.what = what;
-
- return m;
- }
-
- /**
- * Same as {@link #obtain()}, but sets the values of the <em>target</em>, <em>what</em>, and <em>obj</em>
- * members.
- * @param h The <em>target</em> value to set.
- * @param what The <em>what</em> value to set.
- * @param obj The <em>object</em> method to set.
- * @return A Message object from the global pool.
- */
- public static Message obtain(Handler h, int what, Object obj) {
- Message m = obtain();
- m.target = h;
- m.what = what;
- m.obj = obj;
-
- return m;
- }
-
- /**
- * Same as {@link #obtain()}, but sets the values of the <em>target</em>, <em>what</em>,
- * <em>arg1</em>, and <em>arg2</em> members.
- *
- * @param h The <em>target</em> value to set.
- * @param what The <em>what</em> value to set.
- * @param arg1 The <em>arg1</em> value to set.
- * @param arg2 The <em>arg2</em> value to set.
- * @return A Message object from the global pool.
- */
- public static Message obtain(Handler h, int what, int arg1, int arg2) {
- Message m = obtain();
- m.target = h;
- m.what = what;
- m.arg1 = arg1;
- m.arg2 = arg2;
-
- return m;
- }
-
- /**
- * Same as {@link #obtain()}, but sets the values of the <em>target</em>, <em>what</em>,
- * <em>arg1</em>, <em>arg2</em>, and <em>obj</em> members.
- *
- * @param h The <em>target</em> value to set.
- * @param what The <em>what</em> value to set.
- * @param arg1 The <em>arg1</em> value to set.
- * @param arg2 The <em>arg2</em> value to set.
- * @param obj The <em>obj</em> value to set.
- * @return A Message object from the global pool.
- */
- public static Message obtain(Handler h, int what,
- int arg1, int arg2, Object obj) {
- Message m = obtain();
- m.target = h;
- m.what = what;
- m.arg1 = arg1;
- m.arg2 = arg2;
- m.obj = obj;
-
- return m;
- }
-
- /**
- * Return a Message instance to the global pool. You MUST NOT touch
- * the Message after calling this function -- it has effectively been
- * freed.
- */
- public void recycle() {
- synchronized (mPoolSync) {
- if (mPoolSize < MAX_POOL_SIZE) {
- clearForRecycle();
-
- next = mPool;
- mPool = this;
- }
- }
- }
-
- /**
- * Make this message like o. Performs a shallow copy of the data field.
- * Does not copy the linked list fields, nor the timestamp or
- * target/callback of the original message.
- */
- public void copyFrom(Message o) {
- this.what = o.what;
- this.arg1 = o.arg1;
- this.arg2 = o.arg2;
- this.obj = o.obj;
- this.replyTo = o.replyTo;
-
- if (o.data != null) {
- this.data = (Bundle) o.data.clone();
- } else {
- this.data = null;
- }
- }
-
- /**
- * Return the targeted delivery time of this message, in milliseconds.
- */
- public long getWhen() {
- return when;
- }
-
- public void setTarget(Handler target) {
- this.target = target;
- }
-
- /**
- * Retrieve the a {@link android.os.Handler Handler} implementation that
- * will receive this message. The object must implement
- * {@link android.os.Handler#handleMessage(android.os.Message)
- * Handler.handleMessage()}. Each Handler has its own name-space for
- * message codes, so you do not need to
- * worry about yours conflicting with other handlers.
- */
- public Handler getTarget() {
- return target;
- }
-
- /**
- * Retrieve callback object that will execute when this message is handled.
- * This object must implement Runnable. This is called by
- * the <em>target</em> {@link Handler} that is receiving this Message to
- * dispatch it. If
- * not set, the message will be dispatched to the receiving Handler's
- * {@link Handler#handleMessage(Message Handler.handleMessage())}. */
- public Runnable getCallback() {
- return callback;
- }
-
- /**
- * Obtains a Bundle of arbitrary data associated with this
- * event, lazily creating it if necessary. Set this value by calling {@link #setData(Bundle)}.
- */
- public Bundle getData() {
- if (data == null) {
- data = new Bundle();
- }
-
- return data;
- }
-
- /**
- * Like getData(), but does not lazily create the Bundle. A null
- * is returned if the Bundle does not already exist.
- */
- public Bundle peekData() {
- return data;
- }
-
- /** Sets a Bundle of arbitrary data values. Use arg1 and arg1 members
- * as a lower cost way to send a few simple integer values, if you can. */
- public void setData(Bundle data) {
- this.data = data;
- }
-
- /**
- * Sends this Message to the Handler specified by {@link #getTarget}.
- * Throws a null pointer exception if this field has not been set.
- */
- public void sendToTarget() {
- target.sendMessage(this);
- }
-
- /*package*/ void clearForRecycle() {
- what = 0;
- arg1 = 0;
- arg2 = 0;
- obj = null;
- replyTo = null;
- when = 0;
- target = null;
- callback = null;
- data = null;
- }
-
- /** Constructor (but the preferred way to get a Message is to call {@link #obtain() Message.obtain()}).
- */
- public Message() {
- }
-
- public String toString() {
- StringBuilder b = new StringBuilder();
-
- b.append("{ what=");
- b.append(what);
-
- b.append(" when=");
- b.append(when);
-
- if (arg1 != 0) {
- b.append(" arg1=");
- b.append(arg1);
- }
-
- if (arg2 != 0) {
- b.append(" arg2=");
- b.append(arg2);
- }
-
- if (obj != null) {
- b.append(" obj=");
- b.append(obj);
- }
-
- b.append(" }");
-
- return b.toString();
- }
-
- public static final Parcelable.Creator<Message> CREATOR
- = new Parcelable.Creator<Message>() {
- public Message createFromParcel(Parcel source) {
- Message msg = Message.obtain();
- msg.readFromParcel(source);
- return msg;
- }
-
- public Message[] newArray(int size) {
- return new Message[size];
- }
- };
-
- public int describeContents() {
- return 0;
- }
-
- public void writeToParcel(Parcel dest, int flags) {
- if (obj != null || callback != null) {
- throw new RuntimeException(
- "Can't marshal objects across processes.");
- }
- dest.writeInt(what);
- dest.writeInt(arg1);
- dest.writeInt(arg2);
- dest.writeLong(when);
- dest.writeBundle(data);
- Messenger.writeMessengerOrNullToParcel(replyTo, dest);
- }
-
- private final void readFromParcel(Parcel source) {
- what = source.readInt();
- arg1 = source.readInt();
- arg2 = source.readInt();
- when = source.readLong();
- data = source.readBundle();
- replyTo = Messenger.readMessengerOrNullFromParcel(source);
- }
-}
-
diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java
deleted file mode 100644
index caf0923..0000000
--- a/core/java/android/os/MessageQueue.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * 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 android.os;
-
-import java.util.ArrayList;
-
-import android.util.AndroidRuntimeException;
-import android.util.Config;
-import android.util.Log;
-
-import com.android.internal.os.RuntimeInit;
-
-/**
- * Low-level class holding the list of messages to be dispatched by a
- * {@link Looper}. Messages are not added directly to a MessageQueue,
- * but rather through {@link Handler} objects associated with the Looper.
- *
- * <p>You can retrieve the MessageQueue for the current thread with
- * {@link Looper#myQueue() Looper.myQueue()}.
- */
-public class MessageQueue {
- Message mMessages;
- private final ArrayList mIdleHandlers = new ArrayList();
- private boolean mQuiting = false;
- boolean mQuitAllowed = true;
-
- /**
- * Callback interface for discovering when a thread is going to block
- * waiting for more messages.
- */
- public static interface IdleHandler {
- /**
- * Called when the message queue has run out of messages and will now
- * wait for more. Return true to keep your idle handler active, false
- * to have it removed. This may be called if there are still messages
- * pending in the queue, but they are all scheduled to be dispatched
- * after the current time.
- */
- boolean queueIdle();
- }
-
- /**
- * Add a new {@link IdleHandler} to this message queue. This may be
- * removed automatically for you by returning false from
- * {@link IdleHandler#queueIdle IdleHandler.queueIdle()} when it is
- * invoked, or explicitly removing it with {@link #removeIdleHandler}.
- *
- * <p>This method is safe to call from any thread.
- *
- * @param handler The IdleHandler to be added.
- */
- public final void addIdleHandler(IdleHandler handler) {
- if (handler == null) {
- throw new NullPointerException("Can't add a null IdleHandler");
- }
- synchronized (this) {
- mIdleHandlers.add(handler);
- }
- }
-
- /**
- * Remove an {@link IdleHandler} from the queue that was previously added
- * with {@link #addIdleHandler}. If the given object is not currently
- * in the idle list, nothing is done.
- *
- * @param handler The IdleHandler to be removed.
- */
- public final void removeIdleHandler(IdleHandler handler) {
- synchronized (this) {
- mIdleHandlers.remove(handler);
- }
- }
-
- MessageQueue() {
- }
-
- final Message next() {
- boolean tryIdle = true;
-
- while (true) {
- long now;
- Object[] idlers = null;
-
- // Try to retrieve the next message, returning if found.
- synchronized (this) {
- now = SystemClock.uptimeMillis();
- Message msg = pullNextLocked(now);
- if (msg != null) return msg;
- if (tryIdle && mIdleHandlers.size() > 0) {
- idlers = mIdleHandlers.toArray();
- }
- }
-
- // There was no message so we are going to wait... but first,
- // if there are any idle handlers let them know.
- boolean didIdle = false;
- if (idlers != null) {
- for (Object idler : idlers) {
- boolean keep = false;
- try {
- didIdle = true;
- keep = ((IdleHandler)idler).queueIdle();
- } catch (Throwable t) {
- Log.e("MessageQueue",
- "IdleHandler threw exception", t);
- RuntimeInit.crash("MessageQueue", t);
- }
-
- if (!keep) {
- synchronized (this) {
- mIdleHandlers.remove(idler);
- }
- }
- }
- }
-
- // While calling an idle handler, a new message could have been
- // delivered... so go back and look again for a pending message.
- if (didIdle) {
- tryIdle = false;
- continue;
- }
-
- synchronized (this) {
- // No messages, nobody to tell about it... time to wait!
- try {
- if (mMessages != null) {
- if (mMessages.when-now > 0) {
- Binder.flushPendingCommands();
- this.wait(mMessages.when-now);
- }
- } else {
- Binder.flushPendingCommands();
- this.wait();
- }
- }
- catch (InterruptedException e) {
- }
- }
- }
- }
-
- final Message pullNextLocked(long now) {
- Message msg = mMessages;
- if (msg != null) {
- if (now >= msg.when) {
- mMessages = msg.next;
- if (Config.LOGV) Log.v(
- "MessageQueue", "Returning message: " + msg);
- return msg;
- }
- }
-
- return null;
- }
-
- final boolean enqueueMessage(Message msg, long when) {
- if (msg.when != 0) {
- throw new AndroidRuntimeException(msg
- + " This message is already in use.");
- }
- if (msg.target == null && !mQuitAllowed) {
- throw new RuntimeException("Main thread not allowed to quit");
- }
- synchronized (this) {
- if (mQuiting) {
- RuntimeException e = new RuntimeException(
- msg.target + " sending message to a Handler on a dead thread");
- Log.w("MessageQueue", e.getMessage(), e);
- return false;
- } else if (msg.target == null) {
- mQuiting = true;
- }
-
- msg.when = when;
- //Log.d("MessageQueue", "Enqueing: " + msg);
- Message p = mMessages;
- if (p == null || when == 0 || when < p.when) {
- msg.next = p;
- mMessages = msg;
- this.notify();
- } else {
- Message prev = null;
- while (p != null && p.when <= when) {
- prev = p;
- p = p.next;
- }
- msg.next = prev.next;
- prev.next = msg;
- this.notify();
- }
- }
- return true;
- }
-
- final boolean removeMessages(Handler h, int what, Object object,
- boolean doRemove) {
- synchronized (this) {
- Message p = mMessages;
- boolean found = false;
-
- // Remove all messages at front.
- while (p != null && p.target == h && p.what == what
- && (object == null || p.obj == object)) {
- if (!doRemove) return true;
- found = true;
- Message n = p.next;
- mMessages = n;
- p.recycle();
- p = n;
- }
-
- // Remove all messages after front.
- while (p != null) {
- Message n = p.next;
- if (n != null) {
- if (n.target == h && n.what == what
- && (object == null || n.obj == object)) {
- if (!doRemove) return true;
- found = true;
- Message nn = n.next;
- n.recycle();
- p.next = nn;
- continue;
- }
- }
- p = n;
- }
-
- return found;
- }
- }
-
- final void removeMessages(Handler h, Runnable r, Object object) {
- if (r == null) {
- return;
- }
-
- synchronized (this) {
- Message p = mMessages;
-
- // Remove all messages at front.
- while (p != null && p.target == h && p.callback == r
- && (object == null || p.obj == object)) {
- Message n = p.next;
- mMessages = n;
- p.recycle();
- p = n;
- }
-
- // Remove all messages after front.
- while (p != null) {
- Message n = p.next;
- if (n != null) {
- if (n.target == h && n.callback == r
- && (object == null || n.obj == object)) {
- Message nn = n.next;
- n.recycle();
- p.next = nn;
- continue;
- }
- }
- p = n;
- }
- }
- }
-
- final void removeCallbacksAndMessages(Handler h, Object object) {
- synchronized (this) {
- Message p = mMessages;
-
- // Remove all messages at front.
- while (p != null && p.target == h
- && (object == null || p.obj == object)) {
- Message n = p.next;
- mMessages = n;
- p.recycle();
- p = n;
- }
-
- // Remove all messages after front.
- while (p != null) {
- Message n = p.next;
- if (n != null) {
- if (n.target == h && (object == null || n.obj == object)) {
- Message nn = n.next;
- n.recycle();
- p.next = nn;
- continue;
- }
- }
- p = n;
- }
- }
- }
-
- /*
- private void dumpQueue_l()
- {
- Message p = mMessages;
- System.out.println(this + " queue is:");
- while (p != null) {
- System.out.println(" " + p);
- p = p.next;
- }
- }
- */
-
- void poke()
- {
- synchronized (this) {
- this.notify();
- }
- }
-}
diff --git a/core/java/android/os/Messenger.aidl b/core/java/android/os/Messenger.aidl
deleted file mode 100644
index e6b8886..0000000
--- a/core/java/android/os/Messenger.aidl
+++ /dev/null
@@ -1,20 +0,0 @@
-/* //device/java/android/android/content/Intent.aidl
-**
-** Copyright 2007, 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 android.os;
-
-parcelable Messenger;
diff --git a/core/java/android/os/Messenger.java b/core/java/android/os/Messenger.java
deleted file mode 100644
index 1bc554e..0000000
--- a/core/java/android/os/Messenger.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * 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 android.os;
-
-/**
- * Reference to a Handler, which others can use to send messages to it.
- * This allows for the implementation of message-based communication across
- * processes, by creating a Messenger pointing to a Handler in one process,
- * and handing that Messenger to another process.
- */
-public final class Messenger implements Parcelable {
- private final IMessenger mTarget;
-
- /**
- * Create a new Messenger pointing to the given Handler. Any Message
- * objects sent through this Messenger will appear in the Handler as if
- * {@link Handler#sendMessage(Message) Handler.sendMessage(Message)} had
- * be called directly.
- *
- * @param target The Handler that will receive sent messages.
- */
- public Messenger(Handler target) {
- mTarget = target.getIMessenger();
- }
-
- /**
- * Send a Message to this Messenger's Handler.
- *
- * @param message The Message to send. Usually retrieved through
- * {@link Message#obtain() Message.obtain()}.
- *
- * @throws RemoteException Throws DeadObjectException if the target
- * Handler no longer exists.
- */
- public void send(Message message) throws RemoteException {
- mTarget.send(message);
- }
-
- /**
- * Retrieve the IBinder that this Messenger is using to communicate with
- * its associated Handler.
- *
- * @return Returns the IBinder backing this Messenger.
- */
- public IBinder getBinder() {
- return mTarget.asBinder();
- }
-
- /**
- * Comparison operator on two Messenger objects, such that true
- * is returned then they both point to the same Handler.
- */
- public boolean equals(Object otherObj) {
- if (otherObj == null) {
- return false;
- }
- try {
- return mTarget.asBinder().equals(((Messenger)otherObj)
- .mTarget.asBinder());
- } catch (ClassCastException e) {
- }
- return false;
- }
-
- public int hashCode() {
- return mTarget.asBinder().hashCode();
- }
-
- public int describeContents() {
- return 0;
- }
-
- public void writeToParcel(Parcel out, int flags) {
- out.writeStrongBinder(mTarget.asBinder());
- }
-
- public static final Parcelable.Creator<Messenger> CREATOR
- = new Parcelable.Creator<Messenger>() {
- public Messenger createFromParcel(Parcel in) {
- IBinder target = in.readStrongBinder();
- return target != null ? new Messenger(target) : null;
- }
-
- public Messenger[] newArray(int size) {
- return new Messenger[size];
- }
- };
-
- /**
- * Convenience function for writing either a Messenger or null pointer to
- * a Parcel. You must use this with {@link #readMessengerOrNullFromParcel}
- * for later reading it.
- *
- * @param messenger The Messenger to write, or null.
- * @param out Where to write the Messenger.
- */
- public static void writeMessengerOrNullToParcel(Messenger messenger,
- Parcel out) {
- out.writeStrongBinder(messenger != null ? messenger.mTarget.asBinder()
- : null);
- }
-
- /**
- * Convenience function for reading either a Messenger or null pointer from
- * a Parcel. You must have previously written the Messenger with
- * {@link #writeMessengerOrNullToParcel}.
- *
- * @param in The Parcel containing the written Messenger.
- *
- * @return Returns the Messenger read from the Parcel, or null if null had
- * been written.
- */
- public static Messenger readMessengerOrNullFromParcel(Parcel in) {
- IBinder b = in.readStrongBinder();
- return b != null ? new Messenger(b) : null;
- }
-
- /**
- * Create a Messenger from a raw IBinder, which had previously been
- * retrieved with {@link #getBinder}.
- *
- * @param target The IBinder this Messenger should communicate with.
- */
- public Messenger(IBinder target) {
- mTarget = IMessenger.Stub.asInterface(target);
- }
-}
diff --git a/core/java/android/os/NetStat.java b/core/java/android/os/NetStat.java
deleted file mode 100644
index 733137a..0000000
--- a/core/java/android/os/NetStat.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 2007 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 android.os;
-
-import android.util.Log;
-
-import java.io.File;
-import java.io.RandomAccessFile;
-import java.io.IOException;
-
-/** @hide */
-public class NetStat{
-
- /**
- * Get total number of tx packets sent through rmnet0 or ppp0
- *
- * @return number of Tx packets through rmnet0 or ppp0
- */
- public static long getMobileTxPkts() {
- return getMobileStat("tx_packets");
- }
-
- /**
- * Get total number of rx packets received through rmnet0 or ppp0
- *
- * @return number of Rx packets through rmnet0 or ppp0
- */
- public static long getMobileRxPkts() {
- return getMobileStat("rx_packets");
- }
-
- /**
- * Get total number of tx bytes received through rmnet0 or ppp0
- *
- * @return number of Tx bytes through rmnet0 or ppp0
- */
- public static long getMobileTxBytes() {
- return getMobileStat("tx_bytes");
- }
-
- /**
- * Get total number of rx bytes received through rmnet0 or ppp0
- *
- * @return number of Rx bytes through rmnet0 or ppp0
- */
- public static long getMobileRxBytes() {
- return getMobileStat("rx_bytes");
- }
-
- /**
- * Get the total number of packets sent through all network interfaces.
- *
- * @return the number of packets sent through all network interfaces
- */
- public static long getTotalTxPkts() {
- return getTotalStat("tx_packets");
- }
-
- /**
- * Get the total number of packets received through all network interfaces.
- *
- * @return the number of packets received through all network interfaces
- */
- public static long getTotalRxPkts() {
- return getTotalStat("rx_packets");
- }
-
- /**
- * Get the total number of bytes sent through all network interfaces.
- *
- * @return the number of bytes sent through all network interfaces
- */
- public static long getTotalTxBytes() {
- return getTotalStat("tx_bytes");
- }
-
- /**
- * Get the total number of bytes received through all network interfaces.
- *
- * @return the number of bytes received through all network interfaces
- */
- public static long getTotalRxBytes() {
- return getTotalStat("rx_bytes");
- }
-
- /**
- * Gets network bytes sent for this UID.
- * The statistics are across all interfaces.
- * The statistics come from /proc/uid_stat.
- *
- * {@see android.os.Process#myUid()}.
- *
- * @param uid
- * @return byte count
- */
- public static long getUidTxBytes(int uid) {
- return getNumberFromFilePath("/proc/uid_stat/" + uid + "/tcp_snd");
- }
-
- /**
- * Gets network bytes received for this UID.
- * The statistics are across all interfaces.
- * The statistics come from /proc/uid_stat.
- *
- * {@see android.os.Process#myUid()}.
- *
- * @param uid
- * @return byte count
- */
- public static long getUidRxBytes(int uid) {
- return getNumberFromFilePath("/proc/uid_stat/" + uid + "/tcp_rcv");
- }
-
- private static String TAG = "netstat";
- private static final byte[] buf = new byte[16];
-
- private static long getTotalStat(String whatStat) {
- File netdir = new File("/sys/class/net");
-
- File[] nets = netdir.listFiles();
- if (nets == null) {
- return 0;
- }
- long total = 0;
- StringBuffer strbuf = new StringBuffer();
- for (File net : nets) {
- strbuf.append(net.getPath()).append(File.separator).append("statistics")
- .append(File.separator).append(whatStat);
- total += getNumberFromFilePath(strbuf.toString());
- strbuf.setLength(0);
- }
- return total;
- }
-
- private static long getMobileStat(String whatStat) {
- String filename = "/sys/class/net/rmnet0/statistics/" + whatStat;
- RandomAccessFile raf = getFile(filename);
- if (raf == null) {
- filename = "/sys/class/net/ppp0/statistics/" + whatStat;
- raf = getFile(filename);
- }
- if (raf == null) {
- return 0L;
- }
- return getNumberFromFile(raf, filename);
- }
-
- // File will have format <number><newline>
- private static long getNumberFromFilePath(String filename) {
- RandomAccessFile raf = getFile(filename);
- if (raf == null) {
- return 0L;
- }
- return getNumberFromFile(raf, filename);
- }
-
- private static synchronized long getNumberFromFile(RandomAccessFile raf, String filename) {
- try {
- raf.read(buf);
- raf.close();
- } catch (IOException e) {
- Log.w(TAG, "Exception getting TCP bytes from " + filename, e);
- return 0L;
- } finally {
- if (raf != null) {
- try {
- raf.close();
- } catch (IOException e) {
- Log.w(TAG, "Exception closing " + filename, e);
- }
- }
- }
-
- long num = 0L;
- for (int i = 0; i < buf.length; i++) {
- if (buf[i] < '0' || buf[i] > '9') {
- break;
- }
- num *= 10;
- num += buf[i] - '0';
- }
- return num;
- }
-
- private static RandomAccessFile getFile(String filename) {
- File f = new File(filename);
- if (!f.canRead()) {
- return null;
- }
-
- try {
- return new RandomAccessFile(f, "r");
- } catch (IOException e) {
- Log.w(TAG, "Exception opening TCP statistics file " + filename, e);
- return null;
- }
- }
-}
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
deleted file mode 100644
index 9a71f6e..0000000
--- a/core/java/android/os/Parcel.java
+++ /dev/null
@@ -1,2051 +0,0 @@
-/*
- * 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 android.os;
-
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.SparseArray;
-import android.util.SparseBooleanArray;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.FileDescriptor;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Container for a message (data and object references) that can
- * be sent through an IBinder. A Parcel can contain both flattened data
- * that will be unflattened on the other side of the IPC (using the various
- * methods here for writing specific types, or the general
- * {@link Parcelable} interface), and references to live {@link IBinder}
- * objects that will result in the other side receiving a proxy IBinder
- * connected with the original IBinder in the Parcel.
- *
- * <p class="note">Parcel is <strong>not</strong> a general-purpose
- * serialization mechanism. This class (and the corresponding
- * {@link Parcelable} API for placing arbitrary objects into a Parcel) is
- * designed as a high-performance IPC transport. As such, it is not
- * appropriate to place any Parcel data in to persistent storage: changes
- * in the underlying implementation of any of the data in the Parcel can
- * render older data unreadable.</p>
- *
- * <p>The bulk of the Parcel API revolves around reading and writing data
- * of various types. There are six major classes of such functions available.</p>
- *
- * <h3>Primitives</h3>
- *
- * <p>The most basic data functions are for writing and reading primitive
- * data types: {@link #writeByte}, {@link #readByte}, {@link #writeDouble},
- * {@link #readDouble}, {@link #writeFloat}, {@link #readFloat}, {@link #writeInt},
- * {@link #readInt}, {@link #writeLong}, {@link #readLong},
- * {@link #writeString}, {@link #readString}. Most other
- * data operations are built on top of these. The given data is written and
- * read using the endianess of the host CPU.</p>
- *
- * <h3>Primitive Arrays</h3>
- *
- * <p>There are a variety of methods for reading and writing raw arrays
- * of primitive objects, which generally result in writing a 4-byte length
- * followed by the primitive data items. The methods for reading can either
- * read the data into an existing array, or create and return a new array.
- * These available types are:</p>
- *
- * <ul>
- * <li> {@link #writeBooleanArray(boolean[])},
- * {@link #readBooleanArray(boolean[])}, {@link #createBooleanArray()}
- * <li> {@link #writeByteArray(byte[])},
- * {@link #writeByteArray(byte[], int, int)}, {@link #readByteArray(byte[])},
- * {@link #createByteArray()}
- * <li> {@link #writeCharArray(char[])}, {@link #readCharArray(char[])},
- * {@link #createCharArray()}
- * <li> {@link #writeDoubleArray(double[])}, {@link #readDoubleArray(double[])},
- * {@link #createDoubleArray()}
- * <li> {@link #writeFloatArray(float[])}, {@link #readFloatArray(float[])},
- * {@link #createFloatArray()}
- * <li> {@link #writeIntArray(int[])}, {@link #readIntArray(int[])},
- * {@link #createIntArray()}
- * <li> {@link #writeLongArray(long[])}, {@link #readLongArray(long[])},
- * {@link #createLongArray()}
- * <li> {@link #writeStringArray(String[])}, {@link #readStringArray(String[])},
- * {@link #createStringArray()}.
- * <li> {@link #writeSparseBooleanArray(SparseBooleanArray)},
- * {@link #readSparseBooleanArray()}.
- * </ul>
- *
- * <h3>Parcelables</h3>
- *
- * <p>The {@link Parcelable} protocol provides an extremely efficient (but
- * low-level) protocol for objects to write and read themselves from Parcels.
- * You can use the direct methods {@link #writeParcelable(Parcelable, int)}
- * and {@link #readParcelable(ClassLoader)} or
- * {@link #writeParcelableArray} and
- * {@link #readParcelableArray(ClassLoader)} to write or read. These
- * methods write both the class type and its data to the Parcel, allowing
- * that class to be reconstructed from the appropriate class loader when
- * later reading.</p>
- *
- * <p>There are also some methods that provide a more efficient way to work
- * with Parcelables: {@link #writeTypedArray},
- * {@link #writeTypedList(List)},
- * {@link #readTypedArray} and {@link #readTypedList}. These methods
- * do not write the class information of the original object: instead, the
- * caller of the read function must know what type to expect and pass in the
- * appropriate {@link Parcelable.Creator Parcelable.Creator} instead to
- * properly construct the new object and read its data. (To more efficient
- * write and read a single Parceable object, you can directly call
- * {@link Parcelable#writeToParcel Parcelable.writeToParcel} and
- * {@link Parcelable.Creator#createFromParcel Parcelable.Creator.createFromParcel}
- * yourself.)</p>
- *
- * <h3>Bundles</h3>
- *
- * <p>A special type-safe container, called {@link Bundle}, is available
- * for key/value maps of heterogeneous values. This has many optimizations
- * for improved performance when reading and writing data, and its type-safe
- * API avoids difficult to debug type errors when finally marshalling the
- * data contents into a Parcel. The methods to use are
- * {@link #writeBundle(Bundle)}, {@link #readBundle()}, and
- * {@link #readBundle(ClassLoader)}.
- *
- * <h3>Active Objects</h3>
- *
- * <p>An unusual feature of Parcel is the ability to read and write active
- * objects. For these objects the actual contents of the object is not
- * written, rather a special token referencing the object is written. When
- * reading the object back from the Parcel, you do not get a new instance of
- * the object, but rather a handle that operates on the exact same object that
- * was originally written. There are two forms of active objects available.</p>
- *
- * <p>{@link Binder} objects are a core facility of Android's general cross-process
- * communication system. The {@link IBinder} interface describes an abstract
- * protocol with a Binder object. Any such interface can be written in to
- * a Parcel, and upon reading you will receive either the original object
- * implementing that interface or a special proxy implementation
- * that communicates calls back to the original object. The methods to use are
- * {@link #writeStrongBinder(IBinder)},
- * {@link #writeStrongInterface(IInterface)}, {@link #readStrongBinder()},
- * {@link #writeBinderArray(IBinder[])}, {@link #readBinderArray(IBinder[])},
- * {@link #createBinderArray()},
- * {@link #writeBinderList(List)}, {@link #readBinderList(List)},
- * {@link #createBinderArrayList()}.</p>
- *
- * <p>FileDescriptor objects, representing raw Linux file descriptor identifiers,
- * can be written and {@link ParcelFileDescriptor} objects returned to operate
- * on the original file descriptor. The returned file descriptor is a dup
- * of the original file descriptor: the object and fd is different, but
- * operating on the same underlying file stream, with the same position, etc.
- * The methods to use are {@link #writeFileDescriptor(FileDescriptor)},
- * {@link #readFileDescriptor()}.
- *
- * <h3>Untyped Containers</h3>
- *
- * <p>A final class of methods are for writing and reading standard Java
- * containers of arbitrary types. These all revolve around the
- * {@link #writeValue(Object)} and {@link #readValue(ClassLoader)} methods
- * which define the types of objects allowed. The container methods are
- * {@link #writeArray(Object[])}, {@link #readArray(ClassLoader)},
- * {@link #writeList(List)}, {@link #readList(List, ClassLoader)},
- * {@link #readArrayList(ClassLoader)},
- * {@link #writeMap(Map)}, {@link #readMap(Map, ClassLoader)},
- * {@link #writeSparseArray(SparseArray)},
- * {@link #readSparseArray(ClassLoader)}.
- */
-public final class Parcel {
- private static final boolean DEBUG_RECYCLE = false;
-
- @SuppressWarnings({"UnusedDeclaration"})
- private int mObject; // used by native code
- @SuppressWarnings({"UnusedDeclaration"})
- private int mOwnObject; // used by native code
- private RuntimeException mStack;
-
- private static final int POOL_SIZE = 6;
- private static final Parcel[] sOwnedPool = new Parcel[POOL_SIZE];
- private static final Parcel[] sHolderPool = new Parcel[POOL_SIZE];
-
- private static final int VAL_NULL = -1;
- private static final int VAL_STRING = 0;
- private static final int VAL_INTEGER = 1;
- private static final int VAL_MAP = 2;
- private static final int VAL_BUNDLE = 3;
- private static final int VAL_PARCELABLE = 4;
- private static final int VAL_SHORT = 5;
- private static final int VAL_LONG = 6;
- private static final int VAL_FLOAT = 7;
- private static final int VAL_DOUBLE = 8;
- private static final int VAL_BOOLEAN = 9;
- private static final int VAL_CHARSEQUENCE = 10;
- private static final int VAL_LIST = 11;
- private static final int VAL_SPARSEARRAY = 12;
- private static final int VAL_BYTEARRAY = 13;
- private static final int VAL_STRINGARRAY = 14;
- private static final int VAL_IBINDER = 15;
- private static final int VAL_PARCELABLEARRAY = 16;
- private static final int VAL_OBJECTARRAY = 17;
- private static final int VAL_INTARRAY = 18;
- private static final int VAL_LONGARRAY = 19;
- private static final int VAL_BYTE = 20;
- private static final int VAL_SERIALIZABLE = 21;
- private static final int VAL_SPARSEBOOLEANARRAY = 22;
- private static final int VAL_BOOLEANARRAY = 23;
-
- private static final int EX_SECURITY = -1;
- private static final int EX_BAD_PARCELABLE = -2;
- private static final int EX_ILLEGAL_ARGUMENT = -3;
- private static final int EX_NULL_POINTER = -4;
- private static final int EX_ILLEGAL_STATE = -5;
-
- public final static Parcelable.Creator<String> STRING_CREATOR
- = new Parcelable.Creator<String>() {
- public String createFromParcel(Parcel source) {
- return source.readString();
- }
- public String[] newArray(int size) {
- return new String[size];
- }
- };
-
- /**
- * Retrieve a new Parcel object from the pool.
- */
- public static Parcel obtain() {
- final Parcel[] pool = sOwnedPool;
- synchronized (pool) {
- Parcel p;
- for (int i=0; i<POOL_SIZE; i++) {
- p = pool[i];
- if (p != null) {
- pool[i] = null;
- if (DEBUG_RECYCLE) {
- p.mStack = new RuntimeException();
- }
- return p;
- }
- }
- }
- return new Parcel(0);
- }
-
- /**
- * Put a Parcel object back into the pool. You must not touch
- * the object after this call.
- */
- public final void recycle() {
- if (DEBUG_RECYCLE) mStack = null;
- freeBuffer();
- final Parcel[] pool = mOwnObject != 0 ? sOwnedPool : sHolderPool;
- synchronized (pool) {
- for (int i=0; i<POOL_SIZE; i++) {
- if (pool[i] == null) {
- pool[i] = this;
- return;
- }
- }
- }
- }
-
- /**
- * Returns the total amount of data contained in the parcel.
- */
- public final native int dataSize();
-
- /**
- * Returns the amount of data remaining to be read from the
- * parcel. That is, {@link #dataSize}-{@link #dataPosition}.
- */
- public final native int dataAvail();
-
- /**
- * Returns the current position in the parcel data. Never
- * more than {@link #dataSize}.
- */
- public final native int dataPosition();
-
- /**
- * Returns the total amount of space in the parcel. This is always
- * >= {@link #dataSize}. The difference between it and dataSize() is the
- * amount of room left until the parcel needs to re-allocate its
- * data buffer.
- */
- public final native int dataCapacity();
-
- /**
- * Change the amount of data in the parcel. Can be either smaller or
- * larger than the current size. If larger than the current capacity,
- * more memory will be allocated.
- *
- * @param size The new number of bytes in the Parcel.
- */
- public final native void setDataSize(int size);
-
- /**
- * Move the current read/write position in the parcel.
- * @param pos New offset in the parcel; must be between 0 and
- * {@link #dataSize}.
- */
- public final native void setDataPosition(int pos);
-
- /**
- * Change the capacity (current available space) of the parcel.
- *
- * @param size The new capacity of the parcel, in bytes. Can not be
- * less than {@link #dataSize} -- that is, you can not drop existing data
- * with this method.
- */
- public final native void setDataCapacity(int size);
-
- /**
- * Returns the raw bytes of the parcel.
- *
- * <p class="note">The data you retrieve here <strong>must not</strong>
- * be placed in any kind of persistent storage (on local disk, across
- * a network, etc). For that, you should use standard serialization
- * or another kind of general serialization mechanism. The Parcel
- * marshalled representation is highly optimized for local IPC, and as
- * such does not attempt to maintain compatibility with data created
- * in different versions of the platform.
- */
- public final native byte[] marshall();
-
- /**
- * Set the bytes in data to be the raw bytes of this Parcel.
- */
- public final native void unmarshall(byte[] data, int offest, int length);
-
- public final native void appendFrom(Parcel parcel, int offset, int length);
-
- /**
- * Report whether the parcel contains any marshalled file descriptors.
- */
- public final native boolean hasFileDescriptors();
-
- /**
- * Store or read an IBinder interface token in the parcel at the current
- * {@link #dataPosition}. This is used to validate that the marshalled
- * transaction is intended for the target interface.
- */
- public final native void writeInterfaceToken(String interfaceName);
- public final native void enforceInterface(String interfaceName);
-
- /**
- * Write a byte array into the parcel at the current {#link #dataPosition},
- * growing {@link #dataCapacity} if needed.
- * @param b Bytes to place into the parcel.
- */
- public final void writeByteArray(byte[] b) {
- writeByteArray(b, 0, (b != null) ? b.length : 0);
- }
-
- /**
- * Write an byte array into the parcel at the current {#link #dataPosition},
- * growing {@link #dataCapacity} if needed.
- * @param b Bytes to place into the parcel.
- * @param offset Index of first byte to be written.
- * @param len Number of bytes to write.
- */
- public final void writeByteArray(byte[] b, int offset, int len) {
- if (b == null) {
- writeInt(-1);
- return;
- }
- if (b.length < offset + len || len < 0 || offset < 0) {
- throw new ArrayIndexOutOfBoundsException();
- }
- writeNative(b, offset, len);
- }
-
- private native void writeNative(byte[] b, int offset, int len);
-
- /**
- * Write an integer value into the parcel at the current dataPosition(),
- * growing dataCapacity() if needed.
- */
- public final native void writeInt(int val);
-
- /**
- * Write a long integer value into the parcel at the current dataPosition(),
- * growing dataCapacity() if needed.
- */
- public final native void writeLong(long val);
-
- /**
- * Write a floating point value into the parcel at the current
- * dataPosition(), growing dataCapacity() if needed.
- */
- public final native void writeFloat(float val);
-
- /**
- * Write a double precision floating point value into the parcel at the
- * current dataPosition(), growing dataCapacity() if needed.
- */
- public final native void writeDouble(double val);
-
- /**
- * Write a string value into the parcel at the current dataPosition(),
- * growing dataCapacity() if needed.
- */
- public final native void writeString(String val);
-
- /**
- * Write an object into the parcel at the current dataPosition(),
- * growing dataCapacity() if needed.
- */
- public final native void writeStrongBinder(IBinder val);
-
- /**
- * Write an object into the parcel at the current dataPosition(),
- * growing dataCapacity() if needed.
- */
- public final void writeStrongInterface(IInterface val) {
- writeStrongBinder(val == null ? null : val.asBinder());
- }
-
- /**
- * Write a FileDescriptor into the parcel at the current dataPosition(),
- * growing dataCapacity() if needed.
- */
- public final native void writeFileDescriptor(FileDescriptor val);
-
- /**
- * Write an byte value into the parcel at the current dataPosition(),
- * growing dataCapacity() if needed.
- */
- public final void writeByte(byte val) {
- writeInt(val);
- }
-
- /**
- * Please use {@link #writeBundle} instead. Flattens a Map into the parcel
- * at the current dataPosition(),
- * growing dataCapacity() if needed. The Map keys must be String objects.
- * The Map values are written using {@link #writeValue} and must follow
- * the specification there.
- *
- * <p>It is strongly recommended to use {@link #writeBundle} instead of
- * this method, since the Bundle class provides a type-safe API that
- * allows you to avoid mysterious type errors at the point of marshalling.
- */
- public final void writeMap(Map val) {
- writeMapInternal((Map<String,Object>) val);
- }
-
- /**
- * Flatten a Map into the parcel at the current dataPosition(),
- * growing dataCapacity() if needed. The Map keys must be String objects.
- */
- private void writeMapInternal(Map<String,Object> val) {
- if (val == null) {
- writeInt(-1);
- return;
- }
- Set<Map.Entry<String,Object>> entries = val.entrySet();
- writeInt(entries.size());
- for (Map.Entry<String,Object> e : entries) {
- writeValue(e.getKey());
- writeValue(e.getValue());
- }
- }
-
- /**
- * Flatten a Bundle into the parcel at the current dataPosition(),
- * growing dataCapacity() if needed.
- */
- public final void writeBundle(Bundle val) {
- if (val == null) {
- writeInt(-1);
- return;
- }
-
- if (val.mParcelledData != null) {
- int length = val.mParcelledData.dataSize();
- appendFrom(val.mParcelledData, 0, length);
- } else {
- writeInt(-1); // dummy, will hold length
- int oldPos = dataPosition();
- writeInt(0x4C444E42); // 'B' 'N' 'D' 'L'
-
- writeMapInternal(val.mMap);
- int newPos = dataPosition();
-
- // Backpatch length
- setDataPosition(oldPos - 4);
- int length = newPos - oldPos;
- writeInt(length);
- setDataPosition(newPos);
- }
- }
-
- /**
- * Flatten a List into the parcel at the current dataPosition(), growing
- * dataCapacity() if needed. The List values are written using
- * {@link #writeValue} and must follow the specification there.
- */
- public final void writeList(List val) {
- if (val == null) {
- writeInt(-1);
- return;
- }
- int N = val.size();
- int i=0;
- writeInt(N);
- while (i < N) {
- writeValue(val.get(i));
- i++;
- }
- }
-
- /**
- * Flatten an Object array into the parcel at the current dataPosition(),
- * growing dataCapacity() if needed. The array values are written using
- * {@link #writeValue} and must follow the specification there.
- */
- public final void writeArray(Object[] val) {
- if (val == null) {
- writeInt(-1);
- return;
- }
- int N = val.length;
- int i=0;
- writeInt(N);
- while (i < N) {
- writeValue(val[i]);
- i++;
- }
- }
-
- /**
- * Flatten a generic SparseArray into the parcel at the current
- * dataPosition(), growing dataCapacity() if needed. The SparseArray
- * values are written using {@link #writeValue} and must follow the
- * specification there.
- */
- public final void writeSparseArray(SparseArray<Object> val) {
- if (val == null) {
- writeInt(-1);
- return;
- }
- int N = val.size();
- writeInt(N);
- int i=0;
- while (i < N) {
- writeInt(val.keyAt(i));
- writeValue(val.valueAt(i));
- i++;
- }
- }
-
- public final void writeSparseBooleanArray(SparseBooleanArray val) {
- if (val == null) {
- writeInt(-1);
- return;
- }
- int N = val.size();
- writeInt(N);
- int i=0;
- while (i < N) {
- writeInt(val.keyAt(i));
- writeByte((byte)(val.valueAt(i) ? 1 : 0));
- i++;
- }
- }
-
- public final void writeBooleanArray(boolean[] val) {
- if (val != null) {
- int N = val.length;
- writeInt(N);
- for (int i=0; i<N; i++) {
- writeInt(val[i] ? 1 : 0);
- }
- } else {
- writeInt(-1);
- }
- }
-
- public final boolean[] createBooleanArray() {
- int N = readInt();
- // >>2 as a fast divide-by-4 works in the create*Array() functions
- // because dataAvail() will never return a negative number. 4 is
- // the size of a stored boolean in the stream.
- if (N >= 0 && N <= (dataAvail() >> 2)) {
- boolean[] val = new boolean[N];
- for (int i=0; i<N; i++) {
- val[i] = readInt() != 0;
- }
- return val;
- } else {
- return null;
- }
- }
-
- public final void readBooleanArray(boolean[] val) {
- int N = readInt();
- if (N == val.length) {
- for (int i=0; i<N; i++) {
- val[i] = readInt() != 0;
- }
- } else {
- throw new RuntimeException("bad array lengths");
- }
- }
-
- public final void writeCharArray(char[] val) {
- if (val != null) {
- int N = val.length;
- writeInt(N);
- for (int i=0; i<N; i++) {
- writeInt((int)val[i]);
- }
- } else {
- writeInt(-1);
- }
- }
-
- public final char[] createCharArray() {
- int N = readInt();
- if (N >= 0 && N <= (dataAvail() >> 2)) {
- char[] val = new char[N];
- for (int i=0; i<N; i++) {
- val[i] = (char)readInt();
- }
- return val;
- } else {
- return null;
- }
- }
-
- public final void readCharArray(char[] val) {
- int N = readInt();
- if (N == val.length) {
- for (int i=0; i<N; i++) {
- val[i] = (char)readInt();
- }
- } else {
- throw new RuntimeException("bad array lengths");
- }
- }
-
- public final void writeIntArray(int[] val) {
- if (val != null) {
- int N = val.length;
- writeInt(N);
- for (int i=0; i<N; i++) {
- writeInt(val[i]);
- }
- } else {
- writeInt(-1);
- }
- }
-
- public final int[] createIntArray() {
- int N = readInt();
- if (N >= 0 && N <= (dataAvail() >> 2)) {
- int[] val = new int[N];
- for (int i=0; i<N; i++) {
- val[i] = readInt();
- }
- return val;
- } else {
- return null;
- }
- }
-
- public final void readIntArray(int[] val) {
- int N = readInt();
- if (N == val.length) {
- for (int i=0; i<N; i++) {
- val[i] = readInt();
- }
- } else {
- throw new RuntimeException("bad array lengths");
- }
- }
-
- public final void writeLongArray(long[] val) {
- if (val != null) {
- int N = val.length;
- writeInt(N);
- for (int i=0; i<N; i++) {
- writeLong(val[i]);
- }
- } else {
- writeInt(-1);
- }
- }
-
- public final long[] createLongArray() {
- int N = readInt();
- // >>3 because stored longs are 64 bits
- if (N >= 0 && N <= (dataAvail() >> 3)) {
- long[] val = new long[N];
- for (int i=0; i<N; i++) {
- val[i] = readLong();
- }
- return val;
- } else {
- return null;
- }
- }
-
- public final void readLongArray(long[] val) {
- int N = readInt();
- if (N == val.length) {
- for (int i=0; i<N; i++) {
- val[i] = readLong();
- }
- } else {
- throw new RuntimeException("bad array lengths");
- }
- }
-
- public final void writeFloatArray(float[] val) {
- if (val != null) {
- int N = val.length;
- writeInt(N);
- for (int i=0; i<N; i++) {
- writeFloat(val[i]);
- }
- } else {
- writeInt(-1);
- }
- }
-
- public final float[] createFloatArray() {
- int N = readInt();
- // >>2 because stored floats are 4 bytes
- if (N >= 0 && N <= (dataAvail() >> 2)) {
- float[] val = new float[N];
- for (int i=0; i<N; i++) {
- val[i] = readFloat();
- }
- return val;
- } else {
- return null;
- }
- }
-
- public final void readFloatArray(float[] val) {
- int N = readInt();
- if (N == val.length) {
- for (int i=0; i<N; i++) {
- val[i] = readFloat();
- }
- } else {
- throw new RuntimeException("bad array lengths");
- }
- }
-
- public final void writeDoubleArray(double[] val) {
- if (val != null) {
- int N = val.length;
- writeInt(N);
- for (int i=0; i<N; i++) {
- writeDouble(val[i]);
- }
- } else {
- writeInt(-1);
- }
- }
-
- public final double[] createDoubleArray() {
- int N = readInt();
- // >>3 because stored doubles are 8 bytes
- if (N >= 0 && N <= (dataAvail() >> 3)) {
- double[] val = new double[N];
- for (int i=0; i<N; i++) {
- val[i] = readDouble();
- }
- return val;
- } else {
- return null;
- }
- }
-
- public final void readDoubleArray(double[] val) {
- int N = readInt();
- if (N == val.length) {
- for (int i=0; i<N; i++) {
- val[i] = readDouble();
- }
- } else {
- throw new RuntimeException("bad array lengths");
- }
- }
-
- public final void writeStringArray(String[] val) {
- if (val != null) {
- int N = val.length;
- writeInt(N);
- for (int i=0; i<N; i++) {
- writeString(val[i]);
- }
- } else {
- writeInt(-1);
- }
- }
-
- public final String[] createStringArray() {
- int N = readInt();
- if (N >= 0) {
- String[] val = new String[N];
- for (int i=0; i<N; i++) {
- val[i] = readString();
- }
- return val;
- } else {
- return null;
- }
- }
-
- public final void readStringArray(String[] val) {
- int N = readInt();
- if (N == val.length) {
- for (int i=0; i<N; i++) {
- val[i] = readString();
- }
- } else {
- throw new RuntimeException("bad array lengths");
- }
- }
-
- public final void writeBinderArray(IBinder[] val) {
- if (val != null) {
- int N = val.length;
- writeInt(N);
- for (int i=0; i<N; i++) {
- writeStrongBinder(val[i]);
- }
- } else {
- writeInt(-1);
- }
- }
-
- public final IBinder[] createBinderArray() {
- int N = readInt();
- if (N >= 0) {
- IBinder[] val = new IBinder[N];
- for (int i=0; i<N; i++) {
- val[i] = readStrongBinder();
- }
- return val;
- } else {
- return null;
- }
- }
-
- public final void readBinderArray(IBinder[] val) {
- int N = readInt();
- if (N == val.length) {
- for (int i=0; i<N; i++) {
- val[i] = readStrongBinder();
- }
- } else {
- throw new RuntimeException("bad array lengths");
- }
- }
-
- /**
- * Flatten a List containing a particular object type into the parcel, at
- * the current dataPosition() and growing dataCapacity() if needed. The
- * type of the objects in the list must be one that implements Parcelable.
- * Unlike the generic writeList() method, however, only the raw data of the
- * objects is written and not their type, so you must use the corresponding
- * readTypedList() to unmarshall them.
- *
- * @param val The list of objects to be written.
- *
- * @see #createTypedArrayList
- * @see #readTypedList
- * @see Parcelable
- */
- public final <T extends Parcelable> void writeTypedList(List<T> val) {
- if (val == null) {
- writeInt(-1);
- return;
- }
- int N = val.size();
- int i=0;
- writeInt(N);
- while (i < N) {
- T item = val.get(i);
- if (item != null) {
- writeInt(1);
- item.writeToParcel(this, 0);
- } else {
- writeInt(0);
- }
- i++;
- }
- }
-
- /**
- * Flatten a List containing String objects into the parcel, at
- * the current dataPosition() and growing dataCapacity() if needed. They
- * can later be retrieved with {@link #createStringArrayList} or
- * {@link #readStringList}.
- *
- * @param val The list of strings to be written.
- *
- * @see #createStringArrayList
- * @see #readStringList
- */
- public final void writeStringList(List<String> val) {
- if (val == null) {
- writeInt(-1);
- return;
- }
- int N = val.size();
- int i=0;
- writeInt(N);
- while (i < N) {
- writeString(val.get(i));
- i++;
- }
- }
-
- /**
- * Flatten a List containing IBinder objects into the parcel, at
- * the current dataPosition() and growing dataCapacity() if needed. They
- * can later be retrieved with {@link #createBinderArrayList} or
- * {@link #readBinderList}.
- *
- * @param val The list of strings to be written.
- *
- * @see #createBinderArrayList
- * @see #readBinderList
- */
- public final void writeBinderList(List<IBinder> val) {
- if (val == null) {
- writeInt(-1);
- return;
- }
- int N = val.size();
- int i=0;
- writeInt(N);
- while (i < N) {
- writeStrongBinder(val.get(i));
- i++;
- }
- }
-
- /**
- * Flatten a heterogeneous array containing a particular object type into
- * the parcel, at
- * the current dataPosition() and growing dataCapacity() if needed. The
- * type of the objects in the array must be one that implements Parcelable.
- * Unlike the {@link #writeParcelableArray} method, however, only the
- * raw data of the objects is written and not their type, so you must use
- * {@link #readTypedArray} with the correct corresponding
- * {@link Parcelable.Creator} implementation to unmarshall them.
- *
- * @param val The array of objects to be written.
- * @param parcelableFlags Contextual flags as per
- * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}.
- *
- * @see #readTypedArray
- * @see #writeParcelableArray
- * @see Parcelable.Creator
- */
- public final <T extends Parcelable> void writeTypedArray(T[] val,
- int parcelableFlags) {
- if (val != null) {
- int N = val.length;
- writeInt(N);
- for (int i=0; i<N; i++) {
- T item = val[i];
- if (item != null) {
- writeInt(1);
- item.writeToParcel(this, parcelableFlags);
- } else {
- writeInt(0);
- }
- }
- } else {
- writeInt(-1);
- }
- }
-
- /**
- * Flatten a generic object in to a parcel. The given Object value may
- * currently be one of the following types:
- *
- * <ul>
- * <li> null
- * <li> String
- * <li> Byte
- * <li> Short
- * <li> Integer
- * <li> Long
- * <li> Float
- * <li> Double
- * <li> Boolean
- * <li> String[]
- * <li> boolean[]
- * <li> byte[]
- * <li> int[]
- * <li> long[]
- * <li> Object[] (supporting objects of the same type defined here).
- * <li> {@link Bundle}
- * <li> Map (as supported by {@link #writeMap}).
- * <li> Any object that implements the {@link Parcelable} protocol.
- * <li> Parcelable[]
- * <li> CharSequence (as supported by {@link TextUtils#writeToParcel}).
- * <li> List (as supported by {@link #writeList}).
- * <li> {@link SparseArray} (as supported by {@link #writeSparseArray}).
- * <li> {@link IBinder}
- * <li> Any object that implements Serializable (but see
- * {@link #writeSerializable} for caveats). Note that all of the
- * previous types have relatively efficient implementations for
- * writing to a Parcel; having to rely on the generic serialization
- * approach is much less efficient and should be avoided whenever
- * possible.
- * </ul>
- */
- public final void writeValue(Object v) {
- if (v == null) {
- writeInt(VAL_NULL);
- } else if (v instanceof String) {
- writeInt(VAL_STRING);
- writeString((String) v);
- } else if (v instanceof Integer) {
- writeInt(VAL_INTEGER);
- writeInt((Integer) v);
- } else if (v instanceof Map) {
- writeInt(VAL_MAP);
- writeMap((Map) v);
- } else if (v instanceof Bundle) {
- // Must be before Parcelable
- writeInt(VAL_BUNDLE);
- writeBundle((Bundle) v);
- } else if (v instanceof Parcelable) {
- writeInt(VAL_PARCELABLE);
- writeParcelable((Parcelable) v, 0);
- } else if (v instanceof Short) {
- writeInt(VAL_SHORT);
- writeInt(((Short) v).intValue());
- } else if (v instanceof Long) {
- writeInt(VAL_LONG);
- writeLong((Long) v);
- } else if (v instanceof Float) {
- writeInt(VAL_FLOAT);
- writeFloat((Float) v);
- } else if (v instanceof Double) {
- writeInt(VAL_DOUBLE);
- writeDouble((Double) v);
- } else if (v instanceof Boolean) {
- writeInt(VAL_BOOLEAN);
- writeInt((Boolean) v ? 1 : 0);
- } else if (v instanceof CharSequence) {
- // Must be after String
- writeInt(VAL_CHARSEQUENCE);
- TextUtils.writeToParcel((CharSequence) v, this, 0);
- } else if (v instanceof List) {
- writeInt(VAL_LIST);
- writeList((List) v);
- } else if (v instanceof SparseArray) {
- writeInt(VAL_SPARSEARRAY);
- writeSparseArray((SparseArray) v);
- } else if (v instanceof boolean[]) {
- writeInt(VAL_BOOLEANARRAY);
- writeBooleanArray((boolean[]) v);
- } else if (v instanceof byte[]) {
- writeInt(VAL_BYTEARRAY);
- writeByteArray((byte[]) v);
- } else if (v instanceof String[]) {
- writeInt(VAL_STRINGARRAY);
- writeStringArray((String[]) v);
- } else if (v instanceof IBinder) {
- writeInt(VAL_IBINDER);
- writeStrongBinder((IBinder) v);
- } else if (v instanceof Parcelable[]) {
- writeInt(VAL_PARCELABLEARRAY);
- writeParcelableArray((Parcelable[]) v, 0);
- } else if (v instanceof Object[]) {
- writeInt(VAL_OBJECTARRAY);
- writeArray((Object[]) v);
- } else if (v instanceof int[]) {
- writeInt(VAL_INTARRAY);
- writeIntArray((int[]) v);
- } else if (v instanceof long[]) {
- writeInt(VAL_LONGARRAY);
- writeLongArray((long[]) v);
- } else if (v instanceof Byte) {
- writeInt(VAL_BYTE);
- writeInt((Byte) v);
- } else if (v instanceof Serializable) {
- // Must be last
- writeInt(VAL_SERIALIZABLE);
- writeSerializable((Serializable) v);
- } else {
- throw new RuntimeException("Parcel: unable to marshal value " + v);
- }
- }
-
- /**
- * Flatten the name of the class of the Parcelable and its contents
- * into the parcel.
- *
- * @param p The Parcelable object to be written.
- * @param parcelableFlags Contextual flags as per
- * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}.
- */
- public final void writeParcelable(Parcelable p, int parcelableFlags) {
- if (p == null) {
- writeString(null);
- return;
- }
- String name = p.getClass().getName();
- writeString(name);
- p.writeToParcel(this, parcelableFlags);
- }
-
- /**
- * Write a generic serializable object in to a Parcel. It is strongly
- * recommended that this method be avoided, since the serialization
- * overhead is extremely large, and this approach will be much slower than
- * using the other approaches to writing data in to a Parcel.
- */
- public final void writeSerializable(Serializable s) {
- if (s == null) {
- writeString(null);
- return;
- }
- String name = s.getClass().getName();
- writeString(name);
-
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- try {
- ObjectOutputStream oos = new ObjectOutputStream(baos);
- oos.writeObject(s);
- oos.close();
-
- writeByteArray(baos.toByteArray());
- } catch (IOException ioe) {
- throw new RuntimeException("Parcelable encountered " +
- "IOException writing serializable object (name = " + name +
- ")", ioe);
- }
- }
-
- /**
- * Special function for writing an exception result at the header of
- * a parcel, to be used when returning an exception from a transaction.
- * Note that this currently only supports a few exception types; any other
- * exception will be re-thrown by this function as a RuntimeException
- * (to be caught by the system's last-resort exception handling when
- * dispatching a transaction).
- *
- * <p>The supported exception types are:
- * <ul>
- * <li>{@link BadParcelableException}
- * <li>{@link IllegalArgumentException}
- * <li>{@link IllegalStateException}
- * <li>{@link NullPointerException}
- * <li>{@link SecurityException}
- * </ul>
- *
- * @param e The Exception to be written.
- *
- * @see #writeNoException
- * @see #readException
- */
- public final void writeException(Exception e) {
- int code = 0;
- if (e instanceof SecurityException) {
- code = EX_SECURITY;
- } else if (e instanceof BadParcelableException) {
- code = EX_BAD_PARCELABLE;
- } else if (e instanceof IllegalArgumentException) {
- code = EX_ILLEGAL_ARGUMENT;
- } else if (e instanceof NullPointerException) {
- code = EX_NULL_POINTER;
- } else if (e instanceof IllegalStateException) {
- code = EX_ILLEGAL_STATE;
- }
- writeInt(code);
- if (code == 0) {
- if (e instanceof RuntimeException) {
- throw (RuntimeException) e;
- }
- throw new RuntimeException(e);
- }
- writeString(e.getMessage());
- }
-
- /**
- * Special function for writing information at the front of the Parcel
- * indicating that no exception occurred.
- *
- * @see #writeException
- * @see #readException
- */
- public final void writeNoException() {
- writeInt(0);
- }
-
- /**
- * Special function for reading an exception result from the header of
- * a parcel, to be used after receiving the result of a transaction. This
- * will throw the exception for you if it had been written to the Parcel,
- * otherwise return and let you read the normal result data from the Parcel.
- *
- * @see #writeException
- * @see #writeNoException
- */
- public final void readException() {
- int code = readInt();
- if (code == 0) return;
- String msg = readString();
- readException(code, msg);
- }
-
- /**
- * Use this function for customized exception handling.
- * customized method call this method for all unknown case
- * @param code exception code
- * @param msg exception message
- */
- public final void readException(int code, String msg) {
- switch (code) {
- case EX_SECURITY:
- throw new SecurityException(msg);
- case EX_BAD_PARCELABLE:
- throw new BadParcelableException(msg);
- case EX_ILLEGAL_ARGUMENT:
- throw new IllegalArgumentException(msg);
- case EX_NULL_POINTER:
- throw new NullPointerException(msg);
- case EX_ILLEGAL_STATE:
- throw new IllegalStateException(msg);
- }
- throw new RuntimeException("Unknown exception code: " + code
- + " msg " + msg);
- }
-
- /**
- * Read an integer value from the parcel at the current dataPosition().
- */
- public final native int readInt();
-
- /**
- * Read a long integer value from the parcel at the current dataPosition().
- */
- public final native long readLong();
-
- /**
- * Read a floating point value from the parcel at the current
- * dataPosition().
- */
- public final native float readFloat();
-
- /**
- * Read a double precision floating point value from the parcel at the
- * current dataPosition().
- */
- public final native double readDouble();
-
- /**
- * Read a string value from the parcel at the current dataPosition().
- */
- public final native String readString();
-
- /**
- * Read an object from the parcel at the current dataPosition().
- */
- public final native IBinder readStrongBinder();
-
- /**
- * Read a FileDescriptor from the parcel at the current dataPosition().
- */
- public final ParcelFileDescriptor readFileDescriptor() {
- FileDescriptor fd = internalReadFileDescriptor();
- return fd != null ? new ParcelFileDescriptor(fd) : null;
- }
-
- private native FileDescriptor internalReadFileDescriptor();
- /*package*/ static native FileDescriptor openFileDescriptor(String file,
- int mode) throws FileNotFoundException;
- /*package*/ static native void closeFileDescriptor(FileDescriptor desc)
- throws IOException;
-
- /**
- * Read a byte value from the parcel at the current dataPosition().
- */
- public final byte readByte() {
- return (byte)(readInt() & 0xff);
- }
-
- /**
- * Please use {@link #readBundle(ClassLoader)} instead (whose data must have
- * been written with {@link #writeBundle}. Read into an existing Map object
- * from the parcel at the current dataPosition().
- */
- public final void readMap(Map outVal, ClassLoader loader) {
- int N = readInt();
- readMapInternal(outVal, N, loader);
- }
-
- /**
- * Read into an existing List object from the parcel at the current
- * dataPosition(), using the given class loader to load any enclosed
- * Parcelables. If it is null, the default class loader is used.
- */
- public final void readList(List outVal, ClassLoader loader) {
- int N = readInt();
- readListInternal(outVal, N, loader);
- }
-
- /**
- * Please use {@link #readBundle(ClassLoader)} instead (whose data must have
- * been written with {@link #writeBundle}. Read and return a new HashMap
- * object from the parcel at the current dataPosition(), using the given
- * class loader to load any enclosed Parcelables. Returns null if
- * the previously written map object was null.
- */
- public final HashMap readHashMap(ClassLoader loader)
- {
- int N = readInt();
- if (N < 0) {
- return null;
- }
- HashMap m = new HashMap(N);
- readMapInternal(m, N, loader);
- return m;
- }
-
- /**
- * Read and return a new Bundle object from the parcel at the current
- * dataPosition(). Returns null if the previously written Bundle object was
- * null.
- */
- public final Bundle readBundle() {
- return readBundle(null);
- }
-
- /**
- * Read and return a new Bundle object from the parcel at the current
- * dataPosition(), using the given class loader to initialize the class
- * loader of the Bundle for later retrieval of Parcelable objects.
- * Returns null if the previously written Bundle object was null.
- */
- public final Bundle readBundle(ClassLoader loader) {
- int offset = dataPosition();
- int length = readInt();
- if (length < 0) {
- return null;
- }
- int magic = readInt();
- if (magic != 0x4C444E42) {
- //noinspection ThrowableInstanceNeverThrown
- String st = Log.getStackTraceString(new RuntimeException());
- Log.e("Bundle", "readBundle: bad magic number");
- Log.e("Bundle", "readBundle: trace = " + st);
- }
-
- // Advance within this Parcel
- setDataPosition(offset + length + 4);
-
- Parcel p = new Parcel(0);
- p.setDataPosition(0);
- p.appendFrom(this, offset, length + 4);
- p.setDataPosition(0);
- final Bundle bundle = new Bundle(p);
- if (loader != null) {
- bundle.setClassLoader(loader);
- }
- return bundle;
- }
-
- /**
- * Read and return a new Bundle object from the parcel at the current
- * dataPosition(). Returns null if the previously written Bundle object was
- * null. The returned bundle will have its contents fully unpacked using
- * the given ClassLoader.
- */
- /* package */ Bundle readBundleUnpacked(ClassLoader loader) {
- int length = readInt();
- if (length == -1) {
- return null;
- }
- int magic = readInt();
- if (magic != 0x4C444E42) {
- //noinspection ThrowableInstanceNeverThrown
- String st = Log.getStackTraceString(new RuntimeException());
- Log.e("Bundle", "readBundleUnpacked: bad magic number");
- Log.e("Bundle", "readBundleUnpacked: trace = " + st);
- }
- Bundle m = new Bundle(loader);
- int N = readInt();
- if (N < 0) {
- return null;
- }
- readMapInternal(m.mMap, N, loader);
- return m;
- }
-
- /**
- * Read and return a byte[] object from the parcel.
- */
- public final native byte[] createByteArray();
-
- /**
- * Read a byte[] object from the parcel and copy it into the
- * given byte array.
- */
- public final void readByteArray(byte[] val) {
- // TODO: make this a native method to avoid the extra copy.
- byte[] ba = createByteArray();
- if (ba.length == val.length) {
- System.arraycopy(ba, 0, val, 0, ba.length);
- } else {
- throw new RuntimeException("bad array lengths");
- }
- }
-
- /**
- * Read and return a String[] object from the parcel.
- * {@hide}
- */
- public final String[] readStringArray() {
- String[] array = null;
-
- int length = readInt();
- if (length >= 0)
- {
- array = new String[length];
-
- for (int i = 0 ; i < length ; i++)
- {
- array[i] = readString();
- }
- }
-
- return array;
- }
-
- /**
- * Read and return a new ArrayList object from the parcel at the current
- * dataPosition(). Returns null if the previously written list object was
- * null. The given class loader will be used to load any enclosed
- * Parcelables.
- */
- public final ArrayList readArrayList(ClassLoader loader) {
- int N = readInt();
- if (N < 0) {
- return null;
- }
- ArrayList l = new ArrayList(N);
- readListInternal(l, N, loader);
- return l;
- }
-
- /**
- * Read and return a new Object array from the parcel at the current
- * dataPosition(). Returns null if the previously written array was
- * null. The given class loader will be used to load any enclosed
- * Parcelables.
- */
- public final Object[] readArray(ClassLoader loader) {
- int N = readInt();
- if (N < 0) {
- return null;
- }
- Object[] l = new Object[N];
- readArrayInternal(l, N, loader);
- return l;
- }
-
- /**
- * Read and return a new SparseArray object from the parcel at the current
- * dataPosition(). Returns null if the previously written list object was
- * null. The given class loader will be used to load any enclosed
- * Parcelables.
- */
- public final SparseArray readSparseArray(ClassLoader loader) {
- int N = readInt();
- if (N < 0) {
- return null;
- }
- SparseArray sa = new SparseArray(N);
- readSparseArrayInternal(sa, N, loader);
- return sa;
- }
-
- /**
- * Read and return a new SparseBooleanArray object from the parcel at the current
- * dataPosition(). Returns null if the previously written list object was
- * null.
- */
- public final SparseBooleanArray readSparseBooleanArray() {
- int N = readInt();
- if (N < 0) {
- return null;
- }
- SparseBooleanArray sa = new SparseBooleanArray(N);
- readSparseBooleanArrayInternal(sa, N);
- return sa;
- }
-
- /**
- * Read and return a new ArrayList containing a particular object type from
- * the parcel that was written with {@link #writeTypedList} at the
- * current dataPosition(). Returns null if the
- * previously written list object was null. The list <em>must</em> have
- * previously been written via {@link #writeTypedList} with the same object
- * type.
- *
- * @return A newly created ArrayList containing objects with the same data
- * as those that were previously written.
- *
- * @see #writeTypedList
- */
- public final <T> ArrayList<T> createTypedArrayList(Parcelable.Creator<T> c) {
- int N = readInt();
- if (N < 0) {
- return null;
- }
- ArrayList<T> l = new ArrayList<T>(N);
- while (N > 0) {
- if (readInt() != 0) {
- l.add(c.createFromParcel(this));
- } else {
- l.add(null);
- }
- N--;
- }
- return l;
- }
-
- /**
- * Read into the given List items containing a particular object type
- * that were written with {@link #writeTypedList} at the
- * current dataPosition(). The list <em>must</em> have
- * previously been written via {@link #writeTypedList} with the same object
- * type.
- *
- * @return A newly created ArrayList containing objects with the same data
- * as those that were previously written.
- *
- * @see #writeTypedList
- */
- public final <T> void readTypedList(List<T> list, Parcelable.Creator<T> c) {
- int M = list.size();
- int N = readInt();
- int i = 0;
- for (; i < M && i < N; i++) {
- if (readInt() != 0) {
- list.set(i, c.createFromParcel(this));
- } else {
- list.set(i, null);
- }
- }
- for (; i<N; i++) {
- if (readInt() != 0) {
- list.add(c.createFromParcel(this));
- } else {
- list.add(null);
- }
- }
- for (; i<M; i++) {
- list.remove(N);
- }
- }
-
- /**
- * Read and return a new ArrayList containing String objects from
- * the parcel that was written with {@link #writeStringList} at the
- * current dataPosition(). Returns null if the
- * previously written list object was null.
- *
- * @return A newly created ArrayList containing strings with the same data
- * as those that were previously written.
- *
- * @see #writeStringList
- */
- public final ArrayList<String> createStringArrayList() {
- int N = readInt();
- if (N < 0) {
- return null;
- }
- ArrayList<String> l = new ArrayList<String>(N);
- while (N > 0) {
- l.add(readString());
- N--;
- }
- return l;
- }
-
- /**
- * Read and return a new ArrayList containing IBinder objects from
- * the parcel that was written with {@link #writeBinderList} at the
- * current dataPosition(). Returns null if the
- * previously written list object was null.
- *
- * @return A newly created ArrayList containing strings with the same data
- * as those that were previously written.
- *
- * @see #writeBinderList
- */
- public final ArrayList<IBinder> createBinderArrayList() {
- int N = readInt();
- if (N < 0) {
- return null;
- }
- ArrayList<IBinder> l = new ArrayList<IBinder>(N);
- while (N > 0) {
- l.add(readStrongBinder());
- N--;
- }
- return l;
- }
-
- /**
- * Read into the given List items String objects that were written with
- * {@link #writeStringList} at the current dataPosition().
- *
- * @return A newly created ArrayList containing strings with the same data
- * as those that were previously written.
- *
- * @see #writeStringList
- */
- public final void readStringList(List<String> list) {
- int M = list.size();
- int N = readInt();
- int i = 0;
- for (; i < M && i < N; i++) {
- list.set(i, readString());
- }
- for (; i<N; i++) {
- list.add(readString());
- }
- for (; i<M; i++) {
- list.remove(N);
- }
- }
-
- /**
- * Read into the given List items IBinder objects that were written with
- * {@link #writeBinderList} at the current dataPosition().
- *
- * @return A newly created ArrayList containing strings with the same data
- * as those that were previously written.
- *
- * @see #writeBinderList
- */
- public final void readBinderList(List<IBinder> list) {
- int M = list.size();
- int N = readInt();
- int i = 0;
- for (; i < M && i < N; i++) {
- list.set(i, readStrongBinder());
- }
- for (; i<N; i++) {
- list.add(readStrongBinder());
- }
- for (; i<M; i++) {
- list.remove(N);
- }
- }
-
- /**
- * Read and return a new array containing a particular object type from
- * the parcel at the current dataPosition(). Returns null if the
- * previously written array was null. The array <em>must</em> have
- * previously been written via {@link #writeTypedArray} with the same
- * object type.
- *
- * @return A newly created array containing objects with the same data
- * as those that were previously written.
- *
- * @see #writeTypedArray
- */
- public final <T> T[] createTypedArray(Parcelable.Creator<T> c) {
- int N = readInt();
- if (N < 0) {
- return null;
- }
- T[] l = c.newArray(N);
- for (int i=0; i<N; i++) {
- if (readInt() != 0) {
- l[i] = c.createFromParcel(this);
- }
- }
- return l;
- }
-
- public final <T> void readTypedArray(T[] val, Parcelable.Creator<T> c) {
- int N = readInt();
- if (N == val.length) {
- for (int i=0; i<N; i++) {
- if (readInt() != 0) {
- val[i] = c.createFromParcel(this);
- } else {
- val[i] = null;
- }
- }
- } else {
- throw new RuntimeException("bad array lengths");
- }
- }
-
- /**
- * @deprecated
- * @hide
- */
- @Deprecated
- public final <T> T[] readTypedArray(Parcelable.Creator<T> c) {
- return createTypedArray(c);
- }
-
- /**
- * Write a heterogeneous array of Parcelable objects into the Parcel.
- * Each object in the array is written along with its class name, so
- * that the correct class can later be instantiated. As a result, this
- * has significantly more overhead than {@link #writeTypedArray}, but will
- * correctly handle an array containing more than one type of object.
- *
- * @param value The array of objects to be written.
- * @param parcelableFlags Contextual flags as per
- * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}.
- *
- * @see #writeTypedArray
- */
- public final <T extends Parcelable> void writeParcelableArray(T[] value,
- int parcelableFlags) {
- if (value != null) {
- int N = value.length;
- writeInt(N);
- for (int i=0; i<N; i++) {
- writeParcelable(value[i], parcelableFlags);
- }
- } else {
- writeInt(-1);
- }
- }
-
- /**
- * Read a typed object from a parcel. The given class loader will be
- * used to load any enclosed Parcelables. If it is null, the default class
- * loader will be used.
- */
- public final Object readValue(ClassLoader loader) {
- int type = readInt();
-
- switch (type) {
- case VAL_NULL:
- return null;
-
- case VAL_STRING:
- return readString();
-
- case VAL_INTEGER:
- return readInt();
-
- case VAL_MAP:
- return readHashMap(loader);
-
- case VAL_PARCELABLE:
- return readParcelable(loader);
-
- case VAL_SHORT:
- return (short) readInt();
-
- case VAL_LONG:
- return readLong();
-
- case VAL_FLOAT:
- return readFloat();
-
- case VAL_DOUBLE:
- return readDouble();
-
- case VAL_BOOLEAN:
- return readInt() == 1;
-
- case VAL_CHARSEQUENCE:
- return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(this);
-
- case VAL_LIST:
- return readArrayList(loader);
-
- case VAL_BOOLEANARRAY:
- return createBooleanArray();
-
- case VAL_BYTEARRAY:
- return createByteArray();
-
- case VAL_STRINGARRAY:
- return readStringArray();
-
- case VAL_IBINDER:
- return readStrongBinder();
-
- case VAL_OBJECTARRAY:
- return readArray(loader);
-
- case VAL_INTARRAY:
- return createIntArray();
-
- case VAL_LONGARRAY:
- return createLongArray();
-
- case VAL_BYTE:
- return readByte();
-
- case VAL_SERIALIZABLE:
- return readSerializable();
-
- case VAL_PARCELABLEARRAY:
- return readParcelableArray(loader);
-
- case VAL_SPARSEARRAY:
- return readSparseArray(loader);
-
- case VAL_SPARSEBOOLEANARRAY:
- return readSparseBooleanArray();
-
- case VAL_BUNDLE:
- return readBundle(loader); // loading will be deferred
-
- default:
- int off = dataPosition() - 4;
- throw new RuntimeException(
- "Parcel " + this + ": Unmarshalling unknown type code " + type + " at offset " + off);
- }
- }
-
- /**
- * Read and return a new Parcelable from the parcel. The given class loader
- * will be used to load any enclosed Parcelables. If it is null, the default
- * class loader will be used.
- * @param loader A ClassLoader from which to instantiate the Parcelable
- * object, or null for the default class loader.
- * @return Returns the newly created Parcelable, or null if a null
- * object has been written.
- * @throws BadParcelableException Throws BadParcelableException if there
- * was an error trying to instantiate the Parcelable.
- */
- public final <T extends Parcelable> T readParcelable(ClassLoader loader) {
- String name = readString();
- if (name == null) {
- return null;
- }
- Parcelable.Creator<T> creator;
- synchronized (mCreators) {
- HashMap<String,Parcelable.Creator> map = mCreators.get(loader);
- if (map == null) {
- map = new HashMap<String,Parcelable.Creator>();
- mCreators.put(loader, map);
- }
- creator = map.get(name);
- if (creator == null) {
- try {
- Class c = loader == null ?
- Class.forName(name) : Class.forName(name, true, loader);
- Field f = c.getField("CREATOR");
- creator = (Parcelable.Creator)f.get(null);
- }
- catch (IllegalAccessException e) {
- Log.e("Parcel", "Class not found when unmarshalling: "
- + name + ", e: " + e);
- throw new BadParcelableException(
- "IllegalAccessException when unmarshalling: " + name);
- }
- catch (ClassNotFoundException e) {
- Log.e("Parcel", "Class not found when unmarshalling: "
- + name + ", e: " + e);
- throw new BadParcelableException(
- "ClassNotFoundException when unmarshalling: " + name);
- }
- catch (ClassCastException e) {
- throw new BadParcelableException("Parcelable protocol requires a "
- + "Parcelable.Creator object called "
- + " CREATOR on class " + name);
- }
- catch (NoSuchFieldException e) {
- throw new BadParcelableException("Parcelable protocol requires a "
- + "Parcelable.Creator object called "
- + " CREATOR on class " + name);
- }
- if (creator == null) {
- throw new BadParcelableException("Parcelable protocol requires a "
- + "Parcelable.Creator object called "
- + " CREATOR on class " + name);
- }
-
- map.put(name, creator);
- }
- }
-
- return creator.createFromParcel(this);
- }
-
- /**
- * Read and return a new Parcelable array from the parcel.
- * The given class loader will be used to load any enclosed
- * Parcelables.
- * @return the Parcelable array, or null if the array is null
- */
- public final Parcelable[] readParcelableArray(ClassLoader loader) {
- int N = readInt();
- if (N < 0) {
- return null;
- }
- Parcelable[] p = new Parcelable[N];
- for (int i = 0; i < N; i++) {
- p[i] = (Parcelable) readParcelable(loader);
- }
- return p;
- }
-
- /**
- * Read and return a new Serializable object from the parcel.
- * @return the Serializable object, or null if the Serializable name
- * wasn't found in the parcel.
- */
- public final Serializable readSerializable() {
- String name = readString();
- if (name == null) {
- // For some reason we were unable to read the name of the Serializable (either there
- // is nothing left in the Parcel to read, or the next value wasn't a String), so
- // return null, which indicates that the name wasn't found in the parcel.
- return null;
- }
-
- byte[] serializedData = createByteArray();
- ByteArrayInputStream bais = new ByteArrayInputStream(serializedData);
- try {
- ObjectInputStream ois = new ObjectInputStream(bais);
- return (Serializable) ois.readObject();
- } catch (IOException ioe) {
- throw new RuntimeException("Parcelable encountered " +
- "IOException reading a Serializable object (name = " + name +
- ")", ioe);
- } catch (ClassNotFoundException cnfe) {
- throw new RuntimeException("Parcelable encountered" +
- "ClassNotFoundException reading a Serializable object (name = "
- + name + ")", cnfe);
- }
- }
-
- // Cache of previously looked up CREATOR.createFromParcel() methods for
- // particular classes. Keys are the names of the classes, values are
- // Method objects.
- private static final HashMap<ClassLoader,HashMap<String,Parcelable.Creator>>
- mCreators = new HashMap<ClassLoader,HashMap<String,Parcelable.Creator>>();
-
- static protected final Parcel obtain(int obj) {
- final Parcel[] pool = sHolderPool;
- synchronized (pool) {
- Parcel p;
- for (int i=0; i<POOL_SIZE; i++) {
- p = pool[i];
- if (p != null) {
- pool[i] = null;
- if (DEBUG_RECYCLE) {
- p.mStack = new RuntimeException();
- }
- p.init(obj);
- return p;
- }
- }
- }
- return new Parcel(obj);
- }
-
- private Parcel(int obj) {
- if (DEBUG_RECYCLE) {
- mStack = new RuntimeException();
- }
- //Log.i("Parcel", "Initializing obj=0x" + Integer.toHexString(obj), mStack);
- init(obj);
- }
-
- @Override
- protected void finalize() throws Throwable {
- if (DEBUG_RECYCLE) {
- if (mStack != null) {
- Log.w("Parcel", "Client did not call Parcel.recycle()", mStack);
- }
- }
- destroy();
- }
-
- private native void freeBuffer();
- private native void init(int obj);
- private native void destroy();
-
- private void readMapInternal(Map outVal, int N,
- ClassLoader loader) {
- while (N > 0) {
- Object key = readValue(loader);
- Object value = readValue(loader);
- outVal.put(key, value);
- N--;
- }
- }
-
- private void readListInternal(List outVal, int N,
- ClassLoader loader) {
- while (N > 0) {
- Object value = readValue(loader);
- //Log.d("Parcel", "Unmarshalling value=" + value);
- outVal.add(value);
- N--;
- }
- }
-
- private void readArrayInternal(Object[] outVal, int N,
- ClassLoader loader) {
- for (int i = 0; i < N; i++) {
- Object value = readValue(loader);
- //Log.d("Parcel", "Unmarshalling value=" + value);
- outVal[i] = value;
- }
- }
-
- private void readSparseArrayInternal(SparseArray outVal, int N,
- ClassLoader loader) {
- while (N > 0) {
- int key = readInt();
- Object value = readValue(loader);
- //Log.i("Parcel", "Unmarshalling key=" + key + " value=" + value);
- outVal.append(key, value);
- N--;
- }
- }
-
-
- private void readSparseBooleanArrayInternal(SparseBooleanArray outVal, int N) {
- while (N > 0) {
- int key = readInt();
- boolean value = this.readByte() == 1;
- //Log.i("Parcel", "Unmarshalling key=" + key + " value=" + value);
- outVal.append(key, value);
- N--;
- }
- }
-}
diff --git a/core/java/android/os/ParcelFileDescriptor.aidl b/core/java/android/os/ParcelFileDescriptor.aidl
deleted file mode 100644
index 5857aae..0000000
--- a/core/java/android/os/ParcelFileDescriptor.aidl
+++ /dev/null
@@ -1,20 +0,0 @@
-/* //device/java/android/android/os/ParcelFileDescriptor.aidl
-**
-** Copyright 2007, 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 android.os;
-
-parcelable ParcelFileDescriptor;
diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java
deleted file mode 100644
index ed138cb..0000000
--- a/core/java/android/os/ParcelFileDescriptor.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * 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 android.os;
-import java.io.File;
-import java.io.FileDescriptor;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.Socket;
-
-/**
- * The FileDescriptor returned by {@link Parcel#readFileDescriptor}, allowing
- * you to close it when done with it.
- */
-public class ParcelFileDescriptor implements Parcelable {
- private final FileDescriptor mFileDescriptor;
- private boolean mClosed;
- //this field is to create wrapper for ParcelFileDescriptor using another
- //PartialFileDescriptor but avoid invoking close twice
- //consider ParcelFileDescriptor A(fileDescriptor fd), ParcelFileDescriptor B(A)
- //in this particular case fd.close might be invoked twice.
- private final ParcelFileDescriptor mParcelDescriptor;
-
- /**
- * For use with {@link #open}: if {@link #MODE_CREATE} has been supplied
- * and this file doesn't already exist, then create the file with
- * permissions such that any application can read it.
- */
- public static final int MODE_WORLD_READABLE = 0x00000001;
-
- /**
- * For use with {@link #open}: if {@link #MODE_CREATE} has been supplied
- * and this file doesn't already exist, then create the file with
- * permissions such that any application can write it.
- */
- public static final int MODE_WORLD_WRITEABLE = 0x00000002;
-
- /**
- * For use with {@link #open}: open the file with read-only access.
- */
- public static final int MODE_READ_ONLY = 0x10000000;
-
- /**
- * For use with {@link #open}: open the file with write-only access.
- */
- public static final int MODE_WRITE_ONLY = 0x20000000;
-
- /**
- * For use with {@link #open}: open the file with read and write access.
- */
- public static final int MODE_READ_WRITE = 0x30000000;
-
- /**
- * For use with {@link #open}: create the file if it doesn't already exist.
- */
- public static final int MODE_CREATE = 0x08000000;
-
- /**
- * For use with {@link #open}: erase contents of file when opening.
- */
- public static final int MODE_TRUNCATE = 0x04000000;
-
- /**
- * Create a new ParcelFileDescriptor accessing a given file.
- *
- * @param file The file to be opened.
- * @param mode The desired access mode, must be one of
- * {@link #MODE_READ_ONLY}, {@link #MODE_WRITE_ONLY}, or
- * {@link #MODE_READ_WRITE}; may also be any combination of
- * {@link #MODE_CREATE}, {@link #MODE_TRUNCATE},
- * {@link #MODE_WORLD_READABLE}, and {@link #MODE_WORLD_WRITEABLE}.
- *
- * @return Returns a new ParcelFileDescriptor pointing to the given
- * file.
- *
- * @throws FileNotFoundException Throws FileNotFoundException if the given
- * file does not exist or can not be opened with the requested mode.
- */
- public static ParcelFileDescriptor open(File file, int mode)
- throws FileNotFoundException {
- String path = file.getPath();
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkRead(path);
- if ((mode&MODE_WRITE_ONLY) != 0) {
- security.checkWrite(path);
- }
- }
-
- if ((mode&MODE_READ_WRITE) == 0) {
- throw new IllegalArgumentException(
- "Must specify MODE_READ_ONLY, MODE_WRITE_ONLY, or MODE_READ_WRITE");
- }
-
- FileDescriptor fd = Parcel.openFileDescriptor(path, mode);
- return new ParcelFileDescriptor(fd);
- }
-
- /**
- * Create a new ParcelFileDescriptor from the specified Socket.
- *
- * @param socket The Socket whose FileDescriptor is used to create
- * a new ParcelFileDescriptor.
- *
- * @return A new ParcelFileDescriptor with the FileDescriptor of the
- * specified Socket.
- */
- public static ParcelFileDescriptor fromSocket(Socket socket) {
- FileDescriptor fd = getFileDescriptorFromSocket(socket);
- return new ParcelFileDescriptor(fd);
- }
-
- // Extracts the file descriptor from the specified socket and returns it untouched
- private static native FileDescriptor getFileDescriptorFromSocket(Socket socket);
-
- /**
- * Retrieve the actual FileDescriptor associated with this object.
- *
- * @return Returns the FileDescriptor associated with this object.
- */
- public FileDescriptor getFileDescriptor() {
- return mFileDescriptor;
- }
-
- /**
- * Close the ParcelFileDescriptor. This implementation closes the underlying
- * OS resources allocated to represent this stream.
- *
- * @throws IOException
- * If an error occurs attempting to close this ParcelFileDescriptor.
- */
- public void close() throws IOException {
- mClosed = true;
- if (mParcelDescriptor != null) {
- // If this is a proxy to another file descriptor, just call through to its
- // close method.
- mParcelDescriptor.close();
- } else {
- Parcel.closeFileDescriptor(mFileDescriptor);
- }
- }
-
- /**
- * An InputStream you can create on a ParcelFileDescriptor, which will
- * take care of calling {@link ParcelFileDescriptor#close
- * ParcelFileDescritor.close()} for you when the stream is closed.
- */
- public static class AutoCloseInputStream extends FileInputStream {
- private final ParcelFileDescriptor mFd;
-
- public AutoCloseInputStream(ParcelFileDescriptor fd) {
- super(fd.getFileDescriptor());
- mFd = fd;
- }
-
- @Override
- public void close() throws IOException {
- mFd.close();
- }
- }
-
- /**
- * An OutputStream you can create on a ParcelFileDescriptor, which will
- * take care of calling {@link ParcelFileDescriptor#close
- * ParcelFileDescritor.close()} for you when the stream is closed.
- */
- public static class AutoCloseOutputStream extends FileOutputStream {
- private final ParcelFileDescriptor mFd;
-
- public AutoCloseOutputStream(ParcelFileDescriptor fd) {
- super(fd.getFileDescriptor());
- mFd = fd;
- }
-
- @Override
- public void close() throws IOException {
- mFd.close();
- }
- }
-
- @Override
- public String toString() {
- return "{ParcelFileDescriptor: " + mFileDescriptor + "}";
- }
-
- @Override
- protected void finalize() throws Throwable {
- try {
- if (!mClosed) {
- close();
- }
- } finally {
- super.finalize();
- }
- }
-
- public ParcelFileDescriptor(ParcelFileDescriptor descriptor) {
- super();
- mParcelDescriptor = descriptor;
- mFileDescriptor = mParcelDescriptor.mFileDescriptor;
- }
-
- /*package */ParcelFileDescriptor(FileDescriptor descriptor) {
- super();
- mFileDescriptor = descriptor;
- mParcelDescriptor = null;
- }
-
- /* Parcelable interface */
- public int describeContents() {
- return Parcelable.CONTENTS_FILE_DESCRIPTOR;
- }
-
- public void writeToParcel(Parcel out, int flags) {
- out.writeFileDescriptor(mFileDescriptor);
- if ((flags&PARCELABLE_WRITE_RETURN_VALUE) != 0 && !mClosed) {
- try {
- close();
- } catch (IOException e) {
- // Empty
- }
- }
- }
-
- public static final Parcelable.Creator<ParcelFileDescriptor> CREATOR
- = new Parcelable.Creator<ParcelFileDescriptor>() {
- public ParcelFileDescriptor createFromParcel(Parcel in) {
- return in.readFileDescriptor();
- }
- public ParcelFileDescriptor[] newArray(int size) {
- return new ParcelFileDescriptor[size];
- }
- };
-
-}
diff --git a/core/java/android/os/ParcelFormatException.java b/core/java/android/os/ParcelFormatException.java
deleted file mode 100644
index 8b6fda0..0000000
--- a/core/java/android/os/ParcelFormatException.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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 android.os;
-
-/**
- * The contents of a Parcel (usually during unmarshalling) does not
- * contain the expected data.
- */
-public class ParcelFormatException extends RuntimeException {
- public ParcelFormatException() {
- super();
- }
-
- public ParcelFormatException(String reason) {
- super(reason);
- }
-}
diff --git a/core/java/android/os/Parcelable.java b/core/java/android/os/Parcelable.java
deleted file mode 100644
index aee1e0b..0000000
--- a/core/java/android/os/Parcelable.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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 android.os;
-
-/**
- * Interface for classes whose instances can be written to
- * and restored from a {@link Parcel}. Classes implementing the Parcelable
- * interface must also have a static field called <code>CREATOR</code>, which
- * is an object implementing the {@link Parcelable.Creator Parcelable.Creator}
- * interface.
- *
- * <p>A typical implementation of Parcelable is:</p>
- *
- * <pre>
- * public class MyParcelable implements Parcelable {
- * private int mData;
- *
- * public void writeToParcel(Parcel out, int flags) {
- * out.writeInt(mData);
- * }
- *
- * public static final Parcelable.Creator<MyParcelable> CREATOR
- * = new Parcelable.Creator<MyParcelable>() {
- * public MyParcelable createFromParcel(Parcel in) {
- * return new MyParcelable(in);
- * }
- *
- * public MyParcelable[] newArray(int size) {
- * return new MyParcelable[size];
- * }
- * }
- *
- * private MyParcelable(Parcel in) {
- * mData = in.readInt();
- * }
- * }</pre>
- */
-public interface Parcelable {
- /**
- * Flag for use with {@link #writeToParcel}: the object being written
- * is a return value, that is the result of a function such as
- * "<code>Parcelable someFunction()</code>",
- * "<code>void someFunction(out Parcelable)</code>", or
- * "<code>void someFunction(inout Parcelable)</code>". Some implementations
- * may want to release resources at this point.
- */
- public static final int PARCELABLE_WRITE_RETURN_VALUE = 0x0001;
-
- /**
- * Bit masks for use with {@link #describeContents}: each bit represents a
- * kind of object considered to have potential special significance when
- * marshalled.
- */
- public static final int CONTENTS_FILE_DESCRIPTOR = 0x0001;
-
- /**
- * Describe the kinds of special objects contained in this Parcelable's
- * marshalled representation.
- *
- * @return a bitmask indicating the set of special object types marshalled
- * by the Parcelable.
- */
- public int describeContents();
-
- /**
- * Flatten this object in to a Parcel.
- *
- * @param dest The Parcel in which the object should be written.
- * @param flags Additional flags about how the object should be written.
- * May be 0 or {@link #PARCELABLE_WRITE_RETURN_VALUE}.
- */
- public void writeToParcel(Parcel dest, int flags);
-
- /**
- * Interface that must be implemented and provided as a public CREATOR
- * field that generates instances of your Parcelable class from a Parcel.
- */
- public interface Creator<T> {
- /**
- * Create a new instance of the Parcelable class, instantiating it
- * from the given Parcel whose data had previously been written by
- * {@link Parcelable#writeToParcel Parcelable.writeToParcel()}.
- *
- * @param source The Parcel to read the object's data from.
- * @return Returns a new instance of the Parcelable class.
- */
- public T createFromParcel(Parcel source);
-
- /**
- * Create a new array of the Parcelable class.
- *
- * @param size Size of the array.
- * @return Returns an array of the Parcelable class, with every entry
- * initialized to null.
- */
- public T[] newArray(int size);
- }
-}
diff --git a/core/java/android/os/PatternMatcher.aidl b/core/java/android/os/PatternMatcher.aidl
deleted file mode 100644
index 86309f1..0000000
--- a/core/java/android/os/PatternMatcher.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2008 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 android.os;
-
-parcelable PatternMatcher;
diff --git a/core/java/android/os/PatternMatcher.java b/core/java/android/os/PatternMatcher.java
deleted file mode 100644
index 56dc837..0000000
--- a/core/java/android/os/PatternMatcher.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (C) 2008 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 android.os;
-
-/**
- * A simple pattern matcher, which is safe to use on untrusted data: it does
- * not provide full reg-exp support, only simple globbing that can not be
- * used maliciously.
- */
-public class PatternMatcher implements Parcelable {
- /**
- * Pattern type: the given pattern must exactly match the string it is
- * tested against.
- */
- public static final int PATTERN_LITERAL = 0;
-
- /**
- * Pattern type: the given pattern must match the
- * beginning of the string it is tested against.
- */
- public static final int PATTERN_PREFIX = 1;
-
- /**
- * Pattern type: the given pattern is interpreted with a
- * simple glob syntax for matching against the string it is tested against.
- * In this syntax, you can use the '*' character to match against zero or
- * more occurrences of the character immediately before. If the
- * character before it is '.' it will match any character. The character
- * '\' can be used as an escape. This essentially provides only the '*'
- * wildcard part of a normal regexp.
- */
- public static final int PATTERN_SIMPLE_GLOB = 2;
-
- private final String mPattern;
- private final int mType;
-
- public PatternMatcher(String pattern, int type) {
- mPattern = pattern;
- mType = type;
- }
-
- public final String getPath() {
- return mPattern;
- }
-
- public final int getType() {
- return mType;
- }
-
- public boolean match(String str) {
- return matchPattern(mPattern, str, mType);
- }
-
- public String toString() {
- String type = "? ";
- switch (mType) {
- case PATTERN_LITERAL:
- type = "LITERAL: ";
- break;
- case PATTERN_PREFIX:
- type = "PREFIX: ";
- break;
- case PATTERN_SIMPLE_GLOB:
- type = "GLOB: ";
- break;
- }
- return "PatternMatcher{" + type + mPattern + "}";
- }
-
- public int describeContents() {
- return 0;
- }
-
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(mPattern);
- dest.writeInt(mType);
- }
-
- public PatternMatcher(Parcel src) {
- mPattern = src.readString();
- mType = src.readInt();
- }
-
- public static final Parcelable.Creator<PatternMatcher> CREATOR
- = new Parcelable.Creator<PatternMatcher>() {
- public PatternMatcher createFromParcel(Parcel source) {
- return new PatternMatcher(source);
- }
-
- public PatternMatcher[] newArray(int size) {
- return new PatternMatcher[size];
- }
- };
-
- static boolean matchPattern(String pattern, String match, int type) {
- if (match == null) return false;
- if (type == PATTERN_LITERAL) {
- return pattern.equals(match);
- } if (type == PATTERN_PREFIX) {
- return match.startsWith(pattern);
- } else if (type != PATTERN_SIMPLE_GLOB) {
- return false;
- }
-
- final int NP = pattern.length();
- if (NP <= 0) {
- return match.length() <= 0;
- }
- final int NM = match.length();
- int ip = 0, im = 0;
- char nextChar = pattern.charAt(0);
- while ((ip<NP) && (im<NM)) {
- char c = nextChar;
- ip++;
- nextChar = ip < NP ? pattern.charAt(ip) : 0;
- final boolean escaped = (c == '\\');
- if (escaped) {
- c = nextChar;
- ip++;
- nextChar = ip < NP ? pattern.charAt(ip) : 0;
- }
- if (nextChar == '*') {
- if (!escaped && c == '.') {
- if (ip >= (NP-1)) {
- // at the end with a pattern match, so
- // all is good without checking!
- return true;
- }
- ip++;
- nextChar = pattern.charAt(ip);
- // Consume everything until the next character in the
- // pattern is found.
- if (nextChar == '\\') {
- ip++;
- nextChar = ip < NP ? pattern.charAt(ip) : 0;
- }
- do {
- if (match.charAt(im) == nextChar) {
- break;
- }
- im++;
- } while (im < NM);
- if (im == NM) {
- // Whoops, the next character in the pattern didn't
- // exist in the match.
- return false;
- }
- ip++;
- nextChar = ip < NP ? pattern.charAt(ip) : 0;
- im++;
- } else {
- // Consume only characters matching the one before '*'.
- do {
- if (match.charAt(im) != c) {
- break;
- }
- im++;
- } while (im < NM);
- ip++;
- nextChar = ip < NP ? pattern.charAt(ip) : 0;
- }
- } else {
- if (c != '.' && match.charAt(im) != c) return false;
- im++;
- }
- }
-
- if (ip >= NP && im >= NM) {
- // Reached the end of both strings, all is good!
- return true;
- }
-
- // One last check: we may have finished the match string, but still
- // have a '.*' at the end of the pattern, which should still count
- // as a match.
- if (ip == NP-2 && pattern.charAt(ip) == '.'
- && pattern.charAt(ip+1) == '*') {
- return true;
- }
-
- return false;
- }
-}
diff --git a/core/java/android/os/Power.java b/core/java/android/os/Power.java
deleted file mode 100644
index b53e227..0000000
--- a/core/java/android/os/Power.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2007 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 android.os;
-
-import java.io.IOException;
-
-/**
- * Class that provides access to some of the power management functions.
- *
- * {@hide}
- */
-public class Power
-{
- // can't instantiate this class
- private Power()
- {
- }
-
- /**
- * Wake lock that ensures that the CPU is running. The screen might
- * not be on.
- */
- public static final int PARTIAL_WAKE_LOCK = 1;
-
- /**
- * Wake lock that ensures that the screen is on.
- */
- public static final int FULL_WAKE_LOCK = 2;
-
- public static native void acquireWakeLock(int lock, String id);
- public static native void releaseWakeLock(String id);
-
- /**
- * Flag to turn on and off the keyboard light.
- */
- public static final int KEYBOARD_LIGHT = 0x00000001;
-
- /**
- * Flag to turn on and off the screen backlight.
- */
- public static final int SCREEN_LIGHT = 0x00000002;
-
- /**
- * Flag to turn on and off the button backlight.
- */
- public static final int BUTTON_LIGHT = 0x00000004;
-
- /**
- * Flags to turn on and off all the backlights.
- */
- public static final int ALL_LIGHTS = (KEYBOARD_LIGHT|SCREEN_LIGHT|BUTTON_LIGHT);
-
- /**
- * Brightness value for fully off
- */
- public static final int BRIGHTNESS_OFF = 0;
-
- /**
- * Brightness value for dim backlight
- */
- public static final int BRIGHTNESS_DIM = 20;
-
- /**
- * Brightness value for fully on
- */
- public static final int BRIGHTNESS_ON = 255;
-
- /**
- * Brightness value to use when battery is low
- */
- public static final int BRIGHTNESS_LOW_BATTERY = 10;
-
- /**
- * Threshold for BRIGHTNESS_LOW_BATTERY (percentage)
- * Screen will stay dim if battery level is <= LOW_BATTERY_THRESHOLD
- */
- public static final int LOW_BATTERY_THRESHOLD = 10;
-
- /**
- * Set the brightness for one or more lights
- *
- * @param mask flags indicating which lights to change brightness
- * @param brightness new brightness value (0 = off, 255 = fully bright)
- */
- public static native int setLightBrightness(int mask, int brightness);
-
- /**
- * Turn the screen on or off
- *
- * @param on Whether you want the screen on or off
- */
- public static native int setScreenState(boolean on);
-
- public static native int setLastUserActivityTimeout(long ms);
-
- /**
- * Turn the device off.
- *
- * This method is considered deprecated in favor of
- * {@link android.policy.ShutdownThread.shutdownAfterDisablingRadio()}.
- *
- * @deprecated
- * @hide
- */
- @Deprecated
- public static native void shutdown();
-
- /**
- * Reboot the device.
- * @param reason code to pass to the kernel (e.g. "recovery"), or null.
- *
- * @throws IOException if reboot fails for some reason (eg, lack of
- * permission)
- */
- public static native void reboot(String reason) throws IOException;
-}
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
deleted file mode 100644
index bfcf2fc..0000000
--- a/core/java/android/os/PowerManager.java
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
- * Copyright (C) 2007 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 android.os;
-
-import android.util.Log;
-
-import com.android.internal.os.RuntimeInit;
-
-/**
- * This class gives you control of the power state of the device.
- *
- * <p><b>Device battery life will be significantly affected by the use of this API.</b> Do not
- * acquire WakeLocks unless you really need them, use the minimum levels possible, and be sure
- * to release it as soon as you can.
- *
- * <p>You can obtain an instance of this class by calling
- * {@link android.content.Context#getSystemService(java.lang.String) Context.getSystemService()}.
- *
- * <p>The primary API you'll use is {@link #newWakeLock(int, String) newWakeLock()}. This will
- * create a {@link PowerManager.WakeLock} object. You can then use methods on this object to
- * control the power state of the device. In practice it's quite simple:
- *
- * {@samplecode
- * PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
- * PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
- * wl.acquire();
- * ..screen will stay on during this section..
- * wl.release();
- * }
- *
- * <p>The following flags are defined, with varying effects on system power. <i>These flags are
- * mutually exclusive - you may only specify one of them.</i>
- * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
- *
- * <thead>
- * <tr><th>Flag Value</th>
- * <th>CPU</th> <th>Screen</th> <th>Keyboard</th></tr>
- * </thead>
- *
- * <tbody>
- * <tr><th>{@link #PARTIAL_WAKE_LOCK}</th>
- * <td>On*</td> <td>Off</td> <td>Off</td>
- * </tr>
- *
- * <tr><th>{@link #SCREEN_DIM_WAKE_LOCK}</th>
- * <td>On</td> <td>Dim</td> <td>Off</td>
- * </tr>
- *
- * <tr><th>{@link #SCREEN_BRIGHT_WAKE_LOCK}</th>
- * <td>On</td> <td>Bright</td> <td>Off</td>
- * </tr>
- *
- * <tr><th>{@link #FULL_WAKE_LOCK}</th>
- * <td>On</td> <td>Bright</td> <td>Bright</td>
- * </tr>
- * </tbody>
- * </table>
- *
- * <p>*<i>If you hold a partial wakelock, the CPU will continue to run, irrespective of any timers
- * and even after the user presses the power button. In all other wakelocks, the CPU will run, but
- * the user can still put the device to sleep using the power button.</i>
- *
- * <p>In addition, you can add two more flags, which affect behavior of the screen only. <i>These
- * flags have no effect when combined with a {@link #PARTIAL_WAKE_LOCK}.</i>
- * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
- *
- * <thead>
- * <tr><th>Flag Value</th> <th>Description</th></tr>
- * </thead>
- *
- * <tbody>
- * <tr><th>{@link #ACQUIRE_CAUSES_WAKEUP}</th>
- * <td>Normal wake locks don't actually turn on the illumination. Instead, they cause
- * the illumination to remain on once it turns on (e.g. from user activity). This flag
- * will force the screen and/or keyboard to turn on immediately, when the WakeLock is
- * acquired. A typical use would be for notifications which are important for the user to
- * see immediately.</td>
- * </tr>
- *
- * <tr><th>{@link #ON_AFTER_RELEASE}</th>
- * <td>If this flag is set, the user activity timer will be reset when the WakeLock is
- * released, causing the illumination to remain on a bit longer. This can be used to
- * reduce flicker if you are cycling between wake lock conditions.</td>
- * </tr>
- * </tbody>
- * </table>
- *
- *
- */
-public class PowerManager
-{
- private static final String TAG = "PowerManager";
-
- /**
- * These internal values define the underlying power elements that we might
- * want to control individually. Eventually we'd like to expose them.
- */
- private static final int WAKE_BIT_CPU_STRONG = 1;
- private static final int WAKE_BIT_CPU_WEAK = 2;
- private static final int WAKE_BIT_SCREEN_DIM = 4;
- private static final int WAKE_BIT_SCREEN_BRIGHT = 8;
- private static final int WAKE_BIT_KEYBOARD_BRIGHT = 16;
-
- private static final int LOCK_MASK = WAKE_BIT_CPU_STRONG
- | WAKE_BIT_CPU_WEAK
- | WAKE_BIT_SCREEN_DIM
- | WAKE_BIT_SCREEN_BRIGHT
- | WAKE_BIT_KEYBOARD_BRIGHT;
-
- /**
- * Wake lock that ensures that the CPU is running. The screen might
- * not be on.
- */
- public static final int PARTIAL_WAKE_LOCK = WAKE_BIT_CPU_STRONG;
-
- /**
- * Wake lock that ensures that the screen and keyboard are on at
- * full brightness.
- */
- public static final int FULL_WAKE_LOCK = WAKE_BIT_CPU_WEAK | WAKE_BIT_SCREEN_BRIGHT
- | WAKE_BIT_KEYBOARD_BRIGHT;
-
- /**
- * Wake lock that ensures that the screen is on at full brightness;
- * the keyboard backlight will be allowed to go off.
- */
- public static final int SCREEN_BRIGHT_WAKE_LOCK = WAKE_BIT_CPU_WEAK | WAKE_BIT_SCREEN_BRIGHT;
-
- /**
- * Wake lock that ensures that the screen is on (but may be dimmed);
- * the keyboard backlight will be allowed to go off.
- */
- public static final int SCREEN_DIM_WAKE_LOCK = WAKE_BIT_CPU_WEAK | WAKE_BIT_SCREEN_DIM;
-
- /**
- * Normally wake locks don't actually wake the device, they just cause
- * it to remain on once it's already on. Think of the video player
- * app as the normal behavior. Notifications that pop up and want
- * the device to be on are the exception; use this flag to be like them.
- * <p>
- * Does not work with PARTIAL_WAKE_LOCKs.
- */
- public static final int ACQUIRE_CAUSES_WAKEUP = 0x10000000;
-
- /**
- * When this wake lock is released, poke the user activity timer
- * so the screen stays on for a little longer.
- * <p>
- * Will not turn the screen on if it is not already on. See {@link #ACQUIRE_CAUSES_WAKEUP}
- * if you want that.
- * <p>
- * Does not work with PARTIAL_WAKE_LOCKs.
- */
- public static final int ON_AFTER_RELEASE = 0x20000000;
-
- /**
- * Class lets you say that you need to have the device on.
- *
- * <p>Call release when you are done and don't need the lock anymore.
- */
- public class WakeLock
- {
- static final int RELEASE_WAKE_LOCK = 1;
-
- Runnable mReleaser = new Runnable() {
- public void run() {
- release();
- }
- };
-
- int mFlags;
- String mTag;
- IBinder mToken;
- int mCount = 0;
- boolean mRefCounted = true;
- boolean mHeld = false;
-
- WakeLock(int flags, String tag)
- {
- switch (flags & LOCK_MASK) {
- case PARTIAL_WAKE_LOCK:
- case SCREEN_DIM_WAKE_LOCK:
- case SCREEN_BRIGHT_WAKE_LOCK:
- case FULL_WAKE_LOCK:
- break;
- default:
- throw new IllegalArgumentException();
- }
-
- mFlags = flags;
- mTag = tag;
- mToken = new Binder();
- }
-
- /**
- * Sets whether this WakeLock is ref counted.
- *
- * @param value true for ref counted, false for not ref counted.
- */
- public void setReferenceCounted(boolean value)
- {
- mRefCounted = value;
- }
-
- /**
- * Makes sure the device is on at the level you asked when you created
- * the wake lock.
- */
- public void acquire()
- {
- synchronized (mToken) {
- if (!mRefCounted || mCount++ == 0) {
- try {
- mService.acquireWakeLock(mFlags, mToken, mTag);
- } catch (RemoteException e) {
- }
- mHeld = true;
- }
- }
- }
-
- /**
- * Makes sure the device is on at the level you asked when you created
- * the wake lock. The lock will be released after the given timeout.
- *
- * @param timeout Release the lock after the give timeout in milliseconds.
- */
- public void acquire(long timeout) {
- acquire();
- mHandler.postDelayed(mReleaser, timeout);
- }
-
-
- /**
- * Release your claim to the CPU or screen being on.
- *
- * <p>
- * It may turn off shortly after you release it, or it may not if there
- * are other wake locks held.
- */
- public void release()
- {
- synchronized (mToken) {
- if (!mRefCounted || --mCount == 0) {
- try {
- mService.releaseWakeLock(mToken);
- } catch (RemoteException e) {
- }
- mHeld = false;
- }
- if (mCount < 0) {
- throw new RuntimeException("WakeLock under-locked " + mTag);
- }
- }
- }
-
- public boolean isHeld()
- {
- synchronized (mToken) {
- return mHeld;
- }
- }
-
- public String toString() {
- synchronized (mToken) {
- return "WakeLock{"
- + Integer.toHexString(System.identityHashCode(this))
- + " held=" + mHeld + ", refCount=" + mCount + "}";
- }
- }
-
- @Override
- protected void finalize() throws Throwable
- {
- synchronized (mToken) {
- if (mHeld) {
- try {
- mService.releaseWakeLock(mToken);
- } catch (RemoteException e) {
- }
- RuntimeInit.crash(TAG, new Exception(
- "WakeLock finalized while still held: "+mTag));
- }
- }
- }
- }
-
- /**
- * Get a wake lock at the level of the flags parameter. Call
- * {@link WakeLock#acquire() acquire()} on the object to acquire the
- * wake lock, and {@link WakeLock#release release()} when you are done.
- *
- * {@samplecode
- *PowerManager pm = (PowerManager)mContext.getSystemService(
- * Context.POWER_SERVICE);
- *PowerManager.WakeLock wl = pm.newWakeLock(
- * PowerManager.SCREEN_DIM_WAKE_LOCK
- * | PowerManager.ON_AFTER_RELEASE,
- * TAG);
- *wl.acquire();
- * // ...
- *wl.release();
- * }
- *
- * @param flags Combination of flag values defining the requested behavior of the WakeLock.
- * @param tag Your class name (or other tag) for debugging purposes.
- *
- * @see WakeLock#acquire()
- * @see WakeLock#release()
- */
- public WakeLock newWakeLock(int flags, String tag)
- {
- return new WakeLock(flags, tag);
- }
-
- /**
- * User activity happened.
- * <p>
- * Turns the device from whatever state it's in to full on, and resets
- * the auto-off timer.
- *
- * @param when is used to order this correctly with the wake lock calls.
- * This time should be in the {@link SystemClock#uptimeMillis
- * SystemClock.uptimeMillis()} time base.
- * @param noChangeLights should be true if you don't want the lights to
- * turn on because of this event. This is set when the power
- * key goes down. We want the device to stay on while the button
- * is down, but we're about to turn off. Otherwise the lights
- * flash on and then off and it looks weird.
- */
- public void userActivity(long when, boolean noChangeLights)
- {
- try {
- mService.userActivity(when, noChangeLights);
- } catch (RemoteException e) {
- }
- }
-
- /**
- * Force the device to go to sleep. Overrides all the wake locks that are
- * held.
- *
- * @param time is used to order this correctly with the wake lock calls.
- * The time should be in the {@link SystemClock#uptimeMillis
- * SystemClock.uptimeMillis()} time base.
- */
- public void goToSleep(long time)
- {
- try {
- mService.goToSleep(time);
- } catch (RemoteException e) {
- }
- }
-
- private PowerManager()
- {
- }
-
- /**
- * {@hide}
- */
- public PowerManager(IPowerManager service, Handler handler)
- {
- mService = service;
- mHandler = handler;
- }
-
- /**
- * TODO: It would be nice to be able to set the poke lock here,
- * but I'm not sure what would be acceptable as an interface -
- * either a PokeLock object (like WakeLock) or, possibly just a
- * method call to set the poke lock.
- */
-
- IPowerManager mService;
- Handler mHandler;
-}
-
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
deleted file mode 100644
index cd86fbe..0000000
--- a/core/java/android/os/Process.java
+++ /dev/null
@@ -1,706 +0,0 @@
-/*
- * 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 android.os;
-
-import android.net.LocalSocketAddress;
-import android.net.LocalSocket;
-import android.util.Log;
-import dalvik.system.Zygote;
-
-import java.io.BufferedWriter;
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.util.ArrayList;
-
-/*package*/ class ZygoteStartFailedEx extends Exception {
- /**
- * Something prevented the zygote process startup from happening normally
- */
-
- ZygoteStartFailedEx() {};
- ZygoteStartFailedEx(String s) {super(s);}
- ZygoteStartFailedEx(Throwable cause) {super(cause);}
-}
-
-/**
- * Tools for managing OS processes.
- */
-public class Process {
- private static final String LOG_TAG = "Process";
-
- private static final String ZYGOTE_SOCKET = "zygote";
-
- /**
- * Name of a process for running the platform's media services.
- * {@hide}
- */
- public static final String ANDROID_SHARED_MEDIA = "com.android.process.media";
-
- /**
- * Name of the process that Google content providers can share.
- * {@hide}
- */
- public static final String GOOGLE_SHARED_APP_CONTENT = "com.google.process.content";
-
- /**
- * Defines the UID/GID under which system code runs.
- */
- public static final int SYSTEM_UID = 1000;
-
- /**
- * Defines the UID/GID under which the telephony code runs.
- */
- public static final int PHONE_UID = 1001;
-
- /**
- * Defines the start of a range of UIDs (and GIDs), going from this
- * number to {@link #LAST_APPLICATION_UID} that are reserved for assigning
- * to applications.
- */
- public static final int FIRST_APPLICATION_UID = 10000;
- /**
- * Last of application-specific UIDs starting at
- * {@link #FIRST_APPLICATION_UID}.
- */
- public static final int LAST_APPLICATION_UID = 99999;
-
- /**
- * Defines a secondary group id for access to the bluetooth hardware.
- */
- public static final int BLUETOOTH_GID = 2000;
-
- /**
- * Standard priority of application threads.
- * Use with {@link #setThreadPriority(int)} and
- * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
- * {@link java.lang.Thread} class.
- */
- public static final int THREAD_PRIORITY_DEFAULT = 0;
-
- /*
- * ***************************************
- * ** Keep in sync with utils/threads.h **
- * ***************************************
- */
-
- /**
- * Lowest available thread priority. Only for those who really, really
- * don't want to run if anything else is happening.
- * Use with {@link #setThreadPriority(int)} and
- * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
- * {@link java.lang.Thread} class.
- */
- public static final int THREAD_PRIORITY_LOWEST = 19;
-
- /**
- * Standard priority background threads. This gives your thread a slightly
- * lower than normal priority, so that it will have less chance of impacting
- * the responsiveness of the user interface.
- * Use with {@link #setThreadPriority(int)} and
- * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
- * {@link java.lang.Thread} class.
- */
- public static final int THREAD_PRIORITY_BACKGROUND = 10;
-
- /**
- * Standard priority of threads that are currently running a user interface
- * that the user is interacting with. Applications can not normally
- * change to this priority; the system will automatically adjust your
- * application threads as the user moves through the UI.
- * Use with {@link #setThreadPriority(int)} and
- * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
- * {@link java.lang.Thread} class.
- */
- public static final int THREAD_PRIORITY_FOREGROUND = -2;
-
- /**
- * Standard priority of system display threads, involved in updating
- * the user interface. Applications can not
- * normally change to this priority.
- * Use with {@link #setThreadPriority(int)} and
- * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
- * {@link java.lang.Thread} class.
- */
- public static final int THREAD_PRIORITY_DISPLAY = -4;
-
- /**
- * Standard priority of the most important display threads, for compositing
- * the screen and retrieving input events. Applications can not normally
- * change to this priority.
- * Use with {@link #setThreadPriority(int)} and
- * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
- * {@link java.lang.Thread} class.
- */
- public static final int THREAD_PRIORITY_URGENT_DISPLAY = -8;
-
- /**
- * Standard priority of audio threads. Applications can not normally
- * change to this priority.
- * Use with {@link #setThreadPriority(int)} and
- * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
- * {@link java.lang.Thread} class.
- */
- public static final int THREAD_PRIORITY_AUDIO = -16;
-
- /**
- * Standard priority of the most important audio threads.
- * Applications can not normally change to this priority.
- * Use with {@link #setThreadPriority(int)} and
- * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
- * {@link java.lang.Thread} class.
- */
- public static final int THREAD_PRIORITY_URGENT_AUDIO = -19;
-
- /**
- * Minimum increment to make a priority more favorable.
- */
- public static final int THREAD_PRIORITY_MORE_FAVORABLE = -1;
-
- /**
- * Minimum increment to make a priority less favorable.
- */
- public static final int THREAD_PRIORITY_LESS_FAVORABLE = +1;
-
- public static final int SIGNAL_QUIT = 3;
- public static final int SIGNAL_KILL = 9;
- public static final int SIGNAL_USR1 = 10;
-
- // State for communicating with zygote process
-
- static LocalSocket sZygoteSocket;
- static DataInputStream sZygoteInputStream;
- static BufferedWriter sZygoteWriter;
-
- /** true if previous zygote open failed */
- static boolean sPreviousZygoteOpenFailed;
-
- /**
- * Start a new process.
- *
- * <p>If processes are enabled, a new process is created and the
- * static main() function of a <var>processClass</var> is executed there.
- * The process will continue running after this function returns.
- *
- * <p>If processes are not enabled, a new thread in the caller's
- * process is created and main() of <var>processClass</var> called there.
- *
- * <p>The niceName parameter, if not an empty string, is a custom name to
- * give to the process instead of using processClass. This allows you to
- * make easily identifyable processes even if you are using the same base
- * <var>processClass</var> to start them.
- *
- * @param processClass The class to use as the process's main entry
- * point.
- * @param niceName A more readable name to use for the process.
- * @param uid The user-id under which the process will run.
- * @param gid The group-id under which the process will run.
- * @param gids Additional group-ids associated with the process.
- * @param enableDebugger True if debugging should be enabled for this process.
- * @param zygoteArgs Additional arguments to supply to the zygote process.
- *
- * @return int If > 0 the pid of the new process; if 0 the process is
- * being emulated by a thread
- * @throws RuntimeException on fatal start failure
- *
- * {@hide}
- */
- public static final int start(final String processClass,
- final String niceName,
- int uid, int gid, int[] gids,
- int debugFlags,
- String[] zygoteArgs)
- {
- if (supportsProcesses()) {
- try {
- return startViaZygote(processClass, niceName, uid, gid, gids,
- debugFlags, zygoteArgs);
- } catch (ZygoteStartFailedEx ex) {
- Log.e(LOG_TAG,
- "Starting VM process through Zygote failed");
- throw new RuntimeException(
- "Starting VM process through Zygote failed", ex);
- }
- } else {
- // Running in single-process mode
-
- Runnable runnable = new Runnable() {
- public void run() {
- Process.invokeStaticMain(processClass);
- }
- };
-
- // Thread constructors must not be called with null names (see spec).
- if (niceName != null) {
- new Thread(runnable, niceName).start();
- } else {
- new Thread(runnable).start();
- }
-
- return 0;
- }
- }
-
- /**
- * Start a new process. Don't supply a custom nice name.
- * {@hide}
- */
- public static final int start(String processClass, int uid, int gid,
- int[] gids, int debugFlags, String[] zygoteArgs) {
- return start(processClass, "", uid, gid, gids,
- debugFlags, zygoteArgs);
- }
-
- private static void invokeStaticMain(String className) {
- Class cl;
- Object args[] = new Object[1];
-
- args[0] = new String[0]; //this is argv
-
- try {
- cl = Class.forName(className);
- cl.getMethod("main", new Class[] { String[].class })
- .invoke(null, args);
- } catch (Exception ex) {
- // can be: ClassNotFoundException,
- // NoSuchMethodException, SecurityException,
- // IllegalAccessException, IllegalArgumentException
- // InvocationTargetException
- // or uncaught exception from main()
-
- Log.e(LOG_TAG, "Exception invoking static main on "
- + className, ex);
-
- throw new RuntimeException(ex);
- }
-
- }
-
- /** retry interval for opening a zygote socket */
- static final int ZYGOTE_RETRY_MILLIS = 500;
-
- /**
- * Tries to open socket to Zygote process if not already open. If
- * already open, does nothing. May block and retry.
- */
- private static void openZygoteSocketIfNeeded()
- throws ZygoteStartFailedEx {
-
- int retryCount;
-
- if (sPreviousZygoteOpenFailed) {
- /*
- * If we've failed before, expect that we'll fail again and
- * don't pause for retries.
- */
- retryCount = 0;
- } else {
- retryCount = 10;
- }
-
- /*
- * See bug #811181: Sometimes runtime can make it up before zygote.
- * Really, we'd like to do something better to avoid this condition,
- * but for now just wait a bit...
- */
- for (int retry = 0
- ; (sZygoteSocket == null) && (retry < (retryCount + 1))
- ; retry++ ) {
-
- if (retry > 0) {
- try {
- Log.i("Zygote", "Zygote not up yet, sleeping...");
- Thread.sleep(ZYGOTE_RETRY_MILLIS);
- } catch (InterruptedException ex) {
- // should never happen
- }
- }
-
- try {
- sZygoteSocket = new LocalSocket();
-
- sZygoteSocket.connect(new LocalSocketAddress(ZYGOTE_SOCKET,
- LocalSocketAddress.Namespace.RESERVED));
-
- sZygoteInputStream
- = new DataInputStream(sZygoteSocket.getInputStream());
-
- sZygoteWriter =
- new BufferedWriter(
- new OutputStreamWriter(
- sZygoteSocket.getOutputStream()),
- 256);
-
- Log.i("Zygote", "Process: zygote socket opened");
-
- sPreviousZygoteOpenFailed = false;
- break;
- } catch (IOException ex) {
- if (sZygoteSocket != null) {
- try {
- sZygoteSocket.close();
- } catch (IOException ex2) {
- Log.e(LOG_TAG,"I/O exception on close after exception",
- ex2);
- }
- }
-
- sZygoteSocket = null;
- }
- }
-
- if (sZygoteSocket == null) {
- sPreviousZygoteOpenFailed = true;
- throw new ZygoteStartFailedEx("connect failed");
- }
- }
-
- /**
- * Sends an argument list to the zygote process, which starts a new child
- * and returns the child's pid. Please note: the present implementation
- * replaces newlines in the argument list with spaces.
- * @param args argument list
- * @return PID of new child process
- * @throws ZygoteStartFailedEx if process start failed for any reason
- */
- private static int zygoteSendArgsAndGetPid(ArrayList<String> args)
- throws ZygoteStartFailedEx {
-
- int pid;
-
- openZygoteSocketIfNeeded();
-
- try {
- /**
- * See com.android.internal.os.ZygoteInit.readArgumentList()
- * Presently the wire format to the zygote process is:
- * a) a count of arguments (argc, in essence)
- * b) a number of newline-separated argument strings equal to count
- *
- * After the zygote process reads these it will write the pid of
- * the child or -1 on failure.
- */
-
- sZygoteWriter.write(Integer.toString(args.size()));
- sZygoteWriter.newLine();
-
- int sz = args.size();
- for (int i = 0; i < sz; i++) {
- String arg = args.get(i);
- if (arg.indexOf('\n') >= 0) {
- throw new ZygoteStartFailedEx(
- "embedded newlines not allowed");
- }
- sZygoteWriter.write(arg);
- sZygoteWriter.newLine();
- }
-
- sZygoteWriter.flush();
-
- // Should there be a timeout on this?
- pid = sZygoteInputStream.readInt();
-
- if (pid < 0) {
- throw new ZygoteStartFailedEx("fork() failed");
- }
- } catch (IOException ex) {
- try {
- if (sZygoteSocket != null) {
- sZygoteSocket.close();
- }
- } catch (IOException ex2) {
- // we're going to fail anyway
- Log.e(LOG_TAG,"I/O exception on routine close", ex2);
- }
-
- sZygoteSocket = null;
-
- throw new ZygoteStartFailedEx(ex);
- }
-
- return pid;
- }
-
- /**
- * Starts a new process via the zygote mechanism.
- *
- * @param processClass Class name whose static main() to run
- * @param niceName 'nice' process name to appear in ps
- * @param uid a POSIX uid that the new process should setuid() to
- * @param gid a POSIX gid that the new process shuold setgid() to
- * @param gids null-ok; a list of supplementary group IDs that the
- * new process should setgroup() to.
- * @param enableDebugger True if debugging should be enabled for this process.
- * @param extraArgs Additional arguments to supply to the zygote process.
- * @return PID
- * @throws ZygoteStartFailedEx if process start failed for any reason
- */
- private static int startViaZygote(final String processClass,
- final String niceName,
- final int uid, final int gid,
- final int[] gids,
- int debugFlags,
- String[] extraArgs)
- throws ZygoteStartFailedEx {
- int pid;
-
- synchronized(Process.class) {
- ArrayList<String> argsForZygote = new ArrayList<String>();
-
- // --runtime-init, --setuid=, --setgid=,
- // and --setgroups= must go first
- argsForZygote.add("--runtime-init");
- argsForZygote.add("--setuid=" + uid);
- argsForZygote.add("--setgid=" + gid);
- if ((debugFlags & Zygote.DEBUG_ENABLE_DEBUGGER) != 0) {
- argsForZygote.add("--enable-debugger");
- }
- if ((debugFlags & Zygote.DEBUG_ENABLE_CHECKJNI) != 0) {
- argsForZygote.add("--enable-checkjni");
- }
- if ((debugFlags & Zygote.DEBUG_ENABLE_ASSERT) != 0) {
- argsForZygote.add("--enable-assert");
- }
-
- //TODO optionally enable debuger
- //argsForZygote.add("--enable-debugger");
-
- // --setgroups is a comma-separated list
- if (gids != null && gids.length > 0) {
- StringBuilder sb = new StringBuilder();
- sb.append("--setgroups=");
-
- int sz = gids.length;
- for (int i = 0; i < sz; i++) {
- if (i != 0) {
- sb.append(',');
- }
- sb.append(gids[i]);
- }
-
- argsForZygote.add(sb.toString());
- }
-
- if (niceName != null) {
- argsForZygote.add("--nice-name=" + niceName);
- }
-
- argsForZygote.add(processClass);
-
- if (extraArgs != null) {
- for (String arg : extraArgs) {
- argsForZygote.add(arg);
- }
- }
-
- pid = zygoteSendArgsAndGetPid(argsForZygote);
- }
-
- if (pid <= 0) {
- throw new ZygoteStartFailedEx("zygote start failed:" + pid);
- }
-
- return pid;
- }
-
- /**
- * Returns elapsed milliseconds of the time this process has run.
- * @return Returns the number of milliseconds this process has return.
- */
- public static final native long getElapsedCpuTime();
-
- /**
- * Returns the identifier of this process, which can be used with
- * {@link #killProcess} and {@link #sendSignal}.
- */
- public static final native int myPid();
-
- /**
- * Returns the identifier of the calling thread, which be used with
- * {@link #setThreadPriority(int, int)}.
- */
- public static final native int myTid();
-
- /**
- * Returns the identifier of this process's user.
- */
- public static final native int myUid();
-
- /**
- * Returns the UID assigned to a particular user name, or -1 if there is
- * none. If the given string consists of only numbers, it is converted
- * directly to a uid.
- */
- public static final native int getUidForName(String name);
-
- /**
- * Returns the GID assigned to a particular user name, or -1 if there is
- * none. If the given string consists of only numbers, it is converted
- * directly to a gid.
- */
- public static final native int getGidForName(String name);
-
- /**
- * Set the priority of a thread, based on Linux priorities.
- *
- * @param tid The identifier of the thread/process to change.
- * @param priority A Linux priority level, from -20 for highest scheduling
- * priority to 19 for lowest scheduling priority.
- *
- * @throws IllegalArgumentException Throws IllegalArgumentException if
- * <var>tid</var> does not exist.
- * @throws SecurityException Throws SecurityException if your process does
- * not have permission to modify the given thread, or to use the given
- * priority.
- */
- public static final native void setThreadPriority(int tid, int priority)
- throws IllegalArgumentException, SecurityException;
-
- /**
- * Set the priority of the calling thread, based on Linux priorities. See
- * {@link #setThreadPriority(int, int)} for more information.
- *
- * @param priority A Linux priority level, from -20 for highest scheduling
- * priority to 19 for lowest scheduling priority.
- *
- * @throws IllegalArgumentException Throws IllegalArgumentException if
- * <var>tid</var> does not exist.
- * @throws SecurityException Throws SecurityException if your process does
- * not have permission to modify the given thread, or to use the given
- * priority.
- *
- * @see #setThreadPriority(int, int)
- */
- public static final native void setThreadPriority(int priority)
- throws IllegalArgumentException, SecurityException;
-
- /**
- * Return the current priority of a thread, based on Linux priorities.
- *
- * @param tid The identifier of the thread/process to change.
- *
- * @return Returns the current priority, as a Linux priority level,
- * from -20 for highest scheduling priority to 19 for lowest scheduling
- * priority.
- *
- * @throws IllegalArgumentException Throws IllegalArgumentException if
- * <var>tid</var> does not exist.
- */
- public static final native int getThreadPriority(int tid)
- throws IllegalArgumentException;
-
- /**
- * Determine whether the current environment supports multiple processes.
- *
- * @return Returns true if the system can run in multiple processes, else
- * false if everything is running in a single process.
- */
- public static final native boolean supportsProcesses();
-
- /**
- * Set the out-of-memory badness adjustment for a process.
- *
- * @param pid The process identifier to set.
- * @param amt Adjustment value -- linux allows -16 to +15.
- *
- * @return Returns true if the underlying system supports this
- * feature, else false.
- *
- * {@hide}
- */
- public static final native boolean setOomAdj(int pid, int amt);
-
- /**
- * Change this process's argv[0] parameter. This can be useful to show
- * more descriptive information in things like the 'ps' command.
- *
- * @param text The new name of this process.
- *
- * {@hide}
- */
- public static final native void setArgV0(String text);
-
- /**
- * Kill the process with the given PID.
- * Note that, though this API allows us to request to
- * kill any process based on its PID, the kernel will
- * still impose standard restrictions on which PIDs you
- * are actually able to kill. Typically this means only
- * the process running the caller's packages/application
- * and any additional processes created by that app; packages
- * sharing a common UID will also be able to kill each
- * other's processes.
- */
- public static final void killProcess(int pid) {
- sendSignal(pid, SIGNAL_KILL);
- }
-
- /** @hide */
- public static final native int setUid(int uid);
-
- /** @hide */
- public static final native int setGid(int uid);
-
- /**
- * Send a signal to the given process.
- *
- * @param pid The pid of the target process.
- * @param signal The signal to send.
- */
- public static final native void sendSignal(int pid, int signal);
-
- /** @hide */
- public static final native int getFreeMemory();
-
- /** @hide */
- public static final native void readProcLines(String path,
- String[] reqFields, long[] outSizes);
-
- /** @hide */
- public static final native int[] getPids(String path, int[] lastArray);
-
- /** @hide */
- public static final int PROC_TERM_MASK = 0xff;
- /** @hide */
- public static final int PROC_ZERO_TERM = 0;
- /** @hide */
- public static final int PROC_SPACE_TERM = (int)' ';
- /** @hide */
- public static final int PROC_COMBINE = 0x100;
- /** @hide */
- public static final int PROC_PARENS = 0x200;
- /** @hide */
- public static final int PROC_OUT_STRING = 0x1000;
- /** @hide */
- public static final int PROC_OUT_LONG = 0x2000;
- /** @hide */
- public static final int PROC_OUT_FLOAT = 0x4000;
-
- /** @hide */
- public static final native boolean readProcFile(String file, int[] format,
- String[] outStrings, long[] outLongs, float[] outFloats);
-
- /**
- * Gets the total Pss value for a given process, in bytes.
- *
- * @param pid the process to the Pss for
- * @return the total Pss value for the given process in bytes,
- * or -1 if the value cannot be determined
- * @hide
- */
- public static final native long getPss(int pid);
-}
diff --git a/core/java/android/os/Registrant.java b/core/java/android/os/Registrant.java
deleted file mode 100644
index c1780b9..0000000
--- a/core/java/android/os/Registrant.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * 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 android.os;
-
-import android.os.Handler;
-import android.os.Message;
-
-import java.lang.ref.WeakReference;
-import java.util.HashMap;
-
-/** @hide */
-public class Registrant
-{
- public
- Registrant(Handler h, int what, Object obj)
- {
- refH = new WeakReference(h);
- this.what = what;
- userObj = obj;
- }
-
- public void
- clear()
- {
- refH = null;
- userObj = null;
- }
-
- public void
- notifyRegistrant()
- {
- internalNotifyRegistrant (null, null);
- }
-
- public void
- notifyResult(Object result)
- {
- internalNotifyRegistrant (result, null);
- }
-
- public void
- notifyException(Throwable exception)
- {
- internalNotifyRegistrant (null, exception);
- }
-
- /**
- * This makes a copy of @param ar
- */
- public void
- notifyRegistrant(AsyncResult ar)
- {
- internalNotifyRegistrant (ar.result, ar.exception);
- }
-
- /*package*/ void
- internalNotifyRegistrant (Object result, Throwable exception)
- {
- Handler h = getHandler();
-
- if (h == null) {
- clear();
- } else {
- Message msg = Message.obtain();
-
- msg.what = what;
-
- msg.obj = new AsyncResult(userObj, result, exception);
-
- h.sendMessage(msg);
- }
- }
-
- /**
- * NOTE: May return null if weak reference has been collected
- */
-
- public Message
- messageForRegistrant()
- {
- Handler h = getHandler();
-
- if (h == null) {
- clear();
-
- return null;
- } else {
- Message msg = h.obtainMessage();
-
- msg.what = what;
- msg.obj = userObj;
-
- return msg;
- }
- }
-
- public Handler
- getHandler()
- {
- if (refH == null)
- return null;
-
- return (Handler) refH.get();
- }
-
- WeakReference refH;
- int what;
- Object userObj;
-}
-
diff --git a/core/java/android/os/RegistrantList.java b/core/java/android/os/RegistrantList.java
deleted file mode 100644
index 56b9e2b..0000000
--- a/core/java/android/os/RegistrantList.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * 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 android.os;
-
-import android.os.Handler;
-import android.os.Message;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-/** @hide */
-public class RegistrantList
-{
- ArrayList registrants = new ArrayList(); // of Registrant
-
- public synchronized void
- add(Handler h, int what, Object obj)
- {
- add(new Registrant(h, what, obj));
- }
-
- public synchronized void
- addUnique(Handler h, int what, Object obj)
- {
- // if the handler is already in the registrant list, remove it
- remove(h);
- add(new Registrant(h, what, obj));
- }
-
- public synchronized void
- add(Registrant r)
- {
- removeCleared();
- registrants.add(r);
- }
-
- public synchronized void
- removeCleared()
- {
- for (int i = registrants.size() - 1; i >= 0 ; i--) {
- Registrant r = (Registrant) registrants.get(i);
-
- if (r.refH == null) {
- registrants.remove(i);
- }
- }
- }
-
- public synchronized int
- size()
- {
- return registrants.size();
- }
-
- public synchronized Object
- get(int index)
- {
- return registrants.get(index);
- }
-
- private synchronized void
- internalNotifyRegistrants (Object result, Throwable exception)
- {
- for (int i = 0, s = registrants.size(); i < s ; i++) {
- Registrant r = (Registrant) registrants.get(i);
- r.internalNotifyRegistrant(result, exception);
- }
- }
-
- public /*synchronized*/ void
- notifyRegistrants()
- {
- internalNotifyRegistrants(null, null);
- }
-
- public /*synchronized*/ void
- notifyException(Throwable exception)
- {
- internalNotifyRegistrants (null, exception);
- }
-
- public /*synchronized*/ void
- notifyResult(Object result)
- {
- internalNotifyRegistrants (result, null);
- }
-
-
- public /*synchronized*/ void
- notifyRegistrants(AsyncResult ar)
- {
- internalNotifyRegistrants(ar.result, ar.exception);
- }
-
- public synchronized void
- remove(Handler h)
- {
- for (int i = 0, s = registrants.size() ; i < s ; i++) {
- Registrant r = (Registrant) registrants.get(i);
- Handler rh;
-
- rh = r.getHandler();
-
- /* Clean up both the requested registrant and
- * any now-collected registrants
- */
- if (rh == null || rh == h) {
- r.clear();
- }
- }
-
- removeCleared();
- }
-}
diff --git a/core/java/android/os/RemoteCallbackList.java b/core/java/android/os/RemoteCallbackList.java
deleted file mode 100644
index 04e7ef0..0000000
--- a/core/java/android/os/RemoteCallbackList.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Copyright (C) 2008 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 android.os;
-
-import java.util.HashMap;
-
-/**
- * Takes care of the grunt work of maintaining a list of remote interfaces,
- * typically for the use of performing callbacks from a
- * {@link android.app.Service} to its clients. In particular, this:
- *
- * <ul>
- * <li> Keeps track of a set of registered {@link IInterface} callbacks,
- * taking care to identify them through their underlying unique {@link IBinder}
- * (by calling {@link IInterface#asBinder IInterface.asBinder()}.
- * <li> Attaches a {@link IBinder.DeathRecipient IBinder.DeathRecipient} to
- * each registered interface, so that it can be cleaned out of the list if its
- * process goes away.
- * <li> Performs locking of the underlying list of interfaces to deal with
- * multithreaded incoming calls, and a thread-safe way to iterate over a
- * snapshot of the list without holding its lock.
- * </ul>
- *
- * <p>To use this class, simply create a single instance along with your
- * service, and call its {@link #register} and {@link #unregister} methods
- * as client register and unregister with your service. To call back on to
- * the registered clients, use {@link #beginBroadcast},
- * {@link #getBroadcastItem}, and {@link #finishBroadcast}.
- *
- * <p>If a registered callback's process goes away, this class will take
- * care of automatically removing it from the list. If you want to do
- * additional work in this situation, you can create a subclass that
- * implements the {@link #onCallbackDied} method.
- */
-public class RemoteCallbackList<E extends IInterface> {
- /*package*/ HashMap<IBinder, Callback> mCallbacks
- = new HashMap<IBinder, Callback>();
- private IInterface[] mActiveBroadcast;
- private boolean mKilled = false;
-
- private final class Callback implements IBinder.DeathRecipient {
- final E mCallback;
-
- Callback(E callback) {
- mCallback = callback;
- }
-
- public void binderDied() {
- synchronized (mCallbacks) {
- mCallbacks.remove(mCallback.asBinder());
- }
- onCallbackDied(mCallback);
- }
- }
-
- /**
- * Add a new callback to the list. This callback will remain in the list
- * until a corresponding call to {@link #unregister} or its hosting process
- * goes away. If the callback was already registered (determined by
- * checking to see if the {@link IInterface#asBinder callback.asBinder()}
- * object is already in the list), then it will be left as-is.
- * Registrations are not counted; a single call to {@link #unregister}
- * will remove a callback after any number calls to register it.
- *
- * @param callback The callback interface to be added to the list. Must
- * not be null -- passing null here will cause a NullPointerException.
- * Most services will want to check for null before calling this with
- * an object given from a client, so that clients can't crash the
- * service with bad data.
- *
- * @return Returns true if the callback was successfully added to the list.
- * Returns false if it was not added, either because {@link #kill} had
- * previously been called or the callback's process has gone away.
- *
- * @see #unregister
- * @see #kill
- * @see #onCallbackDied
- */
- public boolean register(E callback) {
- synchronized (mCallbacks) {
- if (mKilled) {
- return false;
- }
- IBinder binder = callback.asBinder();
- try {
- Callback cb = new Callback(callback);
- binder.linkToDeath(cb, 0);
- mCallbacks.put(binder, cb);
- return true;
- } catch (RemoteException e) {
- return false;
- }
- }
- }
-
- /**
- * Remove from the list a callback that was previously added with
- * {@link #register}. This uses the
- * {@link IInterface#asBinder callback.asBinder()} object to correctly
- * find the previous registration.
- * Registrations are not counted; a single unregister call will remove
- * a callback after any number calls to {@link #register} for it.
- *
- * @param callback The callback to be removed from the list. Passing
- * null here will cause a NullPointerException, so you will generally want
- * to check for null before calling.
- *
- * @return Returns true if the callback was found and unregistered. Returns
- * false if the given callback was not found on the list.
- *
- * @see #register
- */
- public boolean unregister(E callback) {
- synchronized (mCallbacks) {
- Callback cb = mCallbacks.remove(callback.asBinder());
- if (cb != null) {
- cb.mCallback.asBinder().unlinkToDeath(cb, 0);
- return true;
- }
- return false;
- }
- }
-
- /**
- * Disable this callback list. All registered callbacks are unregistered,
- * and the list is disabled so that future calls to {@link #register} will
- * fail. This should be used when a Service is stopping, to prevent clients
- * from registering callbacks after it is stopped.
- *
- * @see #register
- */
- public void kill() {
- synchronized (mCallbacks) {
- for (Callback cb : mCallbacks.values()) {
- cb.mCallback.asBinder().unlinkToDeath(cb, 0);
- }
- mCallbacks.clear();
- mKilled = true;
- }
- }
-
- /**
- * Called when the process hosting a callback in the list has gone away.
- * The default implementation does nothing.
- *
- * @param callback The callback whose process has died. Note that, since
- * its process has died, you can not make any calls on to this interface.
- * You can, however, retrieve its IBinder and compare it with another
- * IBinder to see if it is the same object.
- *
- * @see #register
- */
- public void onCallbackDied(E callback) {
- }
-
- /**
- * Prepare to start making calls to the currently registered callbacks.
- * This creates a copy of the callback list, which you can retrieve items
- * from using {@link #getBroadcastItem}. Note that only one broadcast can
- * be active at a time, so you must be sure to always call this from the
- * same thread (usually by scheduling with {@link Handler} or
- * do your own synchronization. You must call {@link #finishBroadcast}
- * when done.
- *
- * <p>A typical loop delivering a broadcast looks like this:
- *
- * <pre>
- * final int N = callbacks.beginBroadcast();
- * for (int i=0; i<N; i++) {
- * try {
- * callbacks.getBroadcastItem(i).somethingHappened();
- * } catch (RemoteException e) {
- * // The RemoteCallbackList will take care of removing
- * // the dead object for us.
- * }
- * }
- * callbacks.finishBroadcast();</pre>
- *
- * @return Returns the number of callbacks in the broadcast, to be used
- * with {@link #getBroadcastItem} to determine the range of indices you
- * can supply.
- *
- * @see #getBroadcastItem
- * @see #finishBroadcast
- */
- public int beginBroadcast() {
- synchronized (mCallbacks) {
- final int N = mCallbacks.size();
- if (N <= 0) {
- return 0;
- }
- IInterface[] active = mActiveBroadcast;
- if (active == null || active.length < N) {
- mActiveBroadcast = active = new IInterface[N];
- }
- int i=0;
- for (Callback cb : mCallbacks.values()) {
- active[i++] = cb.mCallback;
- }
- return N;
- }
- }
-
- /**
- * Retrieve an item in the active broadcast that was previously started
- * with {@link #beginBroadcast}. This can <em>only</em> be called after
- * the broadcast is started, and its data is no longer valid after
- * calling {@link #finishBroadcast}.
- *
- * <p>Note that it is possible for the process of one of the returned
- * callbacks to go away before you call it, so you will need to catch
- * {@link RemoteException} when calling on to the returned object.
- * The callback list itself, however, will take care of unregistering
- * these objects once it detects that it is no longer valid, so you can
- * handle such an exception by simply ignoring it.
- *
- * @param index Which of the registered callbacks you would like to
- * retrieve. Ranges from 0 to 1-{@link #beginBroadcast}.
- *
- * @return Returns the callback interface that you can call. This will
- * always be non-null.
- *
- * @see #beginBroadcast
- */
- public E getBroadcastItem(int index) {
- return (E)mActiveBroadcast[index];
- }
-
- /**
- * Clean up the state of a broadcast previously initiated by calling
- * {@link #beginBroadcast}. This must always be called when you are done
- * with a broadcast.
- *
- * @see #beginBroadcast
- */
- public void finishBroadcast() {
- IInterface[] active = mActiveBroadcast;
- if (active != null) {
- final int N = active.length;
- for (int i=0; i<N; i++) {
- active[i] = null;
- }
- }
- }
-}
diff --git a/core/java/android/os/RemoteException.java b/core/java/android/os/RemoteException.java
deleted file mode 100644
index 9d76156..0000000
--- a/core/java/android/os/RemoteException.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 android.os;
-import android.util.AndroidException;
-
-/**
- * Parent exception for all Binder remote-invocation errors
- */
-public class RemoteException extends AndroidException {
- public RemoteException() {
- super();
- }
-}
diff --git a/core/java/android/os/RemoteMailException.java b/core/java/android/os/RemoteMailException.java
deleted file mode 100644
index 1ac96d1..0000000
--- a/core/java/android/os/RemoteMailException.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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 android.os;
-
-/** @hide */
-public class RemoteMailException extends Exception
-{
- public RemoteMailException()
- {
- }
-
- public RemoteMailException(String s)
- {
- super(s);
- }
-}
-
diff --git a/core/java/android/os/ServiceManager.java b/core/java/android/os/ServiceManager.java
deleted file mode 100644
index b721665..0000000
--- a/core/java/android/os/ServiceManager.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2007 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 android.os;
-
-import com.android.internal.os.BinderInternal;
-
-import android.util.Log;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/** @hide */
-public final class ServiceManager {
- private static final String TAG = "ServiceManager";
-
- private static IServiceManager sServiceManager;
- private static HashMap<String, IBinder> sCache = new HashMap<String, IBinder>();
-
- private static IServiceManager getIServiceManager() {
- if (sServiceManager != null) {
- return sServiceManager;
- }
-
- // Find the service manager
- sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject());
- return sServiceManager;
- }
-
- /**
- * Returns a reference to a service with the given name.
- *
- * @param name the name of the service to get
- * @return a reference to the service, or <code>null</code> if the service doesn't exist
- */
- public static IBinder getService(String name) {
- try {
- IBinder service = sCache.get(name);
- if (service != null) {
- return service;
- } else {
- return getIServiceManager().getService(name);
- }
- } catch (RemoteException e) {
- Log.e(TAG, "error in getService", e);
- }
- return null;
- }
-
- /**
- * Place a new @a service called @a name into the service
- * manager.
- *
- * @param name the name of the new service
- * @param service the service object
- */
- public static void addService(String name, IBinder service) {
- try {
- getIServiceManager().addService(name, service);
- } catch (RemoteException e) {
- Log.e(TAG, "error in addService", e);
- }
- }
-
- /**
- * Retrieve an existing service called @a name from the
- * service manager. Non-blocking.
- */
- public static IBinder checkService(String name) {
- try {
- IBinder service = sCache.get(name);
- if (service != null) {
- return service;
- } else {
- return getIServiceManager().checkService(name);
- }
- } catch (RemoteException e) {
- Log.e(TAG, "error in checkService", e);
- return null;
- }
- }
-
- /**
- * Return a list of all currently running services.
- */
- public static String[] listServices() throws RemoteException {
- try {
- return getIServiceManager().listServices();
- } catch (RemoteException e) {
- Log.e(TAG, "error in listServices", e);
- return null;
- }
- }
-
- /**
- * This is only intended to be called when the process is first being brought
- * up and bound by the activity manager. There is only one thread in the process
- * at that time, so no locking is done.
- *
- * @param cache the cache of service references
- * @hide
- */
- public static void initServiceCache(Map<String, IBinder> cache) {
- if (sCache.size() != 0 && Process.supportsProcesses()) {
- throw new IllegalStateException("setServiceCache may only be called once");
- }
- sCache.putAll(cache);
- }
-}
diff --git a/core/java/android/os/ServiceManagerNative.java b/core/java/android/os/ServiceManagerNative.java
deleted file mode 100644
index 2aab0e6..0000000
--- a/core/java/android/os/ServiceManagerNative.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * 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 android.os;
-
-
-/**
- * Native implementation of the service manager. Most clients will only
- * care about getDefault() and possibly asInterface().
- * @hide
- */
-public abstract class ServiceManagerNative extends Binder implements IServiceManager
-{
- /**
- * Cast a Binder object into a service manager interface, generating
- * a proxy if needed.
- */
- static public IServiceManager asInterface(IBinder obj)
- {
- if (obj == null) {
- return null;
- }
- IServiceManager in =
- (IServiceManager)obj.queryLocalInterface(descriptor);
- if (in != null) {
- return in;
- }
-
- return new ServiceManagerProxy(obj);
- }
-
- public ServiceManagerNative()
- {
- attachInterface(this, descriptor);
- }
-
- public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
- {
- try {
- switch (code) {
- case IServiceManager.GET_SERVICE_TRANSACTION: {
- data.enforceInterface(IServiceManager.descriptor);
- String name = data.readString();
- IBinder service = getService(name);
- reply.writeStrongBinder(service);
- return true;
- }
-
- case IServiceManager.CHECK_SERVICE_TRANSACTION: {
- data.enforceInterface(IServiceManager.descriptor);
- String name = data.readString();
- IBinder service = checkService(name);
- reply.writeStrongBinder(service);
- return true;
- }
-
- case IServiceManager.ADD_SERVICE_TRANSACTION: {
- data.enforceInterface(IServiceManager.descriptor);
- String name = data.readString();
- IBinder service = data.readStrongBinder();
- addService(name, service);
- return true;
- }
-
- case IServiceManager.LIST_SERVICES_TRANSACTION: {
- data.enforceInterface(IServiceManager.descriptor);
- String[] list = listServices();
- reply.writeStringArray(list);
- return true;
- }
-
- case IServiceManager.SET_PERMISSION_CONTROLLER_TRANSACTION: {
- data.enforceInterface(IServiceManager.descriptor);
- IPermissionController controller
- = IPermissionController.Stub.asInterface(
- data.readStrongBinder());
- setPermissionController(controller);
- return true;
- }
- }
- } catch (RemoteException e) {
- }
-
- return false;
- }
-
- public IBinder asBinder()
- {
- return this;
- }
-}
-
-class ServiceManagerProxy implements IServiceManager {
- public ServiceManagerProxy(IBinder remote) {
- mRemote = remote;
- }
-
- public IBinder asBinder() {
- return mRemote;
- }
-
- public IBinder getService(String name) throws RemoteException {
- Parcel data = Parcel.obtain();
- Parcel reply = Parcel.obtain();
- data.writeInterfaceToken(IServiceManager.descriptor);
- data.writeString(name);
- mRemote.transact(GET_SERVICE_TRANSACTION, data, reply, 0);
- IBinder binder = reply.readStrongBinder();
- reply.recycle();
- data.recycle();
- return binder;
- }
-
- public IBinder checkService(String name) throws RemoteException {
- Parcel data = Parcel.obtain();
- Parcel reply = Parcel.obtain();
- data.writeInterfaceToken(IServiceManager.descriptor);
- data.writeString(name);
- mRemote.transact(CHECK_SERVICE_TRANSACTION, data, reply, 0);
- IBinder binder = reply.readStrongBinder();
- reply.recycle();
- data.recycle();
- return binder;
- }
-
- public void addService(String name, IBinder service)
- throws RemoteException {
- Parcel data = Parcel.obtain();
- Parcel reply = Parcel.obtain();
- data.writeInterfaceToken(IServiceManager.descriptor);
- data.writeString(name);
- data.writeStrongBinder(service);
- mRemote.transact(ADD_SERVICE_TRANSACTION, data, reply, 0);
- reply.recycle();
- data.recycle();
- }
-
- public String[] listServices() throws RemoteException {
- Parcel data = Parcel.obtain();
- Parcel reply = Parcel.obtain();
- data.writeInterfaceToken(IServiceManager.descriptor);
- mRemote.transact(LIST_SERVICES_TRANSACTION, data, reply, 0);
- String[] list = reply.readStringArray();
- reply.recycle();
- data.recycle();
- return list;
- }
-
- public void setPermissionController(IPermissionController controller)
- throws RemoteException {
- Parcel data = Parcel.obtain();
- Parcel reply = Parcel.obtain();
- data.writeInterfaceToken(IServiceManager.descriptor);
- data.writeStrongBinder(controller.asBinder());
- mRemote.transact(SET_PERMISSION_CONTROLLER_TRANSACTION, data, reply, 0);
- reply.recycle();
- data.recycle();
- }
-
- private IBinder mRemote;
-}
diff --git a/core/java/android/os/StatFs.java b/core/java/android/os/StatFs.java
deleted file mode 100644
index 912bfdf..0000000
--- a/core/java/android/os/StatFs.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2007 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 android.os;
-
-/**
- * Retrieve overall information about the space on a filesystem. This is a
- * Wrapper for Unix statfs().
- */
-public class StatFs {
- /**
- * Construct a new StatFs for looking at the stats of the
- * filesystem at <var>path</var>. Upon construction, the stat of
- * the file system will be performed, and the values retrieved available
- * from the methods on this class.
- *
- * @param path A path in the desired file system to state.
- */
- public StatFs(String path) { native_setup(path); }
-
- /**
- * Perform a restat of the file system referenced by this object. This
- * is the same as re-constructing the object with the same file system
- * path, and the new stat values are available upon return.
- */
- public void restat(String path) { native_restat(path); }
-
- @Override
- protected void finalize() { native_finalize(); }
-
- /**
- * The size, in bytes, of a block on the file system. This corresponds
- * to the Unix statfs.f_bsize field.
- */
- public native int getBlockSize();
-
- /**
- * The total number of blocks on the file system. This corresponds
- * to the Unix statfs.f_blocks field.
- */
- public native int getBlockCount();
-
- /**
- * The total number of blocks that are free on the file system, including
- * reserved blocks (that are not available to normal applications). This
- * corresponds to the Unix statfs.f_bfree field. Most applications will
- * want to use {@link #getAvailableBlocks()} instead.
- */
- public native int getFreeBlocks();
-
- /**
- * The number of blocks that are free on the file system and available to
- * applications. This corresponds to the Unix statfs.f_bavail field.
- */
- public native int getAvailableBlocks();
-
- private int mNativeContext;
- private native void native_restat(String path);
- private native void native_setup(String path);
- private native void native_finalize();
-}
diff --git a/core/java/android/os/SystemClock.java b/core/java/android/os/SystemClock.java
deleted file mode 100644
index 2b57b39..0000000
--- a/core/java/android/os/SystemClock.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * 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 android.os;
-
-
-/**
- * Core timekeeping facilities.
- *
- * <p> Three different clocks are available, and they should not be confused:
- *
- * <ul>
- * <li> <p> {@link System#currentTimeMillis System.currentTimeMillis()}
- * is the standard "wall" clock (time and date) expressing milliseconds
- * since the epoch. The wall clock can be set by the user or the phone
- * network (see {@link #setCurrentTimeMillis}), so the time may jump
- * backwards or forwards unpredictably. This clock should only be used
- * when correspondence with real-world dates and times is important, such
- * as in a calendar or alarm clock application. Interval or elapsed
- * time measurements should use a different clock.
- *
- * <li> <p> {@link #uptimeMillis} is counted in milliseconds since the
- * system was booted. This clock stops when the system enters deep
- * sleep (CPU off, display dark, device waiting for external input),
- * but is not affected by clock scaling, idle, or other power saving
- * mechanisms. This is the basis for most interval timing
- * such as {@link Thread#sleep(long) Thread.sleep(millls)},
- * {@link Object#wait(long) Object.wait(millis)}, and
- * {@link System#nanoTime System.nanoTime()}. This clock is guaranteed
- * to be monotonic, and is the recommended basis for the general purpose
- * interval timing of user interface events, performance measurements,
- * and anything else that does not need to measure elapsed time during
- * device sleep. Most methods that accept a timestamp value expect the
- * {@link #uptimeMillis} clock.
- *
- * <li> <p> {@link #elapsedRealtime} is counted in milliseconds since the
- * system was booted, including deep sleep. This clock should be used
- * when measuring time intervals that may span periods of system sleep.
- * </ul>
- *
- * There are several mechanisms for controlling the timing of events:
- *
- * <ul>
- * <li> <p> Standard functions like {@link Thread#sleep(long)
- * Thread.sleep(millis)} and {@link Object#wait(long) Object.wait(millis)}
- * are always available. These functions use the {@link #uptimeMillis}
- * clock; if the device enters sleep, the remainder of the time will be
- * postponed until the device wakes up. These synchronous functions may
- * be interrupted with {@link Thread#interrupt Thread.interrupt()}, and
- * you must handle {@link InterruptedException}.
- *
- * <li> <p> {@link #sleep SystemClock.sleep(millis)} is a utility function
- * very similar to {@link Thread#sleep(long) Thread.sleep(millis)}, but it
- * ignores {@link InterruptedException}. Use this function for delays if
- * you do not use {@link Thread#interrupt Thread.interrupt()}, as it will
- * preserve the interrupted state of the thread.
- *
- * <li> <p> The {@link android.os.Handler} class can schedule asynchronous
- * callbacks at an absolute or relative time. Handler objects also use the
- * {@link #uptimeMillis} clock, and require an {@link android.os.Looper
- * event loop} (normally present in any GUI application).
- *
- * <li> <p> The {@link android.app.AlarmManager} can trigger one-time or
- * recurring events which occur even when the device is in deep sleep
- * or your application is not running. Events may be scheduled with your
- * choice of {@link java.lang.System#currentTimeMillis} (RTC) or
- * {@link #elapsedRealtime} (ELAPSED_REALTIME), and cause an
- * {@link android.content.Intent} broadcast when they occur.
- * </ul>
- */
-public final class SystemClock {
- /**
- * This class is uninstantiable.
- */
- private SystemClock() {
- // This space intentionally left blank.
- }
-
- /**
- * Waits a given number of milliseconds (of uptimeMillis) before returning.
- * Similar to {@link java.lang.Thread#sleep(long)}, but does not throw
- * {@link InterruptedException}; {@link Thread#interrupt()} events are
- * deferred until the next interruptible operation. Does not return until
- * at least the specified number of milliseconds has elapsed.
- *
- * @param ms to sleep before returning, in milliseconds of uptime.
- */
- public static void sleep(long ms)
- {
- long start = uptimeMillis();
- long duration = ms;
- boolean interrupted = false;
- do {
- try {
- Thread.sleep(duration);
- }
- catch (InterruptedException e) {
- interrupted = true;
- }
- duration = start + ms - uptimeMillis();
- } while (duration > 0);
-
- if (interrupted) {
- // Important: we don't want to quietly eat an interrupt() event,
- // so we make sure to re-interrupt the thread so that the next
- // call to Thread.sleep() or Object.wait() will be interrupted.
- Thread.currentThread().interrupt();
- }
- }
-
- /**
- * Sets the current wall time, in milliseconds. Requires the calling
- * process to have appropriate permissions.
- *
- * @return if the clock was successfully set to the specified time.
- */
- native public static boolean setCurrentTimeMillis(long millis);
-
- /**
- * Returns milliseconds since boot, not counting time spent in deep sleep.
- * <b>Note:</b> This value may get reset occasionally (before it would
- * otherwise wrap around).
- *
- * @return milliseconds of non-sleep uptime since boot.
- */
- native public static long uptimeMillis();
-
- /**
- * Returns milliseconds since boot, including time spent in sleep.
- *
- * @return elapsed milliseconds since boot.
- */
- native public static long elapsedRealtime();
-
- /**
- * Returns milliseconds running in the current thread.
- *
- * @return elapsed milliseconds in the thread
- */
- public static native long currentThreadTimeMillis();
-}
diff --git a/core/java/android/os/SystemProperties.java b/core/java/android/os/SystemProperties.java
deleted file mode 100644
index c3ae3c2..0000000
--- a/core/java/android/os/SystemProperties.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * 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 android.os;
-
-
-/**
- * Gives access to the system properties store. The system properties
- * store contains a list of string key-value pairs.
- *
- * {@hide}
- */
-public class SystemProperties
-{
- public static final int PROP_NAME_MAX = 31;
- public static final int PROP_VALUE_MAX = 91;
-
- private static native String native_get(String key);
- private static native String native_get(String key, String def);
- private static native void native_set(String key, String def);
-
- /**
- * Get the value for the given key.
- * @return an empty string if the key isn't found
- * @throws IllegalArgumentException if the key exceeds 32 characters
- */
- public static String get(String key) {
- if (key.length() > PROP_NAME_MAX) {
- throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
- }
- return native_get(key);
- }
-
- /**
- * Get the value for the given key.
- * @return if the key isn't found, return def if it isn't null, or an empty string otherwise
- * @throws IllegalArgumentException if the key exceeds 32 characters
- */
- public static String get(String key, String def) {
- if (key.length() > PROP_NAME_MAX) {
- throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
- }
- return native_get(key, def);
- }
-
- /**
- * Get the value for the given key, and return as an integer.
- * @param key the key to lookup
- * @param def a default value to return
- * @return the key parsed as an integer, or def if the key isn't found or
- * cannot be parsed
- * @throws IllegalArgumentException if the key exceeds 32 characters
- */
- public static int getInt(String key, int def) {
- try {
- return Integer.parseInt(get(key));
- } catch (NumberFormatException e) {
- return def;
- }
- }
-
- /**
- * Get the value for the given key, and return as a long.
- * @param key the key to lookup
- * @param def a default value to return
- * @return the key parsed as a long, or def if the key isn't found or
- * cannot be parsed
- * @throws IllegalArgumentException if the key exceeds 32 characters
- */
- public static long getLong(String key, long def) {
- try {
- return Long.parseLong(get(key));
- } catch (NumberFormatException e) {
- return def;
- }
- }
-
- /**
- * Get the value for the given key, returned as a boolean.
- * Values 'n', 'no', '0', 'false' or 'off' are considered false.
- * Values 'y', 'yes', '1', 'true' or 'on' are considered true.
- * (case insensitive).
- * If the key does not exist, or has any other value, then the default
- * result is returned.
- * @param key the key to lookup
- * @param def a default value to return
- * @return the key parsed as a boolean, or def if the key isn't found or is
- * not able to be parsed as a boolean.
- * @throws IllegalArgumentException if the key exceeds 32 characters
- */
- public static boolean getBoolean(String key, boolean def) {
- String value = get(key);
- // Deal with these quick cases first: not found, 0 and 1
- if (value.equals("")) {
- return def;
- } else if (value.equals("0")) {
- return false;
- } else if (value.equals("1")) {
- return true;
- // now for slower (and hopefully less common) cases
- } else if (value.equalsIgnoreCase("n") ||
- value.equalsIgnoreCase("no") ||
- value.equalsIgnoreCase("false") ||
- value.equalsIgnoreCase("off")) {
- return false;
- } else if (value.equalsIgnoreCase("y") ||
- value.equalsIgnoreCase("yes") ||
- value.equalsIgnoreCase("true") ||
- value.equalsIgnoreCase("on")) {
- return true;
- }
- return def;
- }
-
- /**
- * Set the value for the given key.
- * @throws IllegalArgumentException if the key exceeds 32 characters
- * @throws IllegalArgumentException if the value exceeds 92 characters
- */
- public static void set(String key, String val) {
- if (key.length() > PROP_NAME_MAX) {
- throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
- }
- if (val != null && val.length() > PROP_VALUE_MAX) {
- throw new IllegalArgumentException("val.length > " +
- PROP_VALUE_MAX);
- }
- native_set(key, val);
- }
-}
diff --git a/core/java/android/os/SystemService.java b/core/java/android/os/SystemService.java
deleted file mode 100644
index 447cd1f..0000000
--- a/core/java/android/os/SystemService.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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 android.os;
-
-/** @hide */
-public class SystemService
-{
- /** Request that the init daemon start a named service. */
- public static void start(String name) {
- SystemProperties.set("ctl.start", name);
- }
-
- /** Request that the init daemon stop a named service. */
- public static void stop(String name) {
- SystemProperties.set("ctl.stop", name);
- }
-}
diff --git a/core/java/android/os/TokenWatcher.java b/core/java/android/os/TokenWatcher.java
deleted file mode 100755
index ac3cc92..0000000
--- a/core/java/android/os/TokenWatcher.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (C) 2007 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 android.os;
-
-import java.util.WeakHashMap;
-import java.util.Set;
-import android.util.Log;
-
-/**
- * Helper class that helps you use IBinder objects as reference counted
- * tokens. IBinders make good tokens because we find out when they are
- * removed
- *
- */
-public abstract class TokenWatcher
-{
- /**
- * Construct the TokenWatcher
- *
- * @param h A handler to call {@link #acquired} and {@link #released}
- * on. If you don't care, just call it like this, although your thread
- * will have to be a Looper thread.
- * <code>new TokenWatcher(new Handler())</code>
- * @param tag A debugging tag for this TokenWatcher
- */
- public TokenWatcher(Handler h, String tag)
- {
- mHandler = h;
- mTag = tag != null ? tag : "TokenWatcher";
- }
-
- /**
- * Called when the number of active tokens goes from 0 to 1.
- */
- public abstract void acquired();
-
- /**
- * Called when the number of active tokens goes from 1 to 0.
- */
- public abstract void released();
-
- /**
- * Record that this token has been acquired. When acquire is called, and
- * the current count is 0, the acquired method is called on the given
- * handler.
- *
- * @param token An IBinder object. If this token has already been acquired,
- * no action is taken.
- * @param tag A string used by the {@link #dump} method for debugging,
- * to see who has references.
- */
- public void acquire(IBinder token, String tag)
- {
- synchronized (mTokens) {
- // explicitly checked to avoid bogus sendNotification calls because
- // of the WeakHashMap and the GC
- int oldSize = mTokens.size();
-
- Death d = new Death(token, tag);
- try {
- token.linkToDeath(d, 0);
- } catch (RemoteException e) {
- return;
- }
- mTokens.put(token, d);
-
- if (oldSize == 0 && !mAcquired) {
- sendNotificationLocked(true);
- mAcquired = true;
- }
- }
- }
-
- public void cleanup(IBinder token, boolean unlink)
- {
- synchronized (mTokens) {
- Death d = mTokens.remove(token);
- if (unlink && d != null) {
- d.token.unlinkToDeath(d, 0);
- d.token = null;
- }
-
- if (mTokens.size() == 0 && mAcquired) {
- sendNotificationLocked(false);
- mAcquired = false;
- }
- }
- }
-
- public void release(IBinder token)
- {
- cleanup(token, true);
- }
-
- public boolean isAcquired()
- {
- synchronized (mTokens) {
- return mAcquired;
- }
- }
-
- public void dump()
- {
- synchronized (mTokens) {
- Set<IBinder> keys = mTokens.keySet();
- Log.i(mTag, "Token count: " + mTokens.size());
- int i = 0;
- for (IBinder b: keys) {
- Log.i(mTag, "[" + i + "] " + mTokens.get(b).tag + " - " + b);
- i++;
- }
- }
- }
-
- private Runnable mNotificationTask = new Runnable() {
- public void run()
- {
- int value;
- synchronized (mTokens) {
- value = mNotificationQueue;
- mNotificationQueue = -1;
- }
- if (value == 1) {
- acquired();
- }
- else if (value == 0) {
- released();
- }
- }
- };
-
- private void sendNotificationLocked(boolean on)
- {
- int value = on ? 1 : 0;
- if (mNotificationQueue == -1) {
- // empty
- mNotificationQueue = value;
- mHandler.post(mNotificationTask);
- }
- else if (mNotificationQueue != value) {
- // it's a pair, so cancel it
- mNotificationQueue = -1;
- mHandler.removeCallbacks(mNotificationTask);
- }
- // else, same so do nothing -- maybe we should warn?
- }
-
- private class Death implements IBinder.DeathRecipient
- {
- IBinder token;
- String tag;
-
- Death(IBinder token, String tag)
- {
- this.token = token;
- this.tag = tag;
- }
-
- public void binderDied()
- {
- cleanup(token, false);
- }
-
- protected void finalize() throws Throwable
- {
- try {
- if (token != null) {
- Log.w(mTag, "cleaning up leaked reference: " + tag);
- release(token);
- }
- }
- finally {
- super.finalize();
- }
- }
- }
-
- private WeakHashMap<IBinder,Death> mTokens = new WeakHashMap<IBinder,Death>();
- private Handler mHandler;
- private String mTag;
- private int mNotificationQueue = -1;
- private volatile boolean mAcquired = false;
-}
diff --git a/core/java/android/os/UEventObserver.java b/core/java/android/os/UEventObserver.java
deleted file mode 100644
index b924e84..0000000
--- a/core/java/android/os/UEventObserver.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright (C) 2008 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 android.os;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-/**
- * UEventObserver is an abstract class that receives UEvent's from the kernel.<p>
- *
- * Subclass UEventObserver, implementing onUEvent(UEvent event), then call
- * startObserving() with a match string. The UEvent thread will then call your
- * onUEvent() method when a UEvent occurs that contains your match string.<p>
- *
- * Call stopObserving() to stop receiving UEvent's.<p>
- *
- * There is only one UEvent thread per process, even if that process has
- * multiple UEventObserver subclass instances. The UEvent thread starts when
- * the startObserving() is called for the first time in that process. Once
- * started the UEvent thread will not stop (although it can stop notifying
- * UEventObserver's via stopObserving()).<p>
- *
- * @hide
-*/
-public abstract class UEventObserver {
- private static final String TAG = UEventObserver.class.getSimpleName();
-
- /**
- * Representation of a UEvent.
- */
- static public class UEvent {
- // collection of key=value pairs parsed from the uevent message
- public HashMap<String,String> mMap = new HashMap<String,String>();
-
- public UEvent(String message) {
- int offset = 0;
- int length = message.length();
-
- while (offset < length) {
- int equals = message.indexOf('=', offset);
- int at = message.indexOf(0, offset);
- if (at < 0) break;
-
- if (equals > offset && equals < at) {
- // key is before the equals sign, and value is after
- mMap.put(message.substring(offset, equals),
- message.substring(equals + 1, at));
- }
-
- offset = at + 1;
- }
- }
-
- public String get(String key) {
- return mMap.get(key);
- }
-
- public String get(String key, String defaultValue) {
- String result = mMap.get(key);
- return (result == null ? defaultValue : result);
- }
-
- public String toString() {
- return mMap.toString();
- }
- }
-
- private static UEventThread sThread;
- private static boolean sThreadStarted = false;
-
- private static class UEventThread extends Thread {
- /** Many to many mapping of string match to observer.
- * Multimap would be better, but not available in android, so use
- * an ArrayList where even elements are the String match and odd
- * elements the corresponding UEventObserver observer */
- private ArrayList<Object> mObservers = new ArrayList<Object>();
-
- UEventThread() {
- super("UEventObserver");
- }
-
- public void run() {
- native_setup();
-
- byte[] buffer = new byte[1024];
- int len;
- while (true) {
- len = next_event(buffer);
- if (len > 0) {
- String bufferStr = new String(buffer, 0, len); // easier to search a String
- synchronized (mObservers) {
- for (int i = 0; i < mObservers.size(); i += 2) {
- if (bufferStr.indexOf((String)mObservers.get(i)) != -1) {
- ((UEventObserver)mObservers.get(i+1))
- .onUEvent(new UEvent(bufferStr));
- }
- }
- }
- }
- }
- }
- public void addObserver(String match, UEventObserver observer) {
- synchronized(mObservers) {
- mObservers.add(match);
- mObservers.add(observer);
- }
- }
- /** Removes every key/value pair where value=observer from mObservers */
- public void removeObserver(UEventObserver observer) {
- synchronized(mObservers) {
- boolean found = true;
- while (found) {
- found = false;
- for (int i = 0; i < mObservers.size(); i += 2) {
- if (mObservers.get(i+1) == observer) {
- mObservers.remove(i+1);
- mObservers.remove(i);
- found = true;
- break;
- }
- }
- }
- }
- }
- }
-
- private static native void native_setup();
- private static native int next_event(byte[] buffer);
-
- private static final synchronized void ensureThreadStarted() {
- if (sThreadStarted == false) {
- sThread = new UEventThread();
- sThread.start();
- sThreadStarted = true;
- }
- }
-
- /**
- * Begin observation of UEvent's.<p>
- * This method will cause the UEvent thread to start if this is the first
- * invocation of startObserving in this process.<p>
- * Once called, the UEvent thread will call onUEvent() when an incoming
- * UEvent matches the specified string.<p>
- * This method can be called multiple times to register multiple matches.
- * Only one call to stopObserving is required even with multiple registered
- * matches.
- * @param match A substring of the UEvent to match. Use "" to match all
- * UEvent's
- */
- public final synchronized void startObserving(String match) {
- ensureThreadStarted();
- sThread.addObserver(match, this);
- }
-
- /**
- * End observation of UEvent's.<p>
- * This process's UEvent thread will never call onUEvent() on this
- * UEventObserver after this call. Repeated calls have no effect.
- */
- public final synchronized void stopObserving() {
- sThread.removeObserver(this);
- }
-
- /**
- * Subclasses of UEventObserver should override this method to handle
- * UEvents.
- */
- public abstract void onUEvent(UEvent event);
-
- protected void finalize() throws Throwable {
- try {
- stopObserving();
- } finally {
- super.finalize();
- }
- }
-}
diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java
deleted file mode 100644
index 0f75289..0000000
--- a/core/java/android/os/Vibrator.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * 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 android.os;
-
-/**
- * Class that operates the vibrator on the device.
- * <p>
- * If your process exits, any vibration you started with will stop.
- */
-public class Vibrator
-{
- IHardwareService mService;
-
- /** @hide */
- public Vibrator()
- {
- mService = IHardwareService.Stub.asInterface(
- ServiceManager.getService("hardware"));
- }
-
- /**
- * Turn the vibrator on.
- *
- * @param milliseconds How long to vibrate for.
- */
- public void vibrate(long milliseconds)
- {
- try {
- mService.vibrate(milliseconds);
- } catch (RemoteException e) {
- }
- }
-
- /**
- * Vibrate with a given pattern.
- *
- * <p>
- * Pass in an array of ints that are the times at which to turn on or off
- * the vibrator. The first one is how long to wait before turning it on,
- * and then after that it alternates. If you want to repeat, pass the
- * index into the pattern at which to start the repeat.
- *
- * @param pattern an array of longs of times to turn the vibrator on or off.
- * @param repeat the index into pattern at which to repeat, or -1 if
- * you don't want to repeat.
- */
- public void vibrate(long[] pattern, int repeat)
- {
- // catch this here because the server will do nothing. pattern may
- // not be null, let that be checked, because the server will drop it
- // anyway
- if (repeat < pattern.length) {
- try {
- mService.vibratePattern(pattern, repeat, new Binder());
- } catch (RemoteException e) {
- }
- } else {
- throw new ArrayIndexOutOfBoundsException();
- }
- }
-
- /**
- * Turn the vibrator off.
- */
- public void cancel()
- {
- try {
- mService.cancelVibrate();
- } catch (RemoteException e) {
- }
- }
-}
diff --git a/core/java/android/os/package.html b/core/java/android/os/package.html
deleted file mode 100644
index fb0ecda..0000000
--- a/core/java/android/os/package.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<HTML>
-<BODY>
-Provides basic operating system services, message passing, and inter-process
-communication on the device.
-</BODY>
-</HTML> \ No newline at end of file