19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1938bf51466881b726f42832743d8cca6ee67bb148Greg Hackmannimport android.app.IAlarmManager;
2038bf51466881b726f42832743d8cca6ee67bb148Greg Hackmannimport android.content.Context;
2138bf51466881b726f42832743d8cca6ee67bb148Greg Hackmannimport android.util.Slog;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Core timekeeping facilities.
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> Three different clocks are available, and they should not be confused:
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p> {@link System#currentTimeMillis System.currentTimeMillis()}
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     is the standard "wall" clock (time and date) expressing milliseconds
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     since the epoch.  The wall clock can be set by the user or the phone
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     network (see {@link #setCurrentTimeMillis}), so the time may jump
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     backwards or forwards unpredictably.  This clock should only be used
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     when correspondence with real-world dates and times is important, such
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     as in a calendar or alarm clock application.  Interval or elapsed
3637296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato *     time measurements should use a different clock.  If you are using
3737296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato *     System.currentTimeMillis(), consider listening to the
3837296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato *     {@link android.content.Intent#ACTION_TIME_TICK ACTION_TIME_TICK},
3937296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato *     {@link android.content.Intent#ACTION_TIME_CHANGED ACTION_TIME_CHANGED}
4037296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato *     and {@link android.content.Intent#ACTION_TIMEZONE_CHANGED
4137296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato *     ACTION_TIMEZONE_CHANGED} {@link android.content.Intent Intent}
4237296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato *     broadcasts to find out when the time changes.
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p> {@link #uptimeMillis} is counted in milliseconds since the
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     system was booted.  This clock stops when the system enters deep
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     sleep (CPU off, display dark, device waiting for external input),
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     but is not affected by clock scaling, idle, or other power saving
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     mechanisms.  This is the basis for most interval timing
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     such as {@link Thread#sleep(long) Thread.sleep(millls)},
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link Object#wait(long) Object.wait(millis)}, and
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link System#nanoTime System.nanoTime()}.  This clock is guaranteed
5295f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly *     to be monotonic, and is suitable for interval timing when the
5395f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly *     interval does not span device sleep.  Most methods that accept a
5495f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly *     timestamp value currently expect the {@link #uptimeMillis} clock.
5595f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly *
564118012da9a22694b3353040a485f8cdc27e2f17Philip Milne *     <li> <p> {@link #elapsedRealtime} and {@link #elapsedRealtimeNanos}
5795f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly *     return the time since the system was booted, and include deep sleep.
5895f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly *     This clock is guaranteed to be monotonic, and continues to tick even
5995f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly *     when the CPU is in power saving modes, so is the recommend basis
6095f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly *     for general purpose interval timing.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * There are several mechanisms for controlling the timing of events:
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p> Standard functions like {@link Thread#sleep(long)
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     Thread.sleep(millis)} and {@link Object#wait(long) Object.wait(millis)}
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     are always available.  These functions use the {@link #uptimeMillis}
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     clock; if the device enters sleep, the remainder of the time will be
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     postponed until the device wakes up.  These synchronous functions may
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     be interrupted with {@link Thread#interrupt Thread.interrupt()}, and
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     you must handle {@link InterruptedException}.
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p> {@link #sleep SystemClock.sleep(millis)} is a utility function
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     very similar to {@link Thread#sleep(long) Thread.sleep(millis)}, but it
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     ignores {@link InterruptedException}.  Use this function for delays if
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     you do not use {@link Thread#interrupt Thread.interrupt()}, as it will
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     preserve the interrupted state of the thread.
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p> The {@link android.os.Handler} class can schedule asynchronous
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     callbacks at an absolute or relative time.  Handler objects also use the
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link #uptimeMillis} clock, and require an {@link android.os.Looper
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     event loop} (normally present in any GUI application).
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p> The {@link android.app.AlarmManager} can trigger one-time or
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     recurring events which occur even when the device is in deep sleep
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     or your application is not running.  Events may be scheduled with your
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     choice of {@link java.lang.System#currentTimeMillis} (RTC) or
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link #elapsedRealtime} (ELAPSED_REALTIME), and cause an
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link android.content.Intent} broadcast when they occur.
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class SystemClock {
9538bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann    private static final String TAG = "SystemClock";
9638bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This class is uninstantiable.
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SystemClock() {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This space intentionally left blank.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Waits a given number of milliseconds (of uptimeMillis) before returning.
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Similar to {@link java.lang.Thread#sleep(long)}, but does not throw
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link InterruptedException}; {@link Thread#interrupt()} events are
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * deferred until the next interruptible operation.  Does not return until
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at least the specified number of milliseconds has elapsed.
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ms to sleep before returning, in milliseconds of uptime.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void sleep(long ms)
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long start = uptimeMillis();
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long duration = ms;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean interrupted = false;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        do {
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Thread.sleep(duration);
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            catch (InterruptedException e) {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                interrupted = true;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            duration = start + ms - uptimeMillis();
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } while (duration > 0);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (interrupted) {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Important: we don't want to quietly eat an interrupt() event,
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // so we make sure to re-interrupt the thread so that the next
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // call to Thread.sleep() or Object.wait() will be interrupted.
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.currentThread().interrupt();
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the current wall time, in milliseconds.  Requires the calling
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * process to have appropriate permissions.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return if the clock was successfully set to the specified time.
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14238bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann    public static boolean setCurrentTimeMillis(long millis) {
14338bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann        IBinder b = ServiceManager.getService(Context.ALARM_SERVICE);
14438bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann        IAlarmManager mgr = IAlarmManager.Stub.asInterface(b);
14538bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann        if (mgr == null) {
14638bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann            return false;
14738bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann        }
14838bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann
14938bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann        try {
15038bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann            return mgr.setTime(millis);
15138bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann        } catch (RemoteException e) {
15238bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann            Slog.e(TAG, "Unable to set RTC", e);
15338bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann        } catch (SecurityException e) {
15438bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann            Slog.e(TAG, "Unable to set RTC", e);
15538bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann        }
15638bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann
15738bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann        return false;
15838bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann    }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns milliseconds since boot, not counting time spent in deep sleep.
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return milliseconds of non-sleep uptime since boot.
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native public static long uptimeMillis();
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns milliseconds since boot, including time spent in sleep.
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return elapsed milliseconds since boot.
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native public static long elapsedRealtime();
17395f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly
17495f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly    /**
17595f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly     * Returns nanoseconds since boot, including time spent in sleep.
17695f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly     *
17795f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly     * @return elapsed nanoseconds since boot.
17895f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly     */
1794118012da9a22694b3353040a485f8cdc27e2f17Philip Milne    public static native long elapsedRealtimeNanos();
18095f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns milliseconds running in the current thread.
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return elapsed milliseconds in the thread
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native long currentThreadTimeMillis();
187648bee18a1ccd362445d562729250ff5910f16a0Romain Guy
188648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    /**
189648bee18a1ccd362445d562729250ff5910f16a0Romain Guy     * Returns microseconds running in the current thread.
190648bee18a1ccd362445d562729250ff5910f16a0Romain Guy     *
191648bee18a1ccd362445d562729250ff5910f16a0Romain Guy     * @return elapsed microseconds in the thread
192648bee18a1ccd362445d562729250ff5910f16a0Romain Guy     *
193648bee18a1ccd362445d562729250ff5910f16a0Romain Guy     * @hide
194648bee18a1ccd362445d562729250ff5910f16a0Romain Guy     */
195648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    public static native long currentThreadTimeMicro();
196648bee18a1ccd362445d562729250ff5910f16a0Romain Guy
197648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    /**
198648bee18a1ccd362445d562729250ff5910f16a0Romain Guy     * Returns current wall time in  microseconds.
199648bee18a1ccd362445d562729250ff5910f16a0Romain Guy     *
200648bee18a1ccd362445d562729250ff5910f16a0Romain Guy     * @return elapsed microseconds in wall time
201648bee18a1ccd362445d562729250ff5910f16a0Romain Guy     *
202648bee18a1ccd362445d562729250ff5910f16a0Romain Guy     * @hide
203648bee18a1ccd362445d562729250ff5910f16a0Romain Guy     */
204648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    public static native long currentTimeMicro();
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
206