diff options
29 files changed, 422 insertions, 228 deletions
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index 5c265ab0ba1c..1a2ab81badc3 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -52,7 +52,6 @@ #include "BootAnimation.h" -#define USER_BOOTANIMATION_FILE "/data/local/bootanimation.zip" #define SYSTEM_BOOTANIMATION_FILE "/system/media/bootanimation.zip" #define SYSTEM_ENCRYPTED_BOOTANIMATION_FILE "/system/media/bootanimation-encrypted.zip" #define EXIT_PROP_NAME "service.bootanim.exit" @@ -285,9 +284,6 @@ status_t BootAnimation::readyToRun() { (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) == 0) && ((zipFile = ZipFileRO::open(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE)) != NULL)) || - ((access(USER_BOOTANIMATION_FILE, R_OK) == 0) && - ((zipFile = ZipFileRO::open(USER_BOOTANIMATION_FILE)) != NULL)) || - ((access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0) && ((zipFile = ZipFileRO::open(SYSTEM_BOOTANIMATION_FILE)) != NULL))) { mZip = zipFile; diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 65c40c16d9bc..d849965a6544 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -93,7 +93,6 @@ import com.android.internal.os.BinderInternal; import com.android.internal.os.RuntimeInit; import com.android.internal.os.SamplingProfilerIntegration; import com.android.internal.util.FastPrintWriter; -import com.android.internal.util.Objects; import com.android.org.conscrypt.OpenSSLSocketImpl; import com.google.android.collect.Lists; @@ -109,6 +108,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.TimeZone; import java.util.regex.Pattern; @@ -222,7 +222,7 @@ public final class ActivityThread { public boolean equals(Object o) { if (o instanceof ProviderKey) { final ProviderKey other = (ProviderKey) o; - return Objects.equal(authority, other.authority) && userId == other.userId; + return Objects.equals(authority, other.authority) && userId == other.userId; } return false; } diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index e6da288fedbd..460790220b67 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -58,7 +58,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.jar.JarEntry; -import java.util.jar.JarFile; +import java.util.jar.StrictJarFile; import java.util.zip.ZipEntry; import com.android.internal.util.XmlUtils; @@ -456,7 +456,7 @@ public class PackageParser { return pi; } - private Certificate[] loadCertificates(JarFile jarFile, JarEntry je, + private Certificate[] loadCertificates(StrictJarFile jarFile, ZipEntry je, byte[] readBuffer) { try { // We must read the stream for the JarEntry to retrieve @@ -466,13 +466,11 @@ public class PackageParser { // not using } is.close(); - return je != null ? je.getCertificates() : null; + return je != null ? jarFile.getCertificates(je) : null; } catch (IOException e) { - Slog.w(TAG, "Exception reading " + je.getName() + " in " - + jarFile.getName(), e); + Slog.w(TAG, "Exception reading " + je.getName() + " in " + jarFile, e); } catch (RuntimeException e) { - Slog.w(TAG, "Exception reading " + je.getName() + " in " - + jarFile.getName(), e); + Slog.w(TAG, "Exception reading " + je.getName() + " in " + jarFile, e); } return null; } @@ -591,9 +589,9 @@ public class PackageParser { */ public boolean collectManifestDigest(Package pkg) { try { - final JarFile jarFile = new JarFile(mArchiveSourcePath); + final StrictJarFile jarFile = new StrictJarFile(mArchiveSourcePath); try { - final ZipEntry je = jarFile.getEntry(ANDROID_MANIFEST_FILENAME); + final ZipEntry je = jarFile.findEntry(ANDROID_MANIFEST_FILENAME); if (je != null) { pkg.manifestDigest = ManifestDigest.fromInputStream(jarFile.getInputStream(je)); } @@ -624,7 +622,7 @@ public class PackageParser { } try { - JarFile jarFile = new JarFile(mArchiveSourcePath); + StrictJarFile jarFile = new StrictJarFile(mArchiveSourcePath); Certificate[] certs = null; @@ -633,7 +631,7 @@ public class PackageParser { // can trust it... we'll just use the AndroidManifest.xml // to retrieve its signatures, not validating all of the // files. - JarEntry jarEntry = jarFile.getJarEntry(ANDROID_MANIFEST_FILENAME); + ZipEntry jarEntry = jarFile.findEntry(ANDROID_MANIFEST_FILENAME); certs = loadCertificates(jarFile, jarEntry, readBuffer); if (certs == null) { Slog.e(TAG, "Package " + pkg.packageName @@ -656,9 +654,9 @@ public class PackageParser { } } } else { - Enumeration<JarEntry> entries = jarFile.entries(); - while (entries.hasMoreElements()) { - final JarEntry je = entries.nextElement(); + Iterator<ZipEntry> entries = jarFile.iterator(); + while (entries.hasNext()) { + final ZipEntry je = entries.next(); if (je.isDirectory()) continue; final String name = je.getName(); @@ -744,6 +742,10 @@ public class PackageParser { Slog.w(TAG, "Exception reading " + mArchiveSourcePath, e); mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; return false; + } catch (SecurityException e) { + Slog.w(TAG, "Exception reading " + mArchiveSourcePath, e); + mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; + return false; } catch (RuntimeException e) { Slog.w(TAG, "Exception reading " + mArchiveSourcePath, e); mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; diff --git a/core/java/android/net/NetworkIdentity.java b/core/java/android/net/NetworkIdentity.java index 3c67bf9e845b..36dd2fdfbcf1 100644 --- a/core/java/android/net/NetworkIdentity.java +++ b/core/java/android/net/NetworkIdentity.java @@ -26,7 +26,7 @@ import android.net.wifi.WifiManager; import android.os.Build; import android.telephony.TelephonyManager; -import com.android.internal.util.Objects; +import java.util.Objects; /** * Network definition that includes strong identity. Analogous to combining @@ -60,7 +60,7 @@ public class NetworkIdentity { @Override public int hashCode() { - return Objects.hashCode(mType, mSubType, mSubscriberId, mNetworkId, mRoaming); + return Objects.hash(mType, mSubType, mSubscriberId, mNetworkId, mRoaming); } @Override @@ -68,8 +68,8 @@ public class NetworkIdentity { if (obj instanceof NetworkIdentity) { final NetworkIdentity ident = (NetworkIdentity) obj; return mType == ident.mType && mSubType == ident.mSubType && mRoaming == ident.mRoaming - && Objects.equal(mSubscriberId, ident.mSubscriberId) - && Objects.equal(mNetworkId, ident.mNetworkId); + && Objects.equals(mSubscriberId, ident.mSubscriberId) + && Objects.equals(mNetworkId, ident.mNetworkId); } return false; } diff --git a/core/java/android/net/NetworkPolicy.java b/core/java/android/net/NetworkPolicy.java index 441db7a0bbe4..10c686b9e211 100644 --- a/core/java/android/net/NetworkPolicy.java +++ b/core/java/android/net/NetworkPolicy.java @@ -21,7 +21,7 @@ import static com.android.internal.util.Preconditions.checkNotNull; import android.os.Parcel; import android.os.Parcelable; -import com.android.internal.util.Objects; +import java.util.Objects; /** * Policy for networks matching a {@link NetworkTemplate}, including usage cycle @@ -146,7 +146,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { @Override public int hashCode() { - return Objects.hashCode(template, cycleDay, cycleTimezone, warningBytes, limitBytes, + return Objects.hash(template, cycleDay, cycleTimezone, warningBytes, limitBytes, lastWarningSnooze, lastLimitSnooze, metered, inferred); } @@ -159,8 +159,8 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { && lastWarningSnooze == other.lastWarningSnooze && lastLimitSnooze == other.lastLimitSnooze && metered == other.metered && inferred == other.inferred - && Objects.equal(cycleTimezone, other.cycleTimezone) - && Objects.equal(template, other.template); + && Objects.equals(cycleTimezone, other.cycleTimezone) + && Objects.equals(template, other.template); } return false; } diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java index 9cb904d4c400..a7aae2ad360f 100644 --- a/core/java/android/net/NetworkStats.java +++ b/core/java/android/net/NetworkStats.java @@ -23,12 +23,12 @@ import android.util.SparseBooleanArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; -import com.android.internal.util.Objects; import java.io.CharArrayWriter; import java.io.PrintWriter; import java.util.Arrays; import java.util.HashSet; +import java.util.Objects; /** * Collection of active network statistics. Can contain summary details across @@ -337,7 +337,7 @@ public class NetworkStats implements Parcelable { public int findIndex(String iface, int uid, int set, int tag) { for (int i = 0; i < size; i++) { if (uid == this.uid[i] && set == this.set[i] && tag == this.tag[i] - && Objects.equal(iface, this.iface[i])) { + && Objects.equals(iface, this.iface[i])) { return i; } } @@ -362,7 +362,7 @@ public class NetworkStats implements Parcelable { } if (uid == this.uid[i] && set == this.set[i] && tag == this.tag[i] - && Objects.equal(iface, this.iface[i])) { + && Objects.equals(iface, this.iface[i])) { return i; } } diff --git a/core/java/android/net/NetworkTemplate.java b/core/java/android/net/NetworkTemplate.java index c189ba4cd630..27197cc8a306 100644 --- a/core/java/android/net/NetworkTemplate.java +++ b/core/java/android/net/NetworkTemplate.java @@ -34,8 +34,9 @@ import android.content.res.Resources; import android.os.Parcel; import android.os.Parcelable; +import java.util.Objects; + import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.Objects; /** * Template definition used to generically match {@link NetworkIdentity}, @@ -176,7 +177,7 @@ public class NetworkTemplate implements Parcelable { @Override public int hashCode() { - return Objects.hashCode(mMatchRule, mSubscriberId, mNetworkId); + return Objects.hash(mMatchRule, mSubscriberId, mNetworkId); } @Override @@ -184,8 +185,8 @@ public class NetworkTemplate implements Parcelable { if (obj instanceof NetworkTemplate) { final NetworkTemplate other = (NetworkTemplate) obj; return mMatchRule == other.mMatchRule - && Objects.equal(mSubscriberId, other.mSubscriberId) - && Objects.equal(mNetworkId, other.mNetworkId); + && Objects.equals(mSubscriberId, other.mSubscriberId) + && Objects.equals(mNetworkId, other.mNetworkId); } return false; } @@ -235,7 +236,7 @@ public class NetworkTemplate implements Parcelable { return true; } else { return ((sForceAllNetworkTypes || contains(DATA_USAGE_NETWORK_TYPES, ident.mType)) - && Objects.equal(mSubscriberId, ident.mSubscriberId)); + && Objects.equals(mSubscriberId, ident.mSubscriberId)); } } @@ -280,7 +281,7 @@ public class NetworkTemplate implements Parcelable { private boolean matchesWifi(NetworkIdentity ident) { switch (ident.mType) { case TYPE_WIFI: - return Objects.equal( + return Objects.equals( removeDoubleQuotes(mNetworkId), removeDoubleQuotes(ident.mNetworkId)); default: return false; diff --git a/core/java/android/view/DisplayAdjustments.java b/core/java/android/view/DisplayAdjustments.java index 041d9e0479e1..35fb50464024 100644 --- a/core/java/android/view/DisplayAdjustments.java +++ b/core/java/android/view/DisplayAdjustments.java @@ -19,7 +19,7 @@ package android.view; import android.content.res.CompatibilityInfo; import android.os.IBinder; -import com.android.internal.util.Objects; +import java.util.Objects; /** @hide */ public class DisplayAdjustments { @@ -91,7 +91,7 @@ public class DisplayAdjustments { return false; } DisplayAdjustments daj = (DisplayAdjustments)o; - return Objects.equal(daj.mCompatInfo, mCompatInfo) && - Objects.equal(daj.mActivityToken, mActivityToken); + return Objects.equals(daj.mCompatInfo, mCompatInfo) && + Objects.equals(daj.mActivityToken, mActivityToken); } } diff --git a/core/java/com/android/internal/util/Objects.java b/core/java/com/android/internal/util/Objects.java deleted file mode 100644 index 2664182c5ea8..000000000000 --- a/core/java/com/android/internal/util/Objects.java +++ /dev/null @@ -1,62 +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 com.android.internal.util; - -import java.util.Arrays; - -/** - * Object utility methods. - */ -public class Objects { - - /** - * Determines whether two possibly-null objects are equal. Returns: - * - * <ul> - * <li>{@code true} if {@code a} and {@code b} are both null. - * <li>{@code true} if {@code a} and {@code b} are both non-null and they are - * equal according to {@link Object#equals(Object)}. - * <li>{@code false} in all other situations. - * </ul> - * - * <p>This assumes that any non-null objects passed to this function conform - * to the {@code equals()} contract. - */ - public static boolean equal(Object a, Object b) { - return a == b || (a != null && a.equals(b)); - } - - /** - * Generates a hash code for multiple values. The hash code is generated by - * calling {@link Arrays#hashCode(Object[])}. - * - * <p>This is useful for implementing {@link Object#hashCode()}. For example, - * in an object that has three properties, {@code x}, {@code y}, and - * {@code z}, one could write: - * <pre> - * public int hashCode() { - * return Objects.hashCode(getX(), getY(), getZ()); - * }</pre> - * - * <b>Warning</b>: When a single object is supplied, the returned hash code - * does not equal the hash code of that object. - */ - public static int hashCode(Object... objects) { - return Arrays.hashCode(objects); - } - -} diff --git a/core/jni/android_os_SystemClock.cpp b/core/jni/android_os_SystemClock.cpp index d20b8005071c..5f4d57080c40 100644 --- a/core/jni/android_os_SystemClock.cpp +++ b/core/jni/android_os_SystemClock.cpp @@ -43,16 +43,77 @@ namespace android { +static int setCurrentTimeMillisAlarmDriver(struct timeval *tv) +{ + struct timespec ts; + int fd; + int res; + + fd = open("/dev/alarm", O_RDWR); + if(fd < 0) { + ALOGV("Unable to open alarm driver: %s\n", strerror(errno)); + return -1; + } + ts.tv_sec = tv->tv_sec; + ts.tv_nsec = tv->tv_usec * 1000; + res = ioctl(fd, ANDROID_ALARM_SET_RTC, &ts); + if (res < 0) + ALOGV("ANDROID_ALARM_SET_RTC ioctl failed: %s\n", strerror(errno)); + close(fd); + return res; +} + +static int setCurrentTimeMillisRtc(struct timeval *tv) +{ + struct rtc_time rtc; + struct tm tm, *gmtime_res; + int fd; + int res; + + fd = open("/dev/rtc0", O_RDWR); + if (fd < 0) { + ALOGV("Unable to open RTC driver: %s\n", strerror(errno)); + return -1; + } + + res = settimeofday(tv, NULL); + if (res < 0) { + ALOGV("settimeofday() failed: %s\n", strerror(errno)); + goto done; + } + + gmtime_res = gmtime_r(&tv->tv_sec, &tm); + if (!gmtime_res) { + ALOGV("gmtime_r() failed: %s\n", strerror(errno)); + res = -1; + goto done; + } + + memset(&rtc, 0, sizeof(rtc)); + rtc.tm_sec = tm.tm_sec; + rtc.tm_min = tm.tm_min; + rtc.tm_hour = tm.tm_hour; + rtc.tm_mday = tm.tm_mday; + rtc.tm_mon = tm.tm_mon; + rtc.tm_year = tm.tm_year; + rtc.tm_wday = tm.tm_wday; + rtc.tm_yday = tm.tm_yday; + rtc.tm_isdst = tm.tm_isdst; + res = ioctl(fd, RTC_SET_TIME, &rtc); + if (res < 0) + ALOGV("RTC_SET_TIME ioctl failed: %s\n", strerror(errno)); +done: + close(fd); + return res; +} + /* * Set the current time. This only works when running as root. */ static int setCurrentTimeMillis(int64_t millis) { struct timeval tv; - struct timespec ts; - int fd; - int res; - int ret = 0; + int ret; if (millis <= 0 || millis / 1000LL >= INT_MAX) { return -1; @@ -63,19 +124,14 @@ static int setCurrentTimeMillis(int64_t millis) ALOGD("Setting time of day to sec=%d\n", (int) tv.tv_sec); - fd = open("/dev/alarm", O_RDWR); - if(fd < 0) { - ALOGW("Unable to open alarm driver: %s\n", strerror(errno)); - return -1; - } - ts.tv_sec = tv.tv_sec; - ts.tv_nsec = tv.tv_usec * 1000; - res = ioctl(fd, ANDROID_ALARM_SET_RTC, &ts); - if(res < 0) { + ret = setCurrentTimeMillisAlarmDriver(&tv); + if (ret < 0) + ret = setCurrentTimeMillisRtc(&tv); + + if(ret < 0) { ALOGW("Unable to set rtc to %ld: %s\n", tv.tv_sec, strerror(errno)); ret = -1; } - close(fd); return ret; } diff --git a/include/androidfw/ResourceTypes.h b/include/androidfw/ResourceTypes.h index 97afa59bd7cd..5151b06aec5b 100644 --- a/include/androidfw/ResourceTypes.h +++ b/include/androidfw/ResourceTypes.h @@ -1020,7 +1020,7 @@ struct ResTable_config // attrs_manifest.xml. enum { CONFIG_MCC = ACONFIGURATION_MCC, - CONFIG_MNC = ACONFIGURATION_MCC, + CONFIG_MNC = ACONFIGURATION_MNC, CONFIG_LOCALE = ACONFIGURATION_LOCALE, CONFIG_TOUCHSCREEN = ACONFIGURATION_TOUCHSCREEN, CONFIG_KEYBOARD = ACONFIGURATION_KEYBOARD, diff --git a/media/java/android/media/MediaDrm.java b/media/java/android/media/MediaDrm.java index 6b278d490ba2..f5a703b72317 100644 --- a/media/java/android/media/MediaDrm.java +++ b/media/java/android/media/MediaDrm.java @@ -100,7 +100,7 @@ public final class MediaDrm { private EventHandler mEventHandler; private OnEventListener mOnEventListener; - private int mNativeContext; + private long mNativeContext; /** * Query if the given scheme identified by its UUID is supported on diff --git a/media/java/android/media/MediaMuxer.java b/media/java/android/media/MediaMuxer.java index 65a9308b70f5..e5c97e7035c4 100644 --- a/media/java/android/media/MediaMuxer.java +++ b/media/java/android/media/MediaMuxer.java @@ -65,8 +65,6 @@ import java.util.Map; final public class MediaMuxer { - private int mNativeContext; - static { System.loadLibrary("media_jni"); } @@ -84,16 +82,16 @@ final public class MediaMuxer { }; // All the native functions are listed here. - private static native int nativeSetup(FileDescriptor fd, int format); - private static native void nativeRelease(int nativeObject); - private static native void nativeStart(int nativeObject); - private static native void nativeStop(int nativeObject); - private static native int nativeAddTrack(int nativeObject, String[] keys, + private static native long nativeSetup(FileDescriptor fd, int format); + private static native void nativeRelease(long nativeObject); + private static native void nativeStart(long nativeObject); + private static native void nativeStop(long nativeObject); + private static native int nativeAddTrack(long nativeObject, String[] keys, Object[] values); - private static native void nativeSetOrientationHint(int nativeObject, + private static native void nativeSetOrientationHint(long nativeObject, int degrees); - private static native void nativeSetLocation(int nativeObject, int latitude, int longitude); - private static native void nativeWriteSampleData(int nativeObject, + private static native void nativeSetLocation(long nativeObject, int latitude, int longitude); + private static native void nativeWriteSampleData(long nativeObject, int trackIndex, ByteBuffer byteBuf, int offset, int size, long presentationTimeUs, int flags); @@ -108,7 +106,7 @@ final public class MediaMuxer { private final CloseGuard mCloseGuard = CloseGuard.get(); private int mLastTrackIndex = -1; - private int mNativeObject; + private long mNativeObject; /** * Constructor. diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index 525dc4f9f3ba..d17e8f8ba6bc 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -16,8 +16,6 @@ package android.media; -import com.android.internal.util.Objects; - import android.Manifest; import android.app.ActivityThread; import android.content.BroadcastReceiver; @@ -43,6 +41,7 @@ import android.view.Display; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Objects; import java.util.concurrent.CopyOnWriteArrayList; /** @@ -496,11 +495,11 @@ public class MediaRouter { boolean volumeChanged = false; boolean presentationDisplayChanged = false; - if (!Objects.equal(route.mName, globalRoute.name)) { + if (!Objects.equals(route.mName, globalRoute.name)) { route.mName = globalRoute.name; changed = true; } - if (!Objects.equal(route.mDescription, globalRoute.description)) { + if (!Objects.equals(route.mDescription, globalRoute.description)) { route.mDescription = globalRoute.description; changed = true; } diff --git a/media/jni/android_media_MediaDrm.cpp b/media/jni/android_media_MediaDrm.cpp index bbb74d25bed1..6d90ccb213b0 100644 --- a/media/jni/android_media_MediaDrm.cpp +++ b/media/jni/android_media_MediaDrm.cpp @@ -267,7 +267,7 @@ static bool throwExceptionAsNecessary( } static sp<IDrm> GetDrm(JNIEnv *env, jobject thiz) { - JDrm *jdrm = (JDrm *)env->GetIntField(thiz, gFields.context); + JDrm *jdrm = (JDrm *)env->GetLongField(thiz, gFields.context); return jdrm ? jdrm->getDrm() : NULL; } @@ -484,7 +484,7 @@ using namespace android; static sp<JDrm> setDrm( JNIEnv *env, jobject thiz, const sp<JDrm> &drm) { - sp<JDrm> old = (JDrm *)env->GetIntField(thiz, gFields.context); + sp<JDrm> old = (JDrm *)env->GetLongField(thiz, gFields.context); if (drm != NULL) { drm->incStrong(thiz); } @@ -520,7 +520,7 @@ static void android_media_MediaDrm_release(JNIEnv *env, jobject thiz) { static void android_media_MediaDrm_native_init(JNIEnv *env) { jclass clazz; FIND_CLASS(clazz, "android/media/MediaDrm"); - GET_FIELD_ID(gFields.context, clazz, "mNativeContext", "I"); + GET_FIELD_ID(gFields.context, clazz, "mNativeContext", "J"); GET_STATIC_METHOD_ID(gFields.post_event, clazz, "postEventFromNative", "(Ljava/lang/Object;IILjava/lang/Object;)V"); diff --git a/media/jni/android_media_MediaMuxer.cpp b/media/jni/android_media_MediaMuxer.cpp index 457b956e3745..2c16a050f6b3 100644 --- a/media/jni/android_media_MediaMuxer.cpp +++ b/media/jni/android_media_MediaMuxer.cpp @@ -31,7 +31,6 @@ namespace android { struct fields_t { - jfieldID context; jmethodID arrayID; }; @@ -42,7 +41,7 @@ static fields_t gFields; using namespace android; static jint android_media_MediaMuxer_addTrack( - JNIEnv *env, jclass clazz, jint nativeObject, jobjectArray keys, + JNIEnv *env, jclass clazz, jlong nativeObject, jobjectArray keys, jobjectArray values) { sp<MediaMuxer> muxer(reinterpret_cast<MediaMuxer *>(nativeObject)); if (muxer == NULL) { @@ -72,7 +71,7 @@ static jint android_media_MediaMuxer_addTrack( } static void android_media_MediaMuxer_writeSampleData( - JNIEnv *env, jclass clazz, jint nativeObject, jint trackIndex, + JNIEnv *env, jclass clazz, jlong nativeObject, jint trackIndex, jobject byteBuf, jint offset, jint size, jlong timeUs, jint flags) { sp<MediaMuxer> muxer(reinterpret_cast<MediaMuxer *>(nativeObject)); if (muxer == NULL) { @@ -147,7 +146,7 @@ static jint android_media_MediaMuxer_native_setup( } static void android_media_MediaMuxer_setOrientationHint( - JNIEnv *env, jclass clazz, jint nativeObject, jint degrees) { + JNIEnv *env, jclass clazz, jlong nativeObject, jint degrees) { sp<MediaMuxer> muxer(reinterpret_cast<MediaMuxer *>(nativeObject)); if (muxer == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -177,7 +176,7 @@ static void android_media_MediaMuxer_setLocation( } static void android_media_MediaMuxer_start(JNIEnv *env, jclass clazz, - jint nativeObject) { + jlong nativeObject) { sp<MediaMuxer> muxer(reinterpret_cast<MediaMuxer *>(nativeObject)); if (muxer == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -195,7 +194,7 @@ static void android_media_MediaMuxer_start(JNIEnv *env, jclass clazz, } static void android_media_MediaMuxer_stop(JNIEnv *env, jclass clazz, - jint nativeObject) { + jlong nativeObject) { sp<MediaMuxer> muxer(reinterpret_cast<MediaMuxer *>(nativeObject)); if (muxer == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -213,7 +212,7 @@ static void android_media_MediaMuxer_stop(JNIEnv *env, jclass clazz, } static void android_media_MediaMuxer_native_release( - JNIEnv *env, jclass clazz, jint nativeObject) { + JNIEnv *env, jclass clazz, jlong nativeObject) { sp<MediaMuxer> muxer(reinterpret_cast<MediaMuxer *>(nativeObject)); if (muxer != NULL) { muxer->decStrong(clazz); @@ -222,26 +221,26 @@ static void android_media_MediaMuxer_native_release( static JNINativeMethod gMethods[] = { - { "nativeAddTrack", "(I[Ljava/lang/String;[Ljava/lang/Object;)I", + { "nativeAddTrack", "(J[Ljava/lang/String;[Ljava/lang/Object;)I", (void *)android_media_MediaMuxer_addTrack }, - { "nativeSetOrientationHint", "(II)V", + { "nativeSetOrientationHint", "(JI)V", (void *)android_media_MediaMuxer_setOrientationHint}, - { "nativeSetLocation", "(III)V", + { "nativeSetLocation", "(JII)V", (void *)android_media_MediaMuxer_setLocation}, - { "nativeStart", "(I)V", (void *)android_media_MediaMuxer_start}, + { "nativeStart", "(J)V", (void *)android_media_MediaMuxer_start}, - { "nativeWriteSampleData", "(IILjava/nio/ByteBuffer;IIJI)V", + { "nativeWriteSampleData", "(JILjava/nio/ByteBuffer;IIJI)V", (void *)android_media_MediaMuxer_writeSampleData }, - { "nativeStop", "(I)V", (void *)android_media_MediaMuxer_stop}, + { "nativeStop", "(J)V", (void *)android_media_MediaMuxer_stop}, - { "nativeSetup", "(Ljava/io/FileDescriptor;I)I", + { "nativeSetup", "(Ljava/io/FileDescriptor;I)J", (void *)android_media_MediaMuxer_native_setup }, - { "nativeRelease", "(I)V", + { "nativeRelease", "(J)V", (void *)android_media_MediaMuxer_native_release }, }; @@ -252,12 +251,6 @@ int register_android_media_MediaMuxer(JNIEnv *env) { int err = AndroidRuntime::registerNativeMethods(env, "android/media/MediaMuxer", gMethods, NELEM(gMethods)); - jclass clazz = env->FindClass("android/media/MediaMuxer"); - CHECK(clazz != NULL); - - gFields.context = env->GetFieldID(clazz, "mNativeContext", "I"); - CHECK(gFields.context != NULL); - jclass byteBufClass = env->FindClass("java/nio/ByteBuffer"); CHECK(byteBufClass != NULL); diff --git a/media/lib/java/com/android/media/remotedisplay/RemoteDisplay.java b/media/lib/java/com/android/media/remotedisplay/RemoteDisplay.java index 5e15702355f6..6cfc0e856b73 100644 --- a/media/lib/java/com/android/media/remotedisplay/RemoteDisplay.java +++ b/media/lib/java/com/android/media/remotedisplay/RemoteDisplay.java @@ -16,12 +16,12 @@ package com.android.media.remotedisplay; -import com.android.internal.util.Objects; - import android.media.MediaRouter; import android.media.RemoteDisplayState.RemoteDisplayInfo; import android.text.TextUtils; +import java.util.Objects; + /** * Represents a remote display that has been discovered. */ @@ -87,7 +87,7 @@ public class RemoteDisplay { } public void setName(String name) { - if (!Objects.equal(mMutableInfo.name, name)) { + if (!Objects.equals(mMutableInfo.name, name)) { mMutableInfo.name = name; mImmutableInfo = null; } @@ -98,7 +98,7 @@ public class RemoteDisplay { } public void setDescription(String description) { - if (!Objects.equal(mMutableInfo.description, description)) { + if (!Objects.equals(mMutableInfo.description, description)) { mMutableInfo.description = description; mImmutableInfo = null; } diff --git a/opengl/java/android/opengl/EGLLogWrapper.java b/opengl/java/android/opengl/EGLLogWrapper.java index 36e88a2b8f0b..c6779575504a 100644 --- a/opengl/java/android/opengl/EGLLogWrapper.java +++ b/opengl/java/android/opengl/EGLLogWrapper.java @@ -326,7 +326,7 @@ class EGLLogWrapper implements EGL11 { } public boolean eglSwapBuffers(EGLDisplay display, EGLSurface surface) { - begin("eglInitialize"); + begin("eglSwapBuffers"); arg("display", display); arg("surface", surface); end(); diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java index f6b43c744934..f1dca1d618a6 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java @@ -40,7 +40,6 @@ import com.android.documentsui.DocumentsActivity.State; import com.android.documentsui.model.RootInfo; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.Objects; import com.google.android.collect.Lists; import com.google.android.collect.Sets; import com.google.common.collect.ArrayListMultimap; @@ -51,6 +50,7 @@ import libcore.io.IoUtils; import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -295,7 +295,7 @@ public class RootsCache { private RootInfo getRootLocked(String authority, String rootId) { for (RootInfo root : mRoots.get(authority)) { - if (Objects.equal(root.rootId, rootId)) { + if (Objects.equals(root.rootId, rootId)) { return root; } } @@ -308,7 +308,7 @@ public class RootsCache { synchronized (mLock) { final int rootIcon = root.derivedIcon != 0 ? root.derivedIcon : root.icon; for (RootInfo test : mRoots.get(root.authority)) { - if (Objects.equal(test.rootId, root.rootId)) { + if (Objects.equals(test.rootId, root.rootId)) { continue; } final int testIcon = test.derivedIcon != 0 ? test.derivedIcon : test.icon; diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java index 931dac9f31b8..923c79c06a14 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java @@ -46,13 +46,13 @@ import android.widget.TextView; import com.android.documentsui.DocumentsActivity.State; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.RootInfo; -import com.android.internal.util.Objects; import com.google.common.collect.Lists; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Objects; /** * Display list of known storage backend roots. @@ -157,7 +157,7 @@ public class RootsFragment extends Fragment { final Object item = mAdapter.getItem(i); if (item instanceof RootItem) { final RootInfo testRoot = ((RootItem) item).root; - if (Objects.equal(testRoot, root)) { + if (Objects.equals(testRoot, root)) { mList.setItemChecked(i, true); return; } diff --git a/preloaded-classes b/preloaded-classes index 98b9e73abe3a..342126d56b41 100644 --- a/preloaded-classes +++ b/preloaded-classes @@ -1428,7 +1428,6 @@ com.android.internal.util.AsyncChannel com.android.internal.util.AsyncChannel$DeathMonitor com.android.internal.util.FastXmlSerializer com.android.internal.util.MemInfoReader -com.android.internal.util.Objects com.android.internal.util.Preconditions com.android.internal.util.XmlUtils com.android.internal.view.ActionBarPolicy diff --git a/services/java/com/android/server/AlarmManagerService.java b/services/java/com/android/server/AlarmManagerService.java index 5ae9a6df01ad..2e1b0af7b099 100644 --- a/services/java/com/android/server/AlarmManagerService.java +++ b/services/java/com/android/server/AlarmManagerService.java @@ -99,7 +99,7 @@ class AlarmManagerService extends IAlarmManager.Stub { private Object mLock = new Object(); - private int mDescriptor; + private long mNativeData; private long mNextWakeup; private long mNextNonWakeup; private int mBroadcastRefCount = 0; @@ -464,7 +464,7 @@ class AlarmManagerService extends IAlarmManager.Stub { public AlarmManagerService(Context context) { mContext = context; - mDescriptor = init(); + mNativeData = init(); mNextWakeup = mNextNonWakeup = 0; // We have to set current TimeZone info to kernel @@ -493,7 +493,7 @@ class AlarmManagerService extends IAlarmManager.Stub { mClockReceiver.scheduleDateChangedEvent(); mUninstallReceiver = new UninstallReceiver(); - if (mDescriptor != -1) { + if (mNativeData != 0) { mWaitThread.start(); } else { Slog.w(TAG, "Failed to open alarm driver. Falling back to a handler."); @@ -502,7 +502,7 @@ class AlarmManagerService extends IAlarmManager.Stub { protected void finalize() throws Throwable { try { - close(mDescriptor); + close(mNativeData); } finally { super.finalize(); } @@ -702,7 +702,7 @@ class AlarmManagerService extends IAlarmManager.Stub { // Update the kernel timezone information // Kernel tracks time offsets as 'minutes west of GMT' int gmtOffset = zone.getOffset(System.currentTimeMillis()); - setKernelTimezone(mDescriptor, -(gmtOffset / 60000)); + setKernelTimezone(mNativeData, -(gmtOffset / 60000)); } TimeZone.setDefault(null); @@ -796,7 +796,7 @@ class AlarmManagerService extends IAlarmManager.Stub { private void setLocked(int type, long when) { - if (mDescriptor != -1) + if (mNativeData != 0) { // The kernel never triggers alarms with negative wakeup times // so we ensure they are positive. @@ -809,7 +809,7 @@ class AlarmManagerService extends IAlarmManager.Stub { alarmNanoseconds = (when % 1000) * 1000 * 1000; } - set(mDescriptor, type, alarmSeconds, alarmNanoseconds); + set(mNativeData, type, alarmSeconds, alarmNanoseconds); } else { @@ -1014,11 +1014,11 @@ class AlarmManagerService extends IAlarmManager.Stub { } } - private native int init(); - private native void close(int fd); - private native void set(int fd, int type, long seconds, long nanoseconds); - private native int waitForAlarm(int fd); - private native int setKernelTimezone(int fd, int minuteswest); + private native long init(); + private native void close(long nativeData); + private native void set(long nativeData, int type, long seconds, long nanoseconds); + private native int waitForAlarm(long nativeData); + private native int setKernelTimezone(long nativeData, int minuteswest); private void triggerAlarmsLocked(ArrayList<Alarm> triggerList, long nowELAPSED, long nowRTC) { // batches are temporally sorted, so we need only pull from the @@ -1158,7 +1158,7 @@ class AlarmManagerService extends IAlarmManager.Stub { while (true) { - int result = waitForAlarm(mDescriptor); + int result = waitForAlarm(mNativeData); triggerList.clear(); @@ -1340,7 +1340,7 @@ class AlarmManagerService extends IAlarmManager.Stub { // daylight savings information. TimeZone zone = TimeZone.getTimeZone(SystemProperties.get(TIMEZONE_PROPERTY)); int gmtOffset = zone.getOffset(System.currentTimeMillis()); - setKernelTimezone(mDescriptor, -(gmtOffset / 60000)); + setKernelTimezone(mNativeData, -(gmtOffset / 60000)); scheduleDateChangedEvent(); } } diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index 0e1526115eb6..47593f27a77f 100644 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -37,7 +37,6 @@ import static com.android.server.am.ActivityStackSupervisor.DEBUG_STATES; import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID; import com.android.internal.os.BatteryStatsImpl; -import com.android.internal.util.Objects; import com.android.server.Watchdog; import com.android.server.am.ActivityManagerService.ItemMatcher; import com.android.server.wm.AppTransition; @@ -82,6 +81,7 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Objects; /** * State and management of a single stack of activities. @@ -2359,7 +2359,7 @@ final class ActivityStack { ArrayList<ActivityRecord> activities = r.task.mActivities; for (int index = activities.indexOf(r); index >= 0; --index) { ActivityRecord cur = activities.get(index); - if (!Objects.equal(cur.taskAffinity, r.taskAffinity)) { + if (!Objects.equals(cur.taskAffinity, r.taskAffinity)) { break; } finishActivityLocked(cur, Activity.RESULT_CANCELED, null, "request-affinity", true); @@ -3160,9 +3160,7 @@ final class ActivityStack { final TaskRecord task = mResumedActivity != null ? mResumedActivity.task : null; if (task == tr && task.mOnTopOfHome || numTasks <= 1) { - if (task != null) { - task.mOnTopOfHome = false; - } + tr.mOnTopOfHome = false; return mStackSupervisor.resumeHomeActivity(null); } diff --git a/services/java/com/android/server/media/MediaRouterService.java b/services/java/com/android/server/media/MediaRouterService.java index a31695b885b2..f91ea8c03a39 100644 --- a/services/java/com/android/server/media/MediaRouterService.java +++ b/services/java/com/android/server/media/MediaRouterService.java @@ -16,7 +16,6 @@ package com.android.server.media; -import com.android.internal.util.Objects; import com.android.server.Watchdog; import android.Manifest; @@ -52,6 +51,7 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; /** * Provides a mechanism for discovering media routes and manages media playback @@ -384,7 +384,7 @@ public final class MediaRouterService extends IMediaRouterService.Stub ClientRecord clientRecord = mAllClientRecords.get(client.asBinder()); if (clientRecord != null) { final String oldRouteId = clientRecord.mSelectedRouteId; - if (!Objects.equal(routeId, oldRouteId)) { + if (!Objects.equals(routeId, oldRouteId)) { if (DEBUG) { Slog.d(TAG, clientRecord + ": Set selected route, routeId=" + routeId + ", oldRouteId=" + oldRouteId @@ -1257,12 +1257,12 @@ public final class MediaRouterService extends IMediaRouterService.Stub mDescriptor = descriptor; if (descriptor != null) { final String name = computeName(descriptor); - if (!Objects.equal(mMutableInfo.name, name)) { + if (!Objects.equals(mMutableInfo.name, name)) { mMutableInfo.name = name; changed = true; } final String description = computeDescription(descriptor); - if (!Objects.equal(mMutableInfo.description, description)) { + if (!Objects.equals(mMutableInfo.description, description)) { mMutableInfo.description = description; changed = true; } diff --git a/services/java/com/android/server/media/RemoteDisplayProviderProxy.java b/services/java/com/android/server/media/RemoteDisplayProviderProxy.java index b248ee0759d8..a5fe9f2ceb39 100644 --- a/services/java/com/android/server/media/RemoteDisplayProviderProxy.java +++ b/services/java/com/android/server/media/RemoteDisplayProviderProxy.java @@ -16,8 +16,6 @@ package com.android.server.media; -import com.android.internal.util.Objects; - import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -35,6 +33,7 @@ import android.util.Slog; import java.io.PrintWriter; import java.lang.ref.WeakReference; +import java.util.Objects; /** * Maintains a connection to a particular remote display provider service. @@ -101,7 +100,7 @@ final class RemoteDisplayProviderProxy implements ServiceConnection { } public void setSelectedDisplay(String id) { - if (!Objects.equal(mSelectedDisplayId, id)) { + if (!Objects.equals(mSelectedDisplayId, id)) { if (mConnectionReady && mSelectedDisplayId != null) { mActiveConnection.disconnect(mSelectedDisplayId); } @@ -293,7 +292,7 @@ final class RemoteDisplayProviderProxy implements ServiceConnection { } private void setDisplayState(RemoteDisplayState state) { - if (!Objects.equal(mDisplayState, state)) { + if (!Objects.equals(mDisplayState, state)) { mDisplayState = state; if (!mScheduledDisplayStateChangedCallback) { mScheduledDisplayStateChangedCallback = true; diff --git a/services/java/com/android/server/net/NetworkPolicyManagerService.java b/services/java/com/android/server/net/NetworkPolicyManagerService.java index d568b11c70a1..eb7cc4c89e4d 100644 --- a/services/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/java/com/android/server/net/NetworkPolicyManagerService.java @@ -133,7 +133,6 @@ import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.IndentingPrintWriter; -import com.android.internal.util.Objects; import com.google.android.collect.Lists; import com.google.android.collect.Maps; import com.google.android.collect.Sets; @@ -155,6 +154,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import libcore.io.IoUtils; @@ -688,7 +688,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // mobile templates are relevant when SIM is ready and // subscriberId matches. if (tele.getSimState() == SIM_STATE_READY) { - return Objects.equal(tele.getSubscriberId(), template.getSubscriberId()); + return Objects.equals(tele.getSubscriberId(), template.getSubscriberId()); } else { return false; } @@ -946,7 +946,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // TODO: offer more granular control over radio states once // 4965893 is available. if (tele.getSimState() == SIM_STATE_READY - && Objects.equal(tele.getSubscriberId(), template.getSubscriberId())) { + && Objects.equals(tele.getSubscriberId(), template.getSubscriberId())) { setPolicyDataEnable(TYPE_MOBILE, enabled); setPolicyDataEnable(TYPE_WIMAX, enabled); } diff --git a/services/java/com/android/server/net/NetworkStatsCollection.java b/services/java/com/android/server/net/NetworkStatsCollection.java index 3169035786ec..475482f6dd0b 100644 --- a/services/java/com/android/server/net/NetworkStatsCollection.java +++ b/services/java/com/android/server/net/NetworkStatsCollection.java @@ -34,7 +34,6 @@ import android.util.AtomicFile; import com.android.internal.util.ArrayUtils; import com.android.internal.util.FileRotator; import com.android.internal.util.IndentingPrintWriter; -import com.android.internal.util.Objects; import com.google.android.collect.Lists; import com.google.android.collect.Maps; @@ -50,6 +49,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import libcore.io.IoUtils; @@ -508,7 +508,7 @@ public class NetworkStatsCollection implements FileRotator.Reader { this.uid = uid; this.set = set; this.tag = tag; - hashCode = Objects.hashCode(ident, uid, set, tag); + hashCode = Objects.hash(ident, uid, set, tag); } @Override @@ -521,7 +521,7 @@ public class NetworkStatsCollection implements FileRotator.Reader { if (obj instanceof Key) { final Key key = (Key) obj; return uid == key.uid && set == key.set && tag == key.tag - && Objects.equal(ident, key.ident); + && Objects.equals(ident, key.ident); } return false; } diff --git a/services/jni/com_android_server_AlarmManagerService.cpp b/services/jni/com_android_server_AlarmManagerService.cpp index c2f6151884b3..342515bb3bb0 100644 --- a/services/jni/com_android_server_AlarmManagerService.cpp +++ b/services/jni/com_android_server_AlarmManagerService.cpp @@ -25,6 +25,8 @@ #include <fcntl.h> #include <stdio.h> #include <string.h> +#include <sys/epoll.h> +#include <sys/timerfd.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> @@ -37,7 +39,136 @@ namespace android { -static jint android_server_AlarmManagerService_setKernelTimezone(JNIEnv* env, jobject obj, jint fd, jint minswest) +static const size_t N_ANDROID_TIMERFDS = ANDROID_ALARM_TYPE_COUNT + 1; +static const clockid_t android_alarm_to_clockid[N_ANDROID_TIMERFDS] = { + CLOCK_REALTIME_ALARM, + CLOCK_REALTIME, + CLOCK_BOOTTIME_ALARM, + CLOCK_BOOTTIME, + CLOCK_MONOTONIC, + CLOCK_REALTIME, +}; +/* to match the legacy alarm driver implementation, we need an extra + CLOCK_REALTIME fd which exists specifically to be canceled on RTC changes */ + +class AlarmImpl +{ +public: + AlarmImpl(int *fds, size_t n_fds); + virtual ~AlarmImpl(); + + virtual int set(int type, struct timespec *ts) = 0; + virtual int waitForAlarm() = 0; + +protected: + int *fds; + size_t n_fds; +}; + +class AlarmImplAlarmDriver : public AlarmImpl +{ +public: + AlarmImplAlarmDriver(int fd) : AlarmImpl(&fd, 1) { } + + int set(int type, struct timespec *ts); + int waitForAlarm(); +}; + +class AlarmImplTimerFd : public AlarmImpl +{ +public: + AlarmImplTimerFd(int fds[N_ANDROID_TIMERFDS], int epollfd) : + AlarmImpl(fds, N_ANDROID_TIMERFDS), epollfd(epollfd) { } + ~AlarmImplTimerFd(); + + int set(int type, struct timespec *ts); + int waitForAlarm(); + +private: + int epollfd; +}; + +AlarmImpl::AlarmImpl(int *fds_, size_t n_fds) : fds(new int[n_fds]), + n_fds(n_fds) +{ + memcpy(fds, fds_, n_fds * sizeof(fds[0])); +} + +AlarmImpl::~AlarmImpl() +{ + for (size_t i = 0; i < n_fds; i++) { + close(fds[i]); + } + delete [] fds; +} + +int AlarmImplAlarmDriver::set(int type, struct timespec *ts) +{ + return ioctl(fds[0], ANDROID_ALARM_SET(type), ts); +} + +int AlarmImplAlarmDriver::waitForAlarm() +{ + return ioctl(fds[0], ANDROID_ALARM_WAIT); +} + +AlarmImplTimerFd::~AlarmImplTimerFd() +{ + for (size_t i = 0; i < N_ANDROID_TIMERFDS; i++) { + epoll_ctl(epollfd, EPOLL_CTL_DEL, fds[i], NULL); + } + close(epollfd); +} + +int AlarmImplTimerFd::set(int type, struct timespec *ts) +{ + if (type > ANDROID_ALARM_TYPE_COUNT) { + errno = EINVAL; + return -1; + } + + if (!ts->tv_nsec && !ts->tv_sec) { + ts->tv_nsec = 1; + } + /* timerfd interprets 0 = disarm, so replace with a practically + equivalent deadline of 1 ns */ + + struct itimerspec spec; + memset(&spec, 0, sizeof(spec)); + memcpy(&spec.it_value, ts, sizeof(spec.it_value)); + + return timerfd_settime(fds[type], TFD_TIMER_ABSTIME, &spec, NULL); +} + +int AlarmImplTimerFd::waitForAlarm() +{ + epoll_event events[N_ANDROID_TIMERFDS]; + + int nevents = epoll_wait(epollfd, events, N_ANDROID_TIMERFDS, -1); + if (nevents < 0) { + return nevents; + } + + int result = 0; + for (int i = 0; i < nevents; i++) { + uint32_t alarm_idx = events[i].data.u32; + uint64_t unused; + ssize_t err = read(fds[alarm_idx], &unused, sizeof(unused)); + if (err < 0) { + if (alarm_idx == ANDROID_ALARM_TYPE_COUNT && errno == ECANCELED) { + result |= ANDROID_ALARM_TIME_CHANGE_MASK; + } else { + return err; + } + } else { + result |= (1 << alarm_idx); + } + } + + return result; +} + +static jint android_server_AlarmManagerService_setKernelTimezone(JNIEnv*, jobject, jlong, jint minswest) { struct timezone tz; @@ -55,40 +186,116 @@ static jint android_server_AlarmManagerService_setKernelTimezone(JNIEnv* env, jo return 0; } -static jint android_server_AlarmManagerService_init(JNIEnv* env, jobject obj) +static jlong init_alarm_driver() +{ + int fd = open("/dev/alarm", O_RDWR); + if (fd < 0) { + ALOGV("opening alarm driver failed: %s", strerror(errno)); + return 0; + } + + AlarmImpl *ret = new AlarmImplAlarmDriver(fd); + return reinterpret_cast<jlong>(ret); +} + +static jlong init_timerfd() { - return open("/dev/alarm", O_RDWR); + int epollfd; + int fds[N_ANDROID_TIMERFDS]; + + epollfd = epoll_create(N_ANDROID_TIMERFDS); + if (epollfd < 0) { + ALOGV("epoll_create(%u) failed: %s", N_ANDROID_TIMERFDS, + strerror(errno)); + return 0; + } + + for (size_t i = 0; i < N_ANDROID_TIMERFDS; i++) { + fds[i] = timerfd_create(android_alarm_to_clockid[i], 0); + if (fds[i] < 0) { + ALOGV("timerfd_create(%u) failed: %s", android_alarm_to_clockid[i], + strerror(errno)); + close(epollfd); + for (size_t j = 0; j < i; j++) { + close(fds[j]); + } + return 0; + } + } + + AlarmImpl *ret = new AlarmImplTimerFd(fds, epollfd); + + for (size_t i = 0; i < N_ANDROID_TIMERFDS; i++) { + epoll_event event; + event.events = EPOLLIN | EPOLLWAKEUP; + event.data.u32 = i; + + int err = epoll_ctl(epollfd, EPOLL_CTL_ADD, fds[i], &event); + if (err < 0) { + ALOGV("epoll_ctl(EPOLL_CTL_ADD) failed: %s", strerror(errno)); + delete ret; + return 0; + } + } + + struct itimerspec spec; + memset(&spec, 0, sizeof(spec)); + /* 0 = disarmed; the timerfd doesn't need to be armed to get + RTC change notifications, just set up as cancelable */ + + int err = timerfd_settime(fds[ANDROID_ALARM_TYPE_COUNT], + TFD_TIMER_ABSTIME | TFD_TIMER_CANCEL_ON_SET, &spec, NULL); + if (err < 0) { + ALOGV("timerfd_settime() failed: %s", strerror(errno)); + delete ret; + return 0; + } + + return reinterpret_cast<jlong>(ret); +} + +static jlong android_server_AlarmManagerService_init(JNIEnv*, jobject) +{ + jlong ret = init_alarm_driver(); + if (ret) { + return ret; + } + + return init_timerfd(); } -static void android_server_AlarmManagerService_close(JNIEnv* env, jobject obj, jint fd) +static void android_server_AlarmManagerService_close(JNIEnv*, jobject, jlong nativeData) { - close(fd); + AlarmImpl *impl = reinterpret_cast<AlarmImpl *>(nativeData); + delete impl; } -static void android_server_AlarmManagerService_set(JNIEnv* env, jobject obj, jint fd, jint type, jlong seconds, jlong nanoseconds) +static void android_server_AlarmManagerService_set(JNIEnv*, jobject, jlong nativeData, jint type, jlong seconds, jlong nanoseconds) { + AlarmImpl *impl = reinterpret_cast<AlarmImpl *>(nativeData); struct timespec ts; ts.tv_sec = seconds; ts.tv_nsec = nanoseconds; - int result = ioctl(fd, ANDROID_ALARM_SET(type), &ts); - if (result < 0) - { + int result = impl->set(type, &ts); + if (result < 0) + { ALOGE("Unable to set alarm to %lld.%09lld: %s\n", seconds, nanoseconds, strerror(errno)); } } -static jint android_server_AlarmManagerService_waitForAlarm(JNIEnv* env, jobject obj, jint fd) +static jint android_server_AlarmManagerService_waitForAlarm(JNIEnv*, jobject, jlong nativeData) { - int result = 0; + AlarmImpl *impl = reinterpret_cast<AlarmImpl *>(nativeData); + int result = 0; - do - { - result = ioctl(fd, ANDROID_ALARM_WAIT); - } while (result < 0 && errno == EINTR); + do + { + result = impl->waitForAlarm(); + } while (result < 0 && errno == EINTR); - if (result < 0) - { + if (result < 0) + { ALOGE("Unable to wait on alarm: %s\n", strerror(errno)); return 0; } @@ -98,11 +305,11 @@ static jint android_server_AlarmManagerService_waitForAlarm(JNIEnv* env, jobject static JNINativeMethod sMethods[] = { /* name, signature, funcPtr */ - {"init", "()I", (void*)android_server_AlarmManagerService_init}, - {"close", "(I)V", (void*)android_server_AlarmManagerService_close}, - {"set", "(IIJJ)V", (void*)android_server_AlarmManagerService_set}, - {"waitForAlarm", "(I)I", (void*)android_server_AlarmManagerService_waitForAlarm}, - {"setKernelTimezone", "(II)I", (void*)android_server_AlarmManagerService_setKernelTimezone}, + {"init", "()J", (void*)android_server_AlarmManagerService_init}, + {"close", "(J)V", (void*)android_server_AlarmManagerService_close}, + {"set", "(JIJJ)V", (void*)android_server_AlarmManagerService_set}, + {"waitForAlarm", "(J)I", (void*)android_server_AlarmManagerService_waitForAlarm}, + {"setKernelTimezone", "(JI)I", (void*)android_server_AlarmManagerService_setKernelTimezone}, }; int register_android_server_AlarmManagerService(JNIEnv* env) diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp index f2e525481399..6ced8b3f915a 100644 --- a/tools/aapt/ResourceTable.cpp +++ b/tools/aapt/ResourceTable.cpp @@ -1342,7 +1342,7 @@ status_t compileResourceFile(Bundle* bundle, curType = string16; curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_STRING; curIsStyled = true; - curIsPseudolocalizable = true; + curIsPseudolocalizable = (translatable != false16); } else if (strcmp16(block.getElementName(&len), drawable16.string()) == 0) { curTag = &drawable16; curType = drawable16; @@ -1408,15 +1408,24 @@ status_t compileResourceFile(Bundle* bundle, // Check whether these strings need valid formats. // (simplified form of what string16 does above) size_t n = block.getAttributeCount(); + + // Pseudolocalizable by default, unless this string array isn't + // translatable. + curIsPseudolocalizable = true; for (size_t i = 0; i < n; i++) { size_t length; const uint16_t* attr = block.getAttributeName(i, &length); - if (strcmp16(attr, translatable16.string()) == 0 - || strcmp16(attr, formatted16.string()) == 0) { + if (strcmp16(attr, translatable16.string()) == 0) { + const uint16_t* value = block.getAttributeStringValue(i, &length); + if (strcmp16(value, false16.string()) == 0) { + curIsPseudolocalizable = false; + } + } + + if (strcmp16(attr, formatted16.string()) == 0) { const uint16_t* value = block.getAttributeStringValue(i, &length); if (strcmp16(value, false16.string()) == 0) { curIsFormatted = false; - break; } } } @@ -1426,7 +1435,6 @@ status_t compileResourceFile(Bundle* bundle, curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_STRING; curIsBag = true; curIsBagReplaceOnOverwrite = true; - curIsPseudolocalizable = true; } else if (strcmp16(block.getElementName(&len), integer_array16.string()) == 0) { curTag = &integer_array16; curType = array16; |