Merge "DO NOT MERGE - Fix improper declaration/use of pointer."
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index 5c265ab..1a2ab81 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 @@
(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 65c40c1..d849965 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -93,7 +93,6 @@
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.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 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 e6da288..4607902 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -58,7 +58,7 @@
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 @@
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 @@
// 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 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 @@
}
try {
- JarFile jarFile = new JarFile(mArchiveSourcePath);
+ StrictJarFile jarFile = new StrictJarFile(mArchiveSourcePath);
Certificate[] certs = null;
@@ -633,7 +631,7 @@
// 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 @@
}
}
} 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 @@
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 3c67bf9..36dd2fdfb 100644
--- a/core/java/android/net/NetworkIdentity.java
+++ b/core/java/android/net/NetworkIdentity.java
@@ -26,7 +26,7 @@
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 @@
@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 @@
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 441db7a..10c686b 100644
--- a/core/java/android/net/NetworkPolicy.java
+++ b/core/java/android/net/NetworkPolicy.java
@@ -21,7 +21,7 @@
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 @@
@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 @@
&& 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 9cb904d..a7aae2a 100644
--- a/core/java/android/net/NetworkStats.java
+++ b/core/java/android/net/NetworkStats.java
@@ -23,12 +23,12 @@
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 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 @@
}
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 c189ba4..27197cc 100644
--- a/core/java/android/net/NetworkTemplate.java
+++ b/core/java/android/net/NetworkTemplate.java
@@ -34,8 +34,9 @@
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 @@
@Override
public int hashCode() {
- return Objects.hashCode(mMatchRule, mSubscriberId, mNetworkId);
+ return Objects.hash(mMatchRule, mSubscriberId, mNetworkId);
}
@Override
@@ -184,8 +185,8 @@
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 @@
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 @@
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 041d9e0..35fb504 100644
--- a/core/java/android/view/DisplayAdjustments.java
+++ b/core/java/android/view/DisplayAdjustments.java
@@ -19,7 +19,7 @@
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 @@
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 2664182..0000000
--- 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 d20b800..5f4d570 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 @@
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 97afa59..5151b06 100644
--- a/include/androidfw/ResourceTypes.h
+++ b/include/androidfw/ResourceTypes.h
@@ -1020,7 +1020,7 @@
// 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 6b278d4..f5a703b 100644
--- a/media/java/android/media/MediaDrm.java
+++ b/media/java/android/media/MediaDrm.java
@@ -100,7 +100,7 @@
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 65a9308..e5c97e7 100644
--- a/media/java/android/media/MediaMuxer.java
+++ b/media/java/android/media/MediaMuxer.java
@@ -65,8 +65,6 @@
final public class MediaMuxer {
- private int mNativeContext;
-
static {
System.loadLibrary("media_jni");
}
@@ -84,16 +82,16 @@
};
// 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 @@
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 525dc4f..d17e8f8 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 java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import java.util.Objects;
import java.util.concurrent.CopyOnWriteArrayList;
/**
@@ -496,11 +495,11 @@
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 bbb74d2..6d90ccb 100644
--- a/media/jni/android_media_MediaDrm.cpp
+++ b/media/jni/android_media_MediaDrm.cpp
@@ -267,7 +267,7 @@
}
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 @@
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_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 457b956..2c16a05 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 @@
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 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 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_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_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_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 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 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 5e15702..6cfc0e8 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 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 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 36e88a2..c677957 100644
--- a/opengl/java/android/opengl/EGLLogWrapper.java
+++ b/opengl/java/android/opengl/EGLLogWrapper.java
@@ -326,7 +326,7 @@
}
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 f6b43c7..f1dca1d 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.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 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 @@
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 @@
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 931dac9..923c79c 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
@@ -46,13 +46,13 @@
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 @@
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 98b9e73a..342126d 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -1428,7 +1428,6 @@
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 5ae9a6d..2e1b0af 100644
--- a/services/java/com/android/server/AlarmManagerService.java
+++ b/services/java/com/android/server/AlarmManagerService.java
@@ -99,7 +99,7 @@
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 @@
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 @@
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 @@
protected void finalize() throws Throwable {
try {
- close(mDescriptor);
+ close(mNativeData);
} finally {
super.finalize();
}
@@ -702,7 +702,7 @@
// 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 @@
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 @@
alarmNanoseconds = (when % 1000) * 1000 * 1000;
}
- set(mDescriptor, type, alarmSeconds, alarmNanoseconds);
+ set(mNativeData, type, alarmSeconds, alarmNanoseconds);
}
else
{
@@ -1014,11 +1014,11 @@
}
}
- 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 @@
while (true)
{
- int result = waitForAlarm(mDescriptor);
+ int result = waitForAlarm(mNativeData);
triggerList.clear();
@@ -1340,7 +1340,7 @@
// 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 0e15261..47593f2 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.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.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 @@
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 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 a31695b..f91ea8c 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.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 @@
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 @@
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 b248ee0..a5fe9f2 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 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 @@
}
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 @@
}
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 d568b11..eb7cc4c 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.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.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import libcore.io.IoUtils;
@@ -688,7 +688,7 @@
// 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 @@
// 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 3169035..475482f 100644
--- a/services/java/com/android/server/net/NetworkStatsCollection.java
+++ b/services/java/com/android/server/net/NetworkStatsCollection.java
@@ -34,7 +34,6 @@
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.Collections;
import java.util.HashMap;
import java.util.Map;
+import java.util.Objects;
import libcore.io.IoUtils;
@@ -508,7 +508,7 @@
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 @@
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 c2f6151..342515b 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 @@
return 0;
}
-static jint android_server_AlarmManagerService_init(JNIEnv* env, jobject obj)
+static jlong init_alarm_driver()
{
- return open("/dev/alarm", O_RDWR);
+ 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 void android_server_AlarmManagerService_close(JNIEnv* env, jobject obj, jint fd)
+static jlong init_timerfd()
{
- close(fd);
+ 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 void android_server_AlarmManagerService_set(JNIEnv* env, jobject obj, jint fd, jint type, jlong seconds, jlong nanoseconds)
+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*, jobject, jlong nativeData)
+{
+ AlarmImpl *impl = reinterpret_cast<AlarmImpl *>(nativeData);
+ delete impl;
+}
+
+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 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 f2e5254..6ced8b3 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -1342,7 +1342,7 @@
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 @@
// 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 @@
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;