Merge "Avoid invalid shader creation for certain blend modes"
diff --git a/api/current.txt b/api/current.txt
index 7a348ea..e6d8546 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -4464,10 +4464,10 @@
method public void setInTouchMode(boolean);
method public void start();
method public android.app.Activity startActivitySync(android.content.Intent);
- method public void startAllocCounting();
+ method public deprecated void startAllocCounting();
method public void startPerformanceSnapshot();
method public void startProfiling();
- method public void stopAllocCounting();
+ method public deprecated void stopAllocCounting();
method public void stopProfiling();
method public void waitForIdle(java.lang.Runnable);
method public void waitForIdleSync();
@@ -5547,6 +5547,7 @@
method public int setStorageEncryption(android.content.ComponentName, boolean);
method public void setUninstallBlocked(android.content.ComponentName, java.lang.String, boolean);
method public boolean setUserEnabled(android.content.ComponentName);
+ method public void setUserIcon(android.content.ComponentName, android.graphics.Bitmap);
method public boolean switchUser(android.content.ComponentName, android.os.UserHandle);
method public void uninstallAllUserCaCerts(android.content.ComponentName);
method public void uninstallCaCert(android.content.ComponentName, byte[]);
@@ -22040,47 +22041,47 @@
method public static final int getBinderProxyObjectCount();
method public static int getBinderReceivedTransactions();
method public static int getBinderSentTransactions();
- method public static int getGlobalAllocCount();
- method public static int getGlobalAllocSize();
- method public static int getGlobalClassInitCount();
- method public static int getGlobalClassInitTime();
+ method public static deprecated int getGlobalAllocCount();
+ method public static deprecated int getGlobalAllocSize();
+ method public static deprecated int getGlobalClassInitCount();
+ method public static deprecated int getGlobalClassInitTime();
method public static deprecated int getGlobalExternalAllocCount();
method public static deprecated int getGlobalExternalAllocSize();
method public static deprecated int getGlobalExternalFreedCount();
method public static deprecated int getGlobalExternalFreedSize();
- method public static int getGlobalFreedCount();
- method public static int getGlobalFreedSize();
- method public static int getGlobalGcInvocationCount();
+ method public static deprecated int getGlobalFreedCount();
+ method public static deprecated int getGlobalFreedSize();
+ method public static deprecated int getGlobalGcInvocationCount();
method public static int getLoadedClassCount();
method public static void getMemoryInfo(android.os.Debug.MemoryInfo);
method public static long getNativeHeapAllocatedSize();
method public static long getNativeHeapFreeSize();
method public static long getNativeHeapSize();
method public static long getPss();
- method public static int getThreadAllocCount();
- method public static int getThreadAllocSize();
+ method public static deprecated int getThreadAllocCount();
+ method public static deprecated int getThreadAllocSize();
method public static deprecated int getThreadExternalAllocCount();
method public static deprecated int getThreadExternalAllocSize();
- method public static int getThreadGcInvocationCount();
+ method public static deprecated int getThreadGcInvocationCount();
method public static boolean isDebuggerConnected();
method public static void printLoadedClasses(int);
- method public static void resetAllCounts();
- method public static void resetGlobalAllocCount();
- method public static void resetGlobalAllocSize();
- method public static void resetGlobalClassInitCount();
- method public static void resetGlobalClassInitTime();
+ method public static deprecated void resetAllCounts();
+ method public static deprecated void resetGlobalAllocCount();
+ method public static deprecated void resetGlobalAllocSize();
+ method public static deprecated void resetGlobalClassInitCount();
+ method public static deprecated void resetGlobalClassInitTime();
method public static deprecated void resetGlobalExternalAllocCount();
method public static deprecated void resetGlobalExternalAllocSize();
method public static deprecated void resetGlobalExternalFreedCount();
method public static deprecated void resetGlobalExternalFreedSize();
- method public static void resetGlobalFreedCount();
- method public static void resetGlobalFreedSize();
- method public static void resetGlobalGcInvocationCount();
- method public static void resetThreadAllocCount();
- method public static void resetThreadAllocSize();
+ method public static deprecated void resetGlobalFreedCount();
+ method public static deprecated void resetGlobalFreedSize();
+ method public static deprecated void resetGlobalGcInvocationCount();
+ method public static deprecated void resetThreadAllocCount();
+ method public static deprecated void resetThreadAllocSize();
method public static deprecated void resetThreadExternalAllocCount();
method public static deprecated void resetThreadExternalAllocSize();
- method public static void resetThreadGcInvocationCount();
+ method public static deprecated void resetThreadGcInvocationCount();
method public static deprecated int setAllocationLimit(int);
method public static deprecated int setGlobalAllocationLimit(int);
method public static deprecated void startAllocCounting();
@@ -22099,7 +22100,7 @@
field public static final int SHOW_CLASSLOADER = 2; // 0x2
field public static final int SHOW_FULL_DETAIL = 1; // 0x1
field public static final int SHOW_INITIALIZED = 4; // 0x4
- field public static final int TRACE_COUNT_ALLOCS = 1; // 0x1
+ field public static final deprecated int TRACE_COUNT_ALLOCS = 1; // 0x1
}
public static deprecated class Debug.InstructionCount {
@@ -24914,6 +24915,7 @@
field public static final int ORGANIZATION = 30; // 0x1e
field public static final int PHONE = 20; // 0x14
field public static final int STRUCTURED_NAME = 40; // 0x28
+ field public static final int STRUCTURED_PHONETIC_NAME = 37; // 0x25
field public static final int UNDEFINED = 0; // 0x0
}
@@ -29329,6 +29331,7 @@
}
public class TelephonyManager {
+ method public boolean canChangeDtmfToneLength();
method public java.util.List<android.telephony.CellInfo> getAllCellInfo();
method public int getCallState();
method public android.telephony.CellLocation getCellLocation();
@@ -29364,6 +29367,7 @@
method public boolean isNetworkRoaming();
method public boolean isSmsCapable();
method public boolean isVoiceCapable();
+ method public boolean isWorldPhone();
method public void listen(android.telephony.PhoneStateListener, int);
method public java.lang.String sendEnvelopeWithStatus(java.lang.String);
method public boolean setLine1NumberForDisplay(java.lang.String, java.lang.String);
@@ -36923,6 +36927,12 @@
method public abstract void onReceivedIcon(java.lang.String, android.graphics.Bitmap);
}
+ public abstract class WebResourceError {
+ ctor public WebResourceError();
+ method public abstract java.lang.String getDescription();
+ method public abstract int getErrorCode();
+ }
+
public abstract interface WebResourceRequest {
method public abstract java.lang.String getMethod();
method public abstract java.util.Map<java.lang.String, java.lang.String> getRequestHeaders();
@@ -36931,7 +36941,7 @@
method public abstract boolean isForMainFrame();
}
- public class WebResourceResponse {
+ public class WebResourceResponse extends android.webkit.WebResourceResponseBase {
ctor public WebResourceResponse(java.lang.String, java.lang.String, java.io.InputStream);
ctor public WebResourceResponse(java.lang.String, java.lang.String, int, java.lang.String, java.util.Map<java.lang.String, java.lang.String>, java.io.InputStream);
method public java.io.InputStream getData();
@@ -36947,6 +36957,16 @@
method public void setStatusCodeAndReasonPhrase(int, java.lang.String);
}
+ public abstract class WebResourceResponseBase {
+ ctor public WebResourceResponseBase();
+ method public abstract java.io.InputStream getData();
+ method public abstract java.lang.String getEncoding();
+ method public abstract java.lang.String getMimeType();
+ method public abstract java.lang.String getReasonPhrase();
+ method public abstract java.util.Map<java.lang.String, java.lang.String> getResponseHeaders();
+ method public abstract int getStatusCode();
+ }
+
public abstract class WebSettings {
ctor public WebSettings();
method public abstract deprecated boolean enableSmoothTransition();
@@ -37261,8 +37281,10 @@
method public void onPageFinished(android.webkit.WebView, java.lang.String);
method public void onPageStarted(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
method public void onReceivedClientCertRequest(android.webkit.WebView, android.webkit.ClientCertRequest);
- method public void onReceivedError(android.webkit.WebView, int, java.lang.String, java.lang.String);
+ method public deprecated void onReceivedError(android.webkit.WebView, int, java.lang.String, java.lang.String);
+ method public void onReceivedError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceError);
method public void onReceivedHttpAuthRequest(android.webkit.WebView, android.webkit.HttpAuthHandler, java.lang.String, java.lang.String);
+ method public void onReceivedHttpError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceResponseBase);
method public void onReceivedLoginRequest(android.webkit.WebView, java.lang.String, java.lang.String, java.lang.String);
method public void onReceivedSslError(android.webkit.WebView, android.webkit.SslErrorHandler, android.net.http.SslError);
method public void onScaleChanged(android.webkit.WebView, float, float);
@@ -37275,6 +37297,7 @@
method public boolean shouldOverrideUrlLoading(android.webkit.WebView, java.lang.String);
field public static final int ERROR_AUTHENTICATION = -4; // 0xfffffffc
field public static final int ERROR_BAD_URL = -12; // 0xfffffff4
+ field public static final int ERROR_BLOCKED = -16; // 0xfffffff0
field public static final int ERROR_CONNECT = -6; // 0xfffffffa
field public static final int ERROR_FAILED_SSL_HANDSHAKE = -11; // 0xfffffff5
field public static final int ERROR_FILE = -13; // 0xfffffff3
diff --git a/api/system-current.txt b/api/system-current.txt
index 4755fe7..ca84133 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -4554,10 +4554,10 @@
method public void setInTouchMode(boolean);
method public void start();
method public android.app.Activity startActivitySync(android.content.Intent);
- method public void startAllocCounting();
+ method public deprecated void startAllocCounting();
method public void startPerformanceSnapshot();
method public void startProfiling();
- method public void stopAllocCounting();
+ method public deprecated void stopAllocCounting();
method public void stopProfiling();
method public void waitForIdle(java.lang.Runnable);
method public void waitForIdleSync();
@@ -5649,6 +5649,7 @@
method public int setStorageEncryption(android.content.ComponentName, boolean);
method public void setUninstallBlocked(android.content.ComponentName, java.lang.String, boolean);
method public boolean setUserEnabled(android.content.ComponentName);
+ method public void setUserIcon(android.content.ComponentName, android.graphics.Bitmap);
method public boolean switchUser(android.content.ComponentName, android.os.UserHandle);
method public void uninstallAllUserCaCerts(android.content.ComponentName);
method public void uninstallCaCert(android.content.ComponentName, byte[]);
@@ -23630,47 +23631,47 @@
method public static final int getBinderProxyObjectCount();
method public static int getBinderReceivedTransactions();
method public static int getBinderSentTransactions();
- method public static int getGlobalAllocCount();
- method public static int getGlobalAllocSize();
- method public static int getGlobalClassInitCount();
- method public static int getGlobalClassInitTime();
+ method public static deprecated int getGlobalAllocCount();
+ method public static deprecated int getGlobalAllocSize();
+ method public static deprecated int getGlobalClassInitCount();
+ method public static deprecated int getGlobalClassInitTime();
method public static deprecated int getGlobalExternalAllocCount();
method public static deprecated int getGlobalExternalAllocSize();
method public static deprecated int getGlobalExternalFreedCount();
method public static deprecated int getGlobalExternalFreedSize();
- method public static int getGlobalFreedCount();
- method public static int getGlobalFreedSize();
- method public static int getGlobalGcInvocationCount();
+ method public static deprecated int getGlobalFreedCount();
+ method public static deprecated int getGlobalFreedSize();
+ method public static deprecated int getGlobalGcInvocationCount();
method public static int getLoadedClassCount();
method public static void getMemoryInfo(android.os.Debug.MemoryInfo);
method public static long getNativeHeapAllocatedSize();
method public static long getNativeHeapFreeSize();
method public static long getNativeHeapSize();
method public static long getPss();
- method public static int getThreadAllocCount();
- method public static int getThreadAllocSize();
+ method public static deprecated int getThreadAllocCount();
+ method public static deprecated int getThreadAllocSize();
method public static deprecated int getThreadExternalAllocCount();
method public static deprecated int getThreadExternalAllocSize();
- method public static int getThreadGcInvocationCount();
+ method public static deprecated int getThreadGcInvocationCount();
method public static boolean isDebuggerConnected();
method public static void printLoadedClasses(int);
- method public static void resetAllCounts();
- method public static void resetGlobalAllocCount();
- method public static void resetGlobalAllocSize();
- method public static void resetGlobalClassInitCount();
- method public static void resetGlobalClassInitTime();
+ method public static deprecated void resetAllCounts();
+ method public static deprecated void resetGlobalAllocCount();
+ method public static deprecated void resetGlobalAllocSize();
+ method public static deprecated void resetGlobalClassInitCount();
+ method public static deprecated void resetGlobalClassInitTime();
method public static deprecated void resetGlobalExternalAllocCount();
method public static deprecated void resetGlobalExternalAllocSize();
method public static deprecated void resetGlobalExternalFreedCount();
method public static deprecated void resetGlobalExternalFreedSize();
- method public static void resetGlobalFreedCount();
- method public static void resetGlobalFreedSize();
- method public static void resetGlobalGcInvocationCount();
- method public static void resetThreadAllocCount();
- method public static void resetThreadAllocSize();
+ method public static deprecated void resetGlobalFreedCount();
+ method public static deprecated void resetGlobalFreedSize();
+ method public static deprecated void resetGlobalGcInvocationCount();
+ method public static deprecated void resetThreadAllocCount();
+ method public static deprecated void resetThreadAllocSize();
method public static deprecated void resetThreadExternalAllocCount();
method public static deprecated void resetThreadExternalAllocSize();
- method public static void resetThreadGcInvocationCount();
+ method public static deprecated void resetThreadGcInvocationCount();
method public static deprecated int setAllocationLimit(int);
method public static deprecated int setGlobalAllocationLimit(int);
method public static deprecated void startAllocCounting();
@@ -23689,7 +23690,7 @@
field public static final int SHOW_CLASSLOADER = 2; // 0x2
field public static final int SHOW_FULL_DETAIL = 1; // 0x1
field public static final int SHOW_INITIALIZED = 4; // 0x4
- field public static final int TRACE_COUNT_ALLOCS = 1; // 0x1
+ field public static final deprecated int TRACE_COUNT_ALLOCS = 1; // 0x1
}
public static deprecated class Debug.InstructionCount {
@@ -26514,6 +26515,7 @@
field public static final int ORGANIZATION = 30; // 0x1e
field public static final int PHONE = 20; // 0x14
field public static final int STRUCTURED_NAME = 40; // 0x28
+ field public static final int STRUCTURED_PHONETIC_NAME = 37; // 0x25
field public static final int UNDEFINED = 0; // 0x0
}
@@ -31456,6 +31458,7 @@
public class TelephonyManager {
method public void answerRingingCall();
method public void call(java.lang.String, java.lang.String);
+ method public boolean canChangeDtmfToneLength();
method public int checkCarrierPrivilegesForPackage(java.lang.String);
method public void dial(java.lang.String);
method public boolean disableDataConnectivity();
@@ -31515,6 +31518,7 @@
method public boolean isSmsCapable();
method public boolean isVideoCallingEnabled();
method public boolean isVoiceCapable();
+ method public boolean isWorldPhone();
method public void listen(android.telephony.PhoneStateListener, int);
method public boolean needsOtaServiceProvisioning();
method public java.lang.String sendEnvelopeWithStatus(java.lang.String);
@@ -39147,6 +39151,12 @@
method public abstract void onReceivedIcon(java.lang.String, android.graphics.Bitmap);
}
+ public abstract class WebResourceError {
+ ctor public WebResourceError();
+ method public abstract java.lang.String getDescription();
+ method public abstract int getErrorCode();
+ }
+
public abstract interface WebResourceRequest {
method public abstract java.lang.String getMethod();
method public abstract java.util.Map<java.lang.String, java.lang.String> getRequestHeaders();
@@ -39155,7 +39165,7 @@
method public abstract boolean isForMainFrame();
}
- public class WebResourceResponse {
+ public class WebResourceResponse extends android.webkit.WebResourceResponseBase {
ctor public WebResourceResponse(java.lang.String, java.lang.String, java.io.InputStream);
ctor public WebResourceResponse(java.lang.String, java.lang.String, int, java.lang.String, java.util.Map<java.lang.String, java.lang.String>, java.io.InputStream);
method public java.io.InputStream getData();
@@ -39171,6 +39181,16 @@
method public void setStatusCodeAndReasonPhrase(int, java.lang.String);
}
+ public abstract class WebResourceResponseBase {
+ ctor public WebResourceResponseBase();
+ method public abstract java.io.InputStream getData();
+ method public abstract java.lang.String getEncoding();
+ method public abstract java.lang.String getMimeType();
+ method public abstract java.lang.String getReasonPhrase();
+ method public abstract java.util.Map<java.lang.String, java.lang.String> getResponseHeaders();
+ method public abstract int getStatusCode();
+ }
+
public abstract class WebSettings {
ctor public WebSettings();
method public abstract deprecated boolean enableSmoothTransition();
@@ -39530,8 +39550,10 @@
method public void onPageFinished(android.webkit.WebView, java.lang.String);
method public void onPageStarted(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
method public void onReceivedClientCertRequest(android.webkit.WebView, android.webkit.ClientCertRequest);
- method public void onReceivedError(android.webkit.WebView, int, java.lang.String, java.lang.String);
+ method public deprecated void onReceivedError(android.webkit.WebView, int, java.lang.String, java.lang.String);
+ method public void onReceivedError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceError);
method public void onReceivedHttpAuthRequest(android.webkit.WebView, android.webkit.HttpAuthHandler, java.lang.String, java.lang.String);
+ method public void onReceivedHttpError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceResponseBase);
method public void onReceivedLoginRequest(android.webkit.WebView, java.lang.String, java.lang.String, java.lang.String);
method public void onReceivedSslError(android.webkit.WebView, android.webkit.SslErrorHandler, android.net.http.SslError);
method public void onScaleChanged(android.webkit.WebView, float, float);
@@ -39544,6 +39566,7 @@
method public boolean shouldOverrideUrlLoading(android.webkit.WebView, java.lang.String);
field public static final int ERROR_AUTHENTICATION = -4; // 0xfffffffc
field public static final int ERROR_BAD_URL = -12; // 0xfffffff4
+ field public static final int ERROR_BLOCKED = -16; // 0xfffffff0
field public static final int ERROR_CONNECT = -6; // 0xfffffffa
field public static final int ERROR_FAILED_SSL_HANDSHAKE = -11; // 0xfffffff5
field public static final int ERROR_FILE = -13; // 0xfffffff3
diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java
index ad2b61f2..5572d30 100644
--- a/core/java/android/app/Instrumentation.java
+++ b/core/java/android/app/Instrumentation.java
@@ -1322,7 +1322,10 @@
/*
* Starts allocation counting. This triggers a gc and resets the counts.
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public void startAllocCounting() {
// Before we start trigger a GC and reset the debug counts. Run the
// finalizers and another GC before starting and stopping the alloc
@@ -1340,7 +1343,10 @@
/*
* Stops allocation counting.
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public void stopAllocCounting() {
Runtime.getRuntime().gc();
Runtime.getRuntime().runFinalization();
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 3d587b6..c7088599 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -28,6 +28,7 @@
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.graphics.Bitmap;
import android.net.ProxyInfo;
import android.os.Bundle;
import android.os.Handler;
@@ -3742,4 +3743,18 @@
}
return Collections.emptyList();
}
+
+ /**
+ * Called by profile or device owners to set the current user's photo.
+ *
+ * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
+ * @param icon the bitmap to set as the photo.
+ */
+ public void setUserIcon(ComponentName admin, Bitmap icon) {
+ try {
+ mService.setUserIcon(admin, icon);
+ } catch (RemoteException re) {
+ Log.w(TAG, "Could not set the user icon ", re);
+ }
+ }
}
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 5cbab4b..f69cf36 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -20,6 +20,7 @@
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
+import android.graphics.Bitmap;
import android.net.ProxyInfo;
import android.os.Bundle;
import android.os.PersistableBundle;
@@ -205,4 +206,6 @@
void clearDeviceInitializer(in ComponentName who);
boolean setDeviceInitializer(in ComponentName who, in ComponentName initializer, String initializerName);
String getDeviceInitializer();
+
+ void setUserIcon(in ComponentName admin, in Bitmap icon);
}
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index d03365b..512e212 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -63,7 +63,10 @@
*
* TRACE_COUNT_ALLOCS adds the results from startAllocCounting to the
* trace key file.
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static final int TRACE_COUNT_ALLOCS = VMDebug.TRACE_COUNT_ALLOCS;
/**
@@ -760,7 +763,7 @@
/**
* Stop counting the number and aggregate size of memory allocations.
*
- * @see #startAllocCounting()
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
@Deprecated
public static void stopAllocCounting() {
@@ -770,7 +773,10 @@
/**
* Returns the global count of objects allocated by the runtime between a
* {@link #startAllocCounting() start} and {@link #stopAllocCounting() stop}.
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static int getGlobalAllocCount() {
return VMDebug.getAllocCount(VMDebug.KIND_GLOBAL_ALLOCATED_OBJECTS);
}
@@ -778,7 +784,10 @@
/**
* Clears the global count of objects allocated.
* @see #getGlobalAllocCount()
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static void resetGlobalAllocCount() {
VMDebug.resetAllocCount(VMDebug.KIND_GLOBAL_ALLOCATED_OBJECTS);
}
@@ -786,7 +795,10 @@
/**
* Returns the global size, in bytes, of objects allocated by the runtime between a
* {@link #startAllocCounting() start} and {@link #stopAllocCounting() stop}.
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static int getGlobalAllocSize() {
return VMDebug.getAllocCount(VMDebug.KIND_GLOBAL_ALLOCATED_BYTES);
}
@@ -794,7 +806,10 @@
/**
* Clears the global size of objects allocated.
* @see #getGlobalAllocSize()
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static void resetGlobalAllocSize() {
VMDebug.resetAllocCount(VMDebug.KIND_GLOBAL_ALLOCATED_BYTES);
}
@@ -802,7 +817,10 @@
/**
* Returns the global count of objects freed by the runtime between a
* {@link #startAllocCounting() start} and {@link #stopAllocCounting() stop}.
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static int getGlobalFreedCount() {
return VMDebug.getAllocCount(VMDebug.KIND_GLOBAL_FREED_OBJECTS);
}
@@ -810,7 +828,10 @@
/**
* Clears the global count of objects freed.
* @see #getGlobalFreedCount()
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static void resetGlobalFreedCount() {
VMDebug.resetAllocCount(VMDebug.KIND_GLOBAL_FREED_OBJECTS);
}
@@ -818,7 +839,10 @@
/**
* Returns the global size, in bytes, of objects freed by the runtime between a
* {@link #startAllocCounting() start} and {@link #stopAllocCounting() stop}.
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static int getGlobalFreedSize() {
return VMDebug.getAllocCount(VMDebug.KIND_GLOBAL_FREED_BYTES);
}
@@ -826,7 +850,10 @@
/**
* Clears the global size of objects freed.
* @see #getGlobalFreedSize()
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static void resetGlobalFreedSize() {
VMDebug.resetAllocCount(VMDebug.KIND_GLOBAL_FREED_BYTES);
}
@@ -834,7 +861,10 @@
/**
* Returns the number of non-concurrent GC invocations between a
* {@link #startAllocCounting() start} and {@link #stopAllocCounting() stop}.
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static int getGlobalGcInvocationCount() {
return VMDebug.getAllocCount(VMDebug.KIND_GLOBAL_GC_INVOCATIONS);
}
@@ -842,7 +872,10 @@
/**
* Clears the count of non-concurrent GC invocations.
* @see #getGlobalGcInvocationCount()
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static void resetGlobalGcInvocationCount() {
VMDebug.resetAllocCount(VMDebug.KIND_GLOBAL_GC_INVOCATIONS);
}
@@ -851,7 +884,10 @@
* Returns the number of classes successfully initialized (ie those that executed without
* throwing an exception) between a {@link #startAllocCounting() start} and
* {@link #stopAllocCounting() stop}.
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static int getGlobalClassInitCount() {
return VMDebug.getAllocCount(VMDebug.KIND_GLOBAL_CLASS_INIT_COUNT);
}
@@ -859,7 +895,10 @@
/**
* Clears the count of classes initialized.
* @see #getGlobalClassInitCount()
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static void resetGlobalClassInitCount() {
VMDebug.resetAllocCount(VMDebug.KIND_GLOBAL_CLASS_INIT_COUNT);
}
@@ -867,7 +906,10 @@
/**
* Returns the time spent successfully initializing classes between a
* {@link #startAllocCounting() start} and {@link #stopAllocCounting() stop}.
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static int getGlobalClassInitTime() {
/* cumulative elapsed time for class initialization, in usec */
return VMDebug.getAllocCount(VMDebug.KIND_GLOBAL_CLASS_INIT_TIME);
@@ -876,7 +918,10 @@
/**
* Clears the count of time spent initializing classes.
* @see #getGlobalClassInitTime()
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static void resetGlobalClassInitTime() {
VMDebug.resetAllocCount(VMDebug.KIND_GLOBAL_CLASS_INIT_TIME);
}
@@ -948,7 +993,10 @@
/**
* Returns the thread-local count of objects allocated by the runtime between a
* {@link #startAllocCounting() start} and {@link #stopAllocCounting() stop}.
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static int getThreadAllocCount() {
return VMDebug.getAllocCount(VMDebug.KIND_THREAD_ALLOCATED_OBJECTS);
}
@@ -956,7 +1004,10 @@
/**
* Clears the thread-local count of objects allocated.
* @see #getThreadAllocCount()
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static void resetThreadAllocCount() {
VMDebug.resetAllocCount(VMDebug.KIND_THREAD_ALLOCATED_OBJECTS);
}
@@ -965,7 +1016,10 @@
* Returns the thread-local size of objects allocated by the runtime between a
* {@link #startAllocCounting() start} and {@link #stopAllocCounting() stop}.
* @return The allocated size in bytes.
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static int getThreadAllocSize() {
return VMDebug.getAllocCount(VMDebug.KIND_THREAD_ALLOCATED_BYTES);
}
@@ -973,7 +1027,10 @@
/**
* Clears the thread-local count of objects allocated.
* @see #getThreadAllocSize()
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static void resetThreadAllocSize() {
VMDebug.resetAllocCount(VMDebug.KIND_THREAD_ALLOCATED_BYTES);
}
@@ -1013,7 +1070,10 @@
/**
* Returns the number of thread-local non-concurrent GC invocations between a
* {@link #startAllocCounting() start} and {@link #stopAllocCounting() stop}.
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static int getThreadGcInvocationCount() {
return VMDebug.getAllocCount(VMDebug.KIND_THREAD_GC_INVOCATIONS);
}
@@ -1021,7 +1081,10 @@
/**
* Clears the thread-local count of non-concurrent GC invocations.
* @see #getThreadGcInvocationCount()
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static void resetThreadGcInvocationCount() {
VMDebug.resetAllocCount(VMDebug.KIND_THREAD_GC_INVOCATIONS);
}
@@ -1029,7 +1092,10 @@
/**
* Clears all the global and thread-local memory allocation counters.
* @see #startAllocCounting()
+ *
+ * @deprecated Accurate counting is a burden on the runtime and may be removed.
*/
+ @Deprecated
public static void resetAllCounts() {
VMDebug.resetAllocCount(VMDebug.KIND_ALL_COUNTS);
}
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index 9cc12b5..cc7783f 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -1010,7 +1010,8 @@
/**
* Types of data used to produce the display name for a contact. In the order
* of increasing priority: {@link #EMAIL}, {@link #PHONE},
- * {@link #ORGANIZATION}, {@link #NICKNAME}, {@link #STRUCTURED_NAME}.
+ * {@link #ORGANIZATION}, {@link #NICKNAME}, {@link #STRUCTURED_PHONETIC_NAME},
+ * {@link #STRUCTURED_NAME}.
*/
public interface DisplayNameSources {
public static final int UNDEFINED = 0;
@@ -1018,6 +1019,8 @@
public static final int PHONE = 20;
public static final int ORGANIZATION = 30;
public static final int NICKNAME = 35;
+ /** Display name comes from a structured name that only has phonetic components. */
+ public static final int STRUCTURED_PHONETIC_NAME = 37;
public static final int STRUCTURED_NAME = 40;
}
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java
index d1caa43..967e80c 100644
--- a/core/java/android/text/StaticLayout.java
+++ b/core/java/android/text/StaticLayout.java
@@ -28,6 +28,7 @@
import com.android.internal.util.GrowingArrayUtils;
import java.util.Arrays;
+import java.util.Locale;
/**
* StaticLayout is a Layout for text that will not be edited after it
@@ -51,6 +52,10 @@
* @hide
*/
public final static class Builder {
+ private Builder() {
+ mNativePtr = nNewBuilder();
+ }
+
static Builder obtain() {
Builder b = null;
synchronized (sLock) {
@@ -96,6 +101,7 @@
// release any expensive state
/* package */ void finish() {
+ nFinishBuilder(mNativePtr);
mMeasuredText.finish();
}
@@ -160,6 +166,14 @@
return this;
}
+ /* @hide */
+ public void setLocale(Locale locale) {
+ if (!locale.equals(mLocale)) {
+ nBuilderSetLocale(mNativePtr, locale.toLanguageTag());
+ mLocale = locale;
+ }
+ }
+
public StaticLayout build() {
// TODO: can optimize based on whether ellipsis is needed
StaticLayout result = new StaticLayout(mText);
@@ -168,6 +182,17 @@
return result;
}
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ nFreeBuilder(mNativePtr);
+ } finally {
+ super.finalize();
+ }
+ }
+
+ /* package */ long mNativePtr;
+
CharSequence mText;
int mStart;
int mEnd;
@@ -186,6 +211,8 @@
// This will go away and be subsumed by native builder code
MeasuredText mMeasuredText;
+ Locale mLocale;
+
private static final Object sLock = new Object();
private static final Builder[] sCached = new Builder[3];
}
@@ -322,13 +349,13 @@
float spacingadd = b.mSpacingAdd;
float ellipsizedWidth = b.mEllipsizedWidth;
TextUtils.TruncateAt ellipsize = b.mEllipsize;
- LineBreaks lineBreaks = new LineBreaks();
+ LineBreaks lineBreaks = new LineBreaks(); // TODO: move to builder to avoid allocation costs
// store span end locations
int[] spanEndCache = new int[4];
// store fontMetrics per span range
// must be a multiple of 4 (and > 0) (store top, bottom, ascent, and descent per range)
int[] fmCache = new int[4 * 4];
- final String localeLanguageTag = paint.getTextLocale().toLanguageTag();
+ b.setLocale(paint.getTextLocale()); // TODO: also respect LocaleSpan within the text
mLineCount = 0;
@@ -466,7 +493,7 @@
}
}
- int breakCount = nComputeLineBreaks(localeLanguageTag, chs, widths, paraEnd - paraStart, firstWidth,
+ int breakCount = nComputeLineBreaks(b.mNativePtr, chs, widths, paraEnd - paraStart, firstWidth,
firstWidthLineCount, restWidth, variableTabStops, TAB_INCREMENT, false, lineBreaks,
lineBreaks.breaks, lineBreaks.widths, lineBreaks.flags, lineBreaks.breaks.length);
@@ -911,11 +938,16 @@
// the arrays inside the LineBreaks objects are passed in as well
// to reduce the number of JNI calls in the common case where the
// arrays do not have to be resized
- private static native int nComputeLineBreaks(String locale, char[] text, float[] widths,
+ private static native int nComputeLineBreaks(long nativePtr, char[] text, float[] widths,
int length, float firstWidth, int firstWidthLineCount, float restWidth,
int[] variableTabStops, int defaultTabStop, boolean optimize, LineBreaks recycle,
int[] recycleBreaks, float[] recycleWidths, boolean[] recycleFlags, int recycleLength);
+ private static native long nNewBuilder();
+ private static native void nFreeBuilder(long nativePtr);
+ private static native void nFinishBuilder(long nativePtr);
+ private static native void nBuilderSetLocale(long nativePtr, String locale);
+
private int mLineCount;
private int mTopPadding, mBottomPadding;
private int mColumns;
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java
index 0d36949..06e196d 100644
--- a/core/java/android/view/GLES20Canvas.java
+++ b/core/java/android/view/GLES20Canvas.java
@@ -204,7 +204,7 @@
Bitmap bitmap = patch.getBitmap();
throwIfCannotDraw(bitmap);
final long nativePaint = paint == null ? 0 : paint.getNativeInstance();
- nDrawPatch(mNativeCanvasWrapper, bitmap.mNativeBitmap, patch.mNativeChunk,
+ nDrawPatch(mNativeCanvasWrapper, bitmap.getSkBitmap(), patch.mNativeChunk,
dst.left, dst.top, dst.right, dst.bottom, nativePaint);
}
@@ -214,7 +214,7 @@
Bitmap bitmap = patch.getBitmap();
throwIfCannotDraw(bitmap);
final long nativePaint = paint == null ? 0 : paint.getNativeInstance();
- nDrawPatch(mNativeCanvasWrapper, bitmap.mNativeBitmap, patch.mNativeChunk,
+ nDrawPatch(mNativeCanvasWrapper, bitmap.getSkBitmap(), patch.mNativeChunk,
dst.left, dst.top, dst.right, dst.bottom, nativePaint);
}
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index df0838f..69b4c47 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -364,7 +364,7 @@
@Override
boolean copyLayerInto(final HardwareLayer layer, final Bitmap bitmap) {
return nCopyLayerInto(mNativeProxy,
- layer.getDeferredLayerUpdater(), bitmap.mNativeBitmap);
+ layer.getDeferredLayerUpdater(), bitmap.getSkBitmap());
}
@Override
@@ -465,7 +465,7 @@
for (int i = 0; i < count; i++) {
drawables.valueAt(i).addAtlasableBitmaps(tmpList);
for (int j = 0; j < tmpList.size(); j++) {
- preloadedPointers.add(tmpList.get(j).mNativeBitmap);
+ preloadedPointers.add(tmpList.get(j).getSkBitmap());
}
tmpList.clear();
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index f25b640..4b3765a 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -5849,7 +5849,7 @@
*
* @see AccessibilityDelegate
*/
- public void setAccessibilityDelegate(AccessibilityDelegate delegate) {
+ public void setAccessibilityDelegate(@Nullable AccessibilityDelegate delegate) {
mAccessibilityDelegate = delegate;
}
diff --git a/core/java/android/webkit/WebResourceError.java b/core/java/android/webkit/WebResourceError.java
new file mode 100644
index 0000000..080d174
--- /dev/null
+++ b/core/java/android/webkit/WebResourceError.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.webkit;
+
+/**
+ * Encapsulates information about errors occured during loading of web resources. See
+ * {@link WebViewClient#onReceivedError(WebView, WebResourceRequest, WebResourceError) WebViewClient.onReceivedError(WebView, WebResourceRequest, WebResourceError)}
+ */
+public abstract class WebResourceError {
+ /**
+ * Gets the error code of the error. The code corresponds to one
+ * of the ERROR_* constants in {@link WebViewClient}.
+ *
+ * @return The error code of the error
+ */
+ public abstract int getErrorCode();
+
+ /**
+ * Gets the string describing the error. Descriptions are localized,
+ * and thus can be used for communicating the problem to the user.
+ *
+ * @return The description of the error
+ */
+ public abstract String getDescription();
+}
diff --git a/core/java/android/webkit/WebResourceResponse.java b/core/java/android/webkit/WebResourceResponse.java
index f487a4e..a42aaa7 100644
--- a/core/java/android/webkit/WebResourceResponse.java
+++ b/core/java/android/webkit/WebResourceResponse.java
@@ -25,7 +25,7 @@
* class from {@link WebViewClient#shouldInterceptRequest} to provide a custom
* response when the WebView requests a particular resource.
*/
-public class WebResourceResponse {
+public class WebResourceResponse extends WebResourceResponseBase {
private String mMimeType;
private String mEncoding;
private int mStatusCode;
@@ -75,38 +75,36 @@
}
/**
- * Sets the resource response's MIME type, for example text/html.
+ * Sets the resource response's MIME type, for example "text/html".
*
- * @param mimeType the resource response's MIME type
+ * @param mimeType The resource response's MIME type
*/
public void setMimeType(String mimeType) {
mMimeType = mimeType;
}
/**
- * Gets the resource response's MIME type.
- *
- * @return the resource response's MIME type
+ * {@inheritDoc}
*/
+ @Override
public String getMimeType() {
return mMimeType;
}
/**
- * Sets the resource response's encoding, for example UTF-8. This is used
+ * Sets the resource response's encoding, for example "UTF-8". This is used
* to decode the data from the input stream.
*
- * @param encoding the resource response's encoding
+ * @param encoding The resource response's encoding
*/
public void setEncoding(String encoding) {
mEncoding = encoding;
}
/**
- * Gets the resource response's encoding.
- *
- * @return the resource response's encoding
+ * {@inheritDoc}
*/
+ @Override
public String getEncoding() {
return mEncoding;
}
@@ -142,19 +140,17 @@
}
/**
- * Gets the resource response's status code.
- *
- * @return the resource response's status code.
+ * {@inheritDoc}
*/
+ @Override
public int getStatusCode() {
return mStatusCode;
}
/**
- * Gets the description of the resource response's status code.
- *
- * @return the description of the resource response's status code.
+ * {@inheritDoc}
*/
+ @Override
public String getReasonPhrase() {
return mReasonPhrase;
}
@@ -162,17 +158,16 @@
/**
* Sets the headers for the resource response.
*
- * @param headers mapping of header name -> header value.
+ * @param headers Mapping of header name -> header value.
*/
public void setResponseHeaders(Map<String, String> headers) {
mResponseHeaders = headers;
}
/**
- * Gets the headers for the resource response.
- *
- * @return the headers for the resource response.
+ * {@inheritDoc}
*/
+ @Override
public Map<String, String> getResponseHeaders() {
return mResponseHeaders;
}
@@ -190,15 +185,13 @@
throw new IllegalArgumentException("StringBufferInputStream is deprecated and must " +
"not be passed to a WebResourceResponse");
}
-
mInputStream = data;
}
/**
- * Gets the input stream that provides the resource response's data.
- *
- * @return the input stream that provides the resource response's data
+ * {@inheritDoc}
*/
+ @Override
public InputStream getData() {
return mInputStream;
}
diff --git a/core/java/android/webkit/WebResourceResponseBase.java b/core/java/android/webkit/WebResourceResponseBase.java
new file mode 100644
index 0000000..cffde82
--- /dev/null
+++ b/core/java/android/webkit/WebResourceResponseBase.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.webkit;
+
+import java.io.InputStream;
+import java.util.Map;
+
+/**
+ * Encapsulates a resource response received from the server.
+ * This is an abstract class used by WebView callbacks.
+ */
+public abstract class WebResourceResponseBase {
+ /**
+ * Gets the resource response's MIME type.
+ *
+ * @return The resource response's MIME type
+ */
+ public abstract String getMimeType();
+
+ /**
+ * Gets the resource response's encoding.
+ *
+ * @return The resource response's encoding
+ */
+ public abstract String getEncoding();
+
+ /**
+ * Gets the resource response's status code.
+ *
+ * @return The resource response's status code.
+ */
+ public abstract int getStatusCode();
+
+ /**
+ * Gets the description of the resource response's status code.
+ *
+ * @return The description of the resource response's status code.
+ */
+ public abstract String getReasonPhrase();
+
+ /**
+ * Gets the headers for the resource response.
+ *
+ * @return The headers for the resource response.
+ */
+ public abstract Map<String, String> getResponseHeaders();
+
+ /**
+ * Gets the input stream that provides the resource response's data.
+ *
+ * @return The input stream that provides the resource response's data
+ */
+ public abstract InputStream getData();
+}
diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java
index 1d2c311..3df1293 100644
--- a/core/java/android/webkit/WebSettings.java
+++ b/core/java/android/webkit/WebSettings.java
@@ -1285,7 +1285,7 @@
* strongly discouraged.
*
* @param mode The mixed content mode to use. One of {@link #MIXED_CONTENT_NEVER_ALLOW},
- * {@link #MIXED_CONTENT_NEVER_ALLOW} or {@link #MIXED_CONTENT_COMPATIBILITY_MODE}.
+ * {@link #MIXED_CONTENT_ALWAYS_ALLOW} or {@link #MIXED_CONTENT_COMPATIBILITY_MODE}.
*/
public abstract void setMixedContentMode(int mode);
@@ -1293,7 +1293,7 @@
* Gets the current behavior of the WebView with regard to loading insecure content from a
* secure origin.
* @return The current setting, one of {@link #MIXED_CONTENT_NEVER_ALLOW},
- * {@link #MIXED_CONTENT_NEVER_ALLOW} or {@link #MIXED_CONTENT_COMPATIBILITY_MODE}.
+ * {@link #MIXED_CONTENT_ALWAYS_ALLOW} or {@link #MIXED_CONTENT_COMPATIBILITY_MODE}.
*/
public abstract int getMixedContentMode();
diff --git a/core/java/android/webkit/WebViewClient.java b/core/java/android/webkit/WebViewClient.java
index 01f9b37..34b8cf6 100644
--- a/core/java/android/webkit/WebViewClient.java
+++ b/core/java/android/webkit/WebViewClient.java
@@ -174,6 +174,8 @@
public static final int ERROR_FILE_NOT_FOUND = -14;
/** Too many requests during this load */
public static final int ERROR_TOO_MANY_REQUESTS = -15;
+ /** Request blocked by the browser */
+ public static final int ERROR_BLOCKED = -16;
/**
* Report an error to the host application. These errors are unrecoverable
@@ -183,12 +185,45 @@
* @param errorCode The error code corresponding to an ERROR_* value.
* @param description A String describing the error.
* @param failingUrl The url that failed to load.
+ * @deprecated Use {@link #onReceivedError(WebView, WebResourceRequest, WebResourceError)
+ * onReceivedError(WebView, WebResourceRequest, WebResourceError)} instead.
*/
+ @Deprecated
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
}
/**
+ * Report web resource loading error to the host application. These errors usually indicate
+ * inability to connect to the server. Note that unlike the deprecated version of the callback,
+ * the new version will be called for any resource (iframe, image, etc), not just for the main
+ * page. Thus, it is recommended to perform minimum required work in this callback.
+ * @param view The WebView that is initiating the callback.
+ * @param request The originating request.
+ * @param error Information about the error occured.
+ */
+ public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
+ if (request.isForMainFrame()) {
+ onReceivedError(view,
+ error.getErrorCode(), error.getDescription(), request.getUrl().toString());
+ }
+ }
+
+ /**
+ * Notify the host application that an HTTP error has been received from the server while
+ * loading a resource. HTTP errors have status codes >= 400. This callback will be called
+ * for any resource (iframe, image, etc), not just for the main page. Thus, it is recommended to
+ * perform minimum required work in this callback. Note that the content of the server
+ * response may not be provided within the <b>errorResponse</b> parameter.
+ * @param view The WebView that is initiating the callback.
+ * @param request The originating request.
+ * @param errorResponse Information about the error occured.
+ */
+ public void onReceivedHttpError(
+ WebView view, WebResourceRequest request, WebResourceResponseBase errorResponse) {
+ }
+
+ /**
* As the host application if the browser should resend data as the
* requested page was a result of a POST. The default is to not resend the
* data.
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 5d519ed..8197b3d 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -128,7 +128,7 @@
// Each Editor manages its own undo stack.
private final UndoManager mUndoManager = new UndoManager();
private UndoOwner mUndoOwner = mUndoManager.getOwner(UNDO_OWNER_TAG, this);
- final InputFilter mUndoInputFilter = new UndoInputFilter(this);
+ final UndoInputFilter mUndoInputFilter = new UndoInputFilter(this);
boolean mAllowUndo = true;
// Cursor Controllers.
@@ -246,6 +246,15 @@
mUndoOwner = mUndoManager.getOwner(UNDO_OWNER_TAG, this);
}
+ /**
+ * Forgets all undo and redo operations for this Editor.
+ */
+ void forgetUndoRedo() {
+ UndoOwner[] owners = { mUndoOwner };
+ mUndoManager.forgetUndos(owners, -1 /* all */);
+ mUndoManager.forgetRedos(owners, -1 /* all */);
+ }
+
boolean canUndo() {
UndoOwner[] owners = { mUndoOwner };
return mAllowUndo && mUndoManager.countUndos(owners) > 0;
@@ -1214,6 +1223,7 @@
ims.mChangedEnd = EXTRACT_UNKNOWN;
ims.mContentChanged = false;
}
+ mUndoInputFilter.beginBatchEdit();
mTextView.onBeginBatchEdit();
}
}
@@ -1240,6 +1250,7 @@
void finishBatchEdit(final InputMethodState ims) {
mTextView.onEndBatchEdit();
+ mUndoInputFilter.endBatchEdit();
if (ims.mContentChanged || ims.mSelectionModeChanged) {
mTextView.updateAfterEdit();
@@ -4546,10 +4557,30 @@
public static class UndoInputFilter implements InputFilter {
private final Editor mEditor;
+ // Whether the current filter pass is directly caused by an end-user text edit.
+ private boolean mIsUserEdit;
+
+ // Whether this is the first pass through the filter for a given end-user text edit.
+ private boolean mFirstFilterPass;
+
public UndoInputFilter(Editor editor) {
mEditor = editor;
}
+ /**
+ * Signals that a user-triggered edit is starting.
+ */
+ public void beginBatchEdit() {
+ if (DEBUG_UNDO) Log.d(TAG, "beginBatchEdit");
+ mIsUserEdit = true;
+ mFirstFilterPass = true;
+ }
+
+ public void endBatchEdit() {
+ if (DEBUG_UNDO) Log.d(TAG, "endBatchEdit");
+ mIsUserEdit = false;
+ }
+
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
@@ -4558,36 +4589,24 @@
"dest=" + dest + " (" + dstart + "-" + dend + ")");
}
- if (!mEditor.mAllowUndo) {
- if (DEBUG_UNDO) Log.d(TAG, "filter: undo is disabled");
+ // Check to see if this edit should be tracked for undo.
+ if (!canUndoEdit(source, start, end, dest, dstart, dend)) {
return null;
}
- final UndoManager um = mEditor.mUndoManager;
- if (um.isInUndo()) {
- if (DEBUG_UNDO) Log.d(TAG, "filter: skipping, currently performing undo/redo");
- return null;
- }
-
- // Text filters run before input operations are applied. However, some input operations
- // are invalid and will throw exceptions when applied. This is common in tests. Don't
- // attempt to undo invalid operations.
- if (!isValidRange(source, start, end) || !isValidRange(dest, dstart, dend)) {
- if (DEBUG_UNDO) Log.d(TAG, "filter: invalid op");
- return null;
- }
-
- // Earlier filters can rewrite input to be a no-op, for example due to a length limit
- // on an input field. Skip no-op changes.
- if (start == end && dstart == dend) {
- if (DEBUG_UNDO) Log.d(TAG, "filter: skipping no-op");
- return null;
- }
+ // An application may install a TextWatcher to provide additional modifications after
+ // the initial input filters run (e.g. a credit card formatter that adds spaces to a
+ // string). This results in multiple filter() calls for what the user considers to be
+ // a single operation. Always undo the whole set of changes in one step.
+ final boolean forceMerge = !mFirstFilterPass;
+ mFirstFilterPass = false;
// Build a new operation with all the information from this edit.
- EditOperation edit = new EditOperation(mEditor, source, start, end, dest, dstart, dend);
+ EditOperation edit = new EditOperation(mEditor, forceMerge,
+ source, start, end, dest, dstart, dend);
// Fetch the last edit operation and attempt to merge in the new edit.
+ final UndoManager um = mEditor.mUndoManager;
um.beginUpdate("Edit text");
EditOperation lastEdit = um.getLastOperation(
EditOperation.class, mEditor.mUndoOwner, UndoManager.MERGE_MODE_UNIQUE);
@@ -4595,6 +4614,12 @@
// Add this as the first edit.
if (DEBUG_UNDO) Log.d(TAG, "filter: adding first op " + edit);
um.addOperation(edit, UndoManager.MERGE_MODE_NONE);
+ } else if (!mIsUserEdit) {
+ // An application directly modified the Editable outside of a text edit. Treat this
+ // as a new change and don't attempt to merge.
+ if (DEBUG_UNDO) Log.d(TAG, "non-user edit, new op " + edit);
+ um.commitState(mEditor.mUndoOwner);
+ um.addOperation(edit, UndoManager.MERGE_MODE_NONE);
} else if (lastEdit.mergeWith(edit)) {
// Merge succeeded, nothing else to do.
if (DEBUG_UNDO) Log.d(TAG, "filter: merge succeeded, created " + lastEdit);
@@ -4607,6 +4632,36 @@
um.endUpdate();
return null; // Text not changed.
}
+
+ private boolean canUndoEdit(CharSequence source, int start, int end,
+ Spanned dest, int dstart, int dend) {
+ if (!mEditor.mAllowUndo) {
+ if (DEBUG_UNDO) Log.d(TAG, "filter: undo is disabled");
+ return false;
+ }
+
+ if (mEditor.mUndoManager.isInUndo()) {
+ if (DEBUG_UNDO) Log.d(TAG, "filter: skipping, currently performing undo/redo");
+ return false;
+ }
+
+ // Text filters run before input operations are applied. However, some input operations
+ // are invalid and will throw exceptions when applied. This is common in tests. Don't
+ // attempt to undo invalid operations.
+ if (!isValidRange(source, start, end) || !isValidRange(dest, dstart, dend)) {
+ if (DEBUG_UNDO) Log.d(TAG, "filter: invalid op");
+ return false;
+ }
+
+ // Earlier filters can rewrite input to be a no-op, for example due to a length limit
+ // on an input field. Skip no-op changes.
+ if (start == end && dstart == dend) {
+ if (DEBUG_UNDO) Log.d(TAG, "filter: skipping no-op");
+ return false;
+ }
+
+ return true;
+ }
}
/**
@@ -4618,6 +4673,7 @@
private static final int TYPE_REPLACE = 2;
private int mType;
+ private boolean mForceMerge;
private String mOldText;
private int mOldTextStart;
private String mNewText;
@@ -4629,10 +4685,12 @@
/**
* Constructs an edit operation from a text input operation that replaces the range
* (dstart, dend) of dest with (start, end) of source. See {@link InputFilter#filter}.
+ * If forceMerge is true then always forcibly merge this operation with any previous one.
*/
- public EditOperation(Editor editor, CharSequence source, int start, int end,
- Spanned dest, int dstart, int dend) {
+ public EditOperation(Editor editor, boolean forceMerge,
+ CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
super(editor.mUndoOwner);
+ mForceMerge = forceMerge;
mOldText = dest.subSequence(dstart, dend).toString();
mNewText = source.subSequence(start, end).toString();
@@ -4660,6 +4718,7 @@
public EditOperation(Parcel src, ClassLoader loader) {
super(src, loader);
mType = src.readInt();
+ mForceMerge = src.readInt() != 0;
mOldText = src.readString();
mOldTextStart = src.readInt();
mNewText = src.readString();
@@ -4671,6 +4730,7 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mType);
+ dest.writeInt(mForceMerge ? 1 : 0);
dest.writeString(mOldText);
dest.writeInt(mOldTextStart);
dest.writeString(mNewText);
@@ -4679,6 +4739,14 @@
dest.writeInt(mNewCursorPos);
}
+ private int getNewTextEnd() {
+ return mNewTextStart + mNewText.length();
+ }
+
+ private int getOldTextEnd() {
+ return mOldTextStart + mOldText.length();
+ }
+
@Override
public void commit() {
}
@@ -4687,14 +4755,20 @@
public void undo() {
if (DEBUG_UNDO) Log.d(TAG, "undo");
// Remove the new text and insert the old.
- modifyText(mNewTextStart, getNewTextEnd(), mOldText, mOldTextStart, mOldCursorPos);
+ Editor editor = getOwnerData();
+ Editable text = (Editable) editor.mTextView.getText();
+ modifyText(text, mNewTextStart, getNewTextEnd(), mOldText, mOldTextStart,
+ mOldCursorPos);
}
@Override
public void redo() {
if (DEBUG_UNDO) Log.d(TAG, "redo");
// Remove the old text and insert the new.
- modifyText(mOldTextStart, getOldTextEnd(), mNewText, mNewTextStart, mNewCursorPos);
+ Editor editor = getOwnerData();
+ Editable text = (Editable) editor.mTextView.getText();
+ modifyText(text, mOldTextStart, getOldTextEnd(), mNewText, mNewTextStart,
+ mNewCursorPos);
}
/**
@@ -4704,6 +4778,14 @@
* object unchanged.
*/
private boolean mergeWith(EditOperation edit) {
+ if (DEBUG_UNDO) {
+ Log.d(TAG, "mergeWith old " + this);
+ Log.d(TAG, "mergeWith new " + edit);
+ }
+ if (edit.mForceMerge) {
+ forceMergeWith(edit);
+ return true;
+ }
switch (mType) {
case TYPE_INSERT:
return mergeInsertWith(edit);
@@ -4717,7 +4799,6 @@
}
private boolean mergeInsertWith(EditOperation edit) {
- if (DEBUG_UNDO) Log.d(TAG, "mergeInsertWith " + edit);
// Only merge continuous insertions.
if (edit.mType != TYPE_INSERT) {
return false;
@@ -4733,7 +4814,6 @@
// TODO: Support forward delete.
private boolean mergeDeleteWith(EditOperation edit) {
- if (DEBUG_UNDO) Log.d(TAG, "mergeDeleteWith " + edit);
// Only merge continuous deletes.
if (edit.mType != TYPE_DELETE) {
return false;
@@ -4749,11 +4829,8 @@
}
private boolean mergeReplaceWith(EditOperation edit) {
- if (DEBUG_UNDO) Log.d(TAG, "mergeReplaceWith " + edit);
- // Replacements can merge only with adjacent inserts and adjacent replacements.
- if (edit.mType == TYPE_DELETE ||
- getNewTextEnd() != edit.mOldTextStart ||
- edit.mOldTextStart != edit.mNewTextStart) {
+ // Replacements can merge only with adjacent inserts.
+ if (edit.mType != TYPE_INSERT || getNewTextEnd() != edit.mNewTextStart) {
return false;
}
mOldText += edit.mOldText;
@@ -4762,18 +4839,42 @@
return true;
}
- private int getNewTextEnd() {
- return mNewTextStart + mNewText.length();
- }
-
- private int getOldTextEnd() {
- return mOldTextStart + mOldText.length();
- }
-
- private void modifyText(int deleteFrom, int deleteTo, CharSequence newText,
- int newTextInsertAt, int newCursorPos) {
+ /**
+ * Forcibly creates a single merged edit operation by simulating the entire text
+ * contents being replaced.
+ */
+ private void forceMergeWith(EditOperation edit) {
+ if (DEBUG_UNDO) Log.d(TAG, "forceMerge");
Editor editor = getOwnerData();
- Editable text = (Editable) editor.mTextView.getText();
+
+ // Copy the text of the current field.
+ // NOTE: Using StringBuilder instead of SpannableStringBuilder would be somewhat faster,
+ // but would require two parallel implementations of modifyText() because Editable and
+ // StringBuilder do not share an interface for replace/delete/insert.
+ Editable editable = (Editable) editor.mTextView.getText();
+ Editable originalText = new SpannableStringBuilder(editable.toString());
+
+ // Roll back the last operation.
+ modifyText(originalText, mNewTextStart, getNewTextEnd(), mOldText, mOldTextStart,
+ mOldCursorPos);
+
+ // Clone the text again and apply the new operation.
+ Editable finalText = new SpannableStringBuilder(editable.toString());
+ modifyText(finalText, edit.mOldTextStart, edit.getOldTextEnd(), edit.mNewText,
+ edit.mNewTextStart, edit.mNewCursorPos);
+
+ // Convert this operation into a non-mergeable replacement of the entire string.
+ mType = TYPE_REPLACE;
+ mNewText = finalText.toString();
+ mNewTextStart = 0;
+ mOldText = originalText.toString();
+ mOldTextStart = 0;
+ mNewCursorPos = edit.mNewCursorPos;
+ // mOldCursorPos is unchanged.
+ }
+
+ private static void modifyText(Editable text, int deleteFrom, int deleteTo,
+ CharSequence newText, int newTextInsertAt, int newCursorPos) {
// Apply the edit if it is still valid.
if (isValidRange(text, deleteFrom, deleteTo) &&
newTextInsertAt <= text.length() - (deleteTo - deleteFrom)) {
@@ -4791,10 +4892,22 @@
}
}
+ private String getTypeString() {
+ switch (mType) {
+ case TYPE_INSERT:
+ return "insert";
+ case TYPE_DELETE:
+ return "delete";
+ case TYPE_REPLACE:
+ return "replace";
+ default:
+ return "";
+ }
+ }
+
@Override
public String toString() {
- return "EditOperation: [" +
- "mType=" + mType + ", " +
+ return "[mType=" + getTypeString() + ", " +
"mOldText=" + mOldText + ", " +
"mOldTextStart=" + mOldTextStart + ", " +
"mNewText=" + mNewText + ", " +
diff --git a/core/java/android/widget/GridLayout.java b/core/java/android/widget/GridLayout.java
index e8fe191..c748e00 100644
--- a/core/java/android/widget/GridLayout.java
+++ b/core/java/android/widget/GridLayout.java
@@ -141,7 +141,9 @@
* view was alone in a column, that column would itself collapse to zero width if and only if
* no gravity was defined on the view. If gravity was defined, then the gone-marked
* view has no effect on the layout and the container should be laid out as if the view
- * had never been added to it.
+ * had never been added to it. GONE views are taken to have zero weight during excess space
+ * distribution.
+ * <p>
* These statements apply equally to rows as well as columns, and to groups of rows or columns.
*
* <p>
@@ -1015,7 +1017,7 @@
} else {
boolean horizontal = (mOrientation == HORIZONTAL);
Spec spec = horizontal ? lp.columnSpec : lp.rowSpec;
- if (spec.alignment == FILL) {
+ if (spec.getAbsoluteAlignment(horizontal) == FILL) {
Interval span = spec.span;
Axis axis = horizontal ? mHorizontalAxis : mVerticalAxis;
int[] locations = axis.getLocations();
@@ -1091,11 +1093,6 @@
invalidateValues();
}
- final Alignment getAlignment(Alignment alignment, boolean horizontal) {
- return (alignment != UNDEFINED_ALIGNMENT) ? alignment :
- (horizontal ? START : BASELINE);
- }
-
// Layout container
/**
@@ -1150,8 +1147,8 @@
int pWidth = getMeasurement(c, true);
int pHeight = getMeasurement(c, false);
- Alignment hAlign = getAlignment(columnSpec.alignment, true);
- Alignment vAlign = getAlignment(rowSpec.alignment, false);
+ Alignment hAlign = columnSpec.getAbsoluteAlignment(true);
+ Alignment vAlign = rowSpec.getAbsoluteAlignment(false);
Bounds boundsX = mHorizontalAxis.getGroupBounds().getValue(i);
Bounds boundsY = mVerticalAxis.getGroupBounds().getValue(i);
@@ -1297,7 +1294,7 @@
// we must include views that are GONE here, see introductory javadoc
LayoutParams lp = getLayoutParams(c);
Spec spec = horizontal ? lp.columnSpec : lp.rowSpec;
- Bounds bounds = getAlignment(spec.alignment, horizontal).getBounds();
+ Bounds bounds = spec.getAbsoluteAlignment(horizontal).getBounds();
assoc.put(spec, bounds);
}
return assoc.pack();
@@ -1703,7 +1700,11 @@
private boolean computeHasWeights() {
for (int i = 0, N = getChildCount(); i < N; i++) {
- LayoutParams lp = getLayoutParams(getChildAt(i));
+ final View child = getChildAt(i);
+ if (child.getVisibility() == View.GONE) {
+ continue;
+ }
+ LayoutParams lp = getLayoutParams(child);
Spec spec = horizontal ? lp.columnSpec : lp.rowSpec;
if (spec.weight != 0) {
return true;
@@ -1743,7 +1744,10 @@
private void shareOutDelta(int totalDelta, float totalWeight) {
Arrays.fill(deltas, 0);
for (int i = 0, N = getChildCount(); i < N; i++) {
- View c = getChildAt(i);
+ final View c = getChildAt(i);
+ if (c.getVisibility() == View.GONE) {
+ continue;
+ }
LayoutParams lp = getLayoutParams(c);
Spec spec = horizontal ? lp.columnSpec : lp.rowSpec;
float weight = spec.weight;
@@ -1796,6 +1800,9 @@
float totalWeight = 0f;
for (int i = 0, N = getChildCount(); i < N; i++) {
View c = getChildAt(i);
+ if (c.getVisibility() == View.GONE) {
+ continue;
+ }
LayoutParams lp = getLayoutParams(c);
Spec spec = horizontal ? lp.columnSpec : lp.rowSpec;
totalWeight += spec.weight;
@@ -2011,7 +2018,6 @@
R.styleable.ViewGroup_MarginLayout_layout_marginRight;
private static final int BOTTOM_MARGIN =
R.styleable.ViewGroup_MarginLayout_layout_marginBottom;
-
private static final int COLUMN = R.styleable.GridLayout_Layout_layout_column;
private static final int COLUMN_SPAN = R.styleable.GridLayout_Layout_layout_columnSpan;
private static final int COLUMN_WEIGHT = R.styleable.GridLayout_Layout_layout_columnWeight;
@@ -2405,7 +2411,7 @@
protected final void include(GridLayout gl, View c, Spec spec, Axis axis, int size) {
this.flexibility &= spec.getFlexibility();
boolean horizontal = axis.horizontal;
- Alignment alignment = gl.getAlignment(spec.alignment, horizontal);
+ Alignment alignment = spec.getAbsoluteAlignment(axis.horizontal);
// todo test this works correctly when the returned value is UNDEFINED
int before = alignment.getAlignmentValue(c, size, gl.getLayoutMode());
include(before, size - before);
@@ -2556,6 +2562,16 @@
this(startDefined, new Interval(start, start + size), alignment, weight);
}
+ private Alignment getAbsoluteAlignment(boolean horizontal) {
+ if (alignment != UNDEFINED_ALIGNMENT) {
+ return alignment;
+ }
+ if (weight == 0f) {
+ return horizontal ? START : BASELINE;
+ }
+ return FILL;
+ }
+
final Spec copyWriteSpan(Interval span) {
return new Spec(startDefined, span, alignment, weight);
}
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 9bef1fe..7396fb7 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -4119,6 +4119,7 @@
if (type == BufferType.EDITABLE || getKeyListener() != null ||
needEditableForNotification) {
createEditorIfNeeded();
+ mEditor.forgetUndoRedo();
Editable t = mEditableFactory.newEditable(text);
text = t;
setFilters(t, mFilters);
diff --git a/core/java/com/android/internal/backup/LocalTransport.java b/core/java/com/android/internal/backup/LocalTransport.java
index c3cc60a..fb0ffb0 100644
--- a/core/java/com/android/internal/backup/LocalTransport.java
+++ b/core/java/com/android/internal/backup/LocalTransport.java
@@ -369,6 +369,9 @@
return TRANSPORT_ERROR;
}
}
+ if (DEBUG) {
+ Log.v(TAG, " stored " + numBytes + " of data");
+ }
return TRANSPORT_OK;
}
@@ -431,6 +434,10 @@
@Override
public RestoreDescription nextRestorePackage() {
+ if (DEBUG) {
+ Log.v(TAG, "nextRestorePackage() : mRestorePackage=" + mRestorePackage
+ + " length=" + mRestorePackages.length);
+ }
if (mRestorePackages == null) throw new IllegalStateException("startRestore not called");
boolean found = false;
@@ -441,7 +448,10 @@
// skip packages where we have a data dir but no actual contents
String[] contents = (new File(mRestoreSetIncrementalDir, name)).list();
if (contents != null && contents.length > 0) {
- if (DEBUG) Log.v(TAG, " nextRestorePackage(TYPE_KEY_VALUE) = " + name);
+ if (DEBUG) {
+ Log.v(TAG, " nextRestorePackage(TYPE_KEY_VALUE) @ "
+ + mRestorePackage + " = " + name);
+ }
mRestoreType = RestoreDescription.TYPE_KEY_VALUE;
found = true;
}
@@ -450,7 +460,10 @@
// No key/value data; check for [non-empty] full data
File maybeFullData = new File(mRestoreSetFullDir, name);
if (maybeFullData.length() > 0) {
- if (DEBUG) Log.v(TAG, " nextRestorePackage(TYPE_FULL_STREAM) = " + name);
+ if (DEBUG) {
+ Log.v(TAG, " nextRestorePackage(TYPE_FULL_STREAM) @ "
+ + mRestorePackage + " = " + name);
+ }
mRestoreType = RestoreDescription.TYPE_FULL_STREAM;
mCurFullRestoreStream = null; // ensure starting from the ground state
found = true;
@@ -460,6 +473,11 @@
if (found) {
return new RestoreDescription(name, mRestoreType);
}
+
+ if (DEBUG) {
+ Log.v(TAG, " ... package @ " + mRestorePackage + " = " + name
+ + " has no data; skipping");
+ }
}
if (DEBUG) Log.v(TAG, " no more packages to restore");
diff --git a/core/java/com/android/internal/transition/EpicenterClipReveal.java b/core/java/com/android/internal/transition/EpicenterClipReveal.java
index d8a7f16..abb50c1 100644
--- a/core/java/com/android/internal/transition/EpicenterClipReveal.java
+++ b/core/java/com/android/internal/transition/EpicenterClipReveal.java
@@ -16,6 +16,7 @@
package com.android.internal.transition;
import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.RectEvaluator;
import android.content.Context;
@@ -75,13 +76,13 @@
return null;
}
- final Rect start = getEpicenter();
final Rect end = getBestRect(endValues);
+ final Rect start = getEpicenterOrCenter(end);
// Prepare the view.
view.setClipBounds(start);
- return createRectAnimator(view, start, end);
+ return createRectAnimator(view, start, end, endValues);
}
@Override
@@ -92,12 +93,23 @@
}
final Rect start = getBestRect(startValues);
- final Rect end = getEpicenter();
+ final Rect end = getEpicenterOrCenter(start);
// Prepare the view.
view.setClipBounds(start);
- return createRectAnimator(view, start, end);
+ return createRectAnimator(view, start, end, endValues);
+ }
+
+ private Rect getEpicenterOrCenter(Rect bestRect) {
+ final Rect epicenter = getEpicenter();
+ if (epicenter != null) {
+ return epicenter;
+ }
+
+ int centerX = bestRect.centerX();
+ int centerY = bestRect.centerY();
+ return new Rect(centerX, centerY, centerX, centerY);
}
private Rect getBestRect(TransitionValues values) {
@@ -108,8 +120,17 @@
return clipRect;
}
- private Animator createRectAnimator(View view, Rect start, Rect end) {
+ private Animator createRectAnimator(final View view, Rect start, Rect end,
+ TransitionValues endValues) {
+ final Rect terminalClip = (Rect) endValues.values.get(PROPNAME_CLIP);
final RectEvaluator evaluator = new RectEvaluator(new Rect());
- return ObjectAnimator.ofObject(view, "clipBounds", evaluator, start, end);
+ ObjectAnimator anim = ObjectAnimator.ofObject(view, "clipBounds", evaluator, start, end);
+ anim.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ view.setClipBounds(terminalClip);
+ }
+ });
+ return anim;
}
}
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index 28f1a3a..97744ea 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -147,7 +147,7 @@
android_hardware_location_ActivityRecognitionHardware.cpp \
android_util_FileObserver.cpp \
android/opengl/poly_clip.cpp.arm \
- android/opengl/util.cpp.arm \
+ android/opengl/util.cpp \
android_server_FingerprintManager.cpp \
android_server_NetworkManagementSocketTagger.cpp \
android_server_Watchdog.cpp \
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 672008d..6a50b52 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -41,7 +41,6 @@
jfieldID gOptions_mCancelID;
jfieldID gOptions_bitmapFieldID;
-jfieldID gBitmap_nativeBitmapFieldID;
jfieldID gBitmap_ninePatchInsetsFieldID;
jclass gInsetStruct_class;
@@ -262,7 +261,7 @@
SkBitmap* outputBitmap = NULL;
unsigned int existingBufferSize = 0;
if (javaBitmap != NULL) {
- outputBitmap = (SkBitmap*) env->GetLongField(javaBitmap, gBitmap_nativeBitmapFieldID);
+ outputBitmap = GraphicsJNI::getSkBitmap(env, javaBitmap);
if (outputBitmap->isImmutable()) {
ALOGW("Unable to reuse an immutable bitmap as an image decoder target.");
javaBitmap = NULL;
@@ -601,7 +600,6 @@
gOptions_mCancelID = GetFieldIDOrDie(env, options_class, "mCancel", "Z");
jclass bitmap_class = FindClassOrDie(env, "android/graphics/Bitmap");
- gBitmap_nativeBitmapFieldID = GetFieldIDOrDie(env, bitmap_class, "mNativeBitmap", "J");
gBitmap_ninePatchInsetsFieldID = GetFieldIDOrDie(env, bitmap_class, "mNinePatchInsets",
"Landroid/graphics/NinePatch$InsetStruct;");
diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp
index 90a7f69..04afe3e 100644
--- a/core/jni/android/graphics/BitmapRegionDecoder.cpp
+++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp
@@ -213,7 +213,7 @@
if (tileBitmap != NULL) {
// Re-use bitmap.
- bitmap = GraphicsJNI::getNativeBitmap(env, tileBitmap);
+ bitmap = GraphicsJNI::getSkBitmap(env, tileBitmap);
}
if (bitmap == NULL) {
bitmap = new SkBitmap;
diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp
index dde1393..0747969 100644
--- a/core/jni/android/graphics/Graphics.cpp
+++ b/core/jni/android/graphics/Graphics.cpp
@@ -154,7 +154,7 @@
static jfieldID gPointF_yFieldID;
static jclass gBitmap_class;
-static jfieldID gBitmap_nativeInstanceID;
+static jfieldID gBitmap_skBitmapPtr;
static jmethodID gBitmap_constructorMethodID;
static jmethodID gBitmap_reinitMethodID;
static jmethodID gBitmap_getAllocationByteCountMethodID;
@@ -338,11 +338,11 @@
return static_cast<SkColorType>(gConfig2ColorType[legacyConfig]);
}
-SkBitmap* GraphicsJNI::getNativeBitmap(JNIEnv* env, jobject bitmap) {
+SkBitmap* GraphicsJNI::getSkBitmap(JNIEnv* env, jobject bitmap) {
SkASSERT(env);
SkASSERT(bitmap);
SkASSERT(env->IsInstanceOf(bitmap, gBitmap_class));
- jlong bitmapHandle = env->GetLongField(bitmap, gBitmap_nativeInstanceID);
+ jlong bitmapHandle = env->GetLongField(bitmap, gBitmap_skBitmapPtr);
SkBitmap* b = reinterpret_cast<SkBitmap*>(bitmapHandle);
SkASSERT(b);
return b;
@@ -676,7 +676,7 @@
gPointF_yFieldID = getFieldIDCheck(env, gPointF_class, "y", "F");
gBitmap_class = make_globalref(env, "android/graphics/Bitmap");
- gBitmap_nativeInstanceID = getFieldIDCheck(env, gBitmap_class, "mNativeBitmap", "J");
+ gBitmap_skBitmapPtr = getFieldIDCheck(env, gBitmap_class, "mSkBitmapPtr", "J");
gBitmap_constructorMethodID = env->GetMethodID(gBitmap_class, "<init>", "(J[BIIIZZ[BLandroid/graphics/NinePatch$InsetStruct;)V");
gBitmap_reinitMethodID = env->GetMethodID(gBitmap_class, "reinit", "(IIZ)V");
gBitmap_getAllocationByteCountMethodID = env->GetMethodID(gBitmap_class, "getAllocationByteCount", "()I");
diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h
index a202c38..422d3f1 100644
--- a/core/jni/android/graphics/GraphicsJNI.h
+++ b/core/jni/android/graphics/GraphicsJNI.h
@@ -48,7 +48,7 @@
static void point_to_jpointf(const SkPoint& point, JNIEnv*, jobject jpointf);
static SkCanvas* getNativeCanvas(JNIEnv*, jobject canvas);
- static SkBitmap* getNativeBitmap(JNIEnv*, jobject bitmap);
+ static SkBitmap* getSkBitmap(JNIEnv*, jobject bitmap);
static SkRegion* getNativeRegion(JNIEnv*, jobject region);
// Given the 'native' long held by the Rasterizer.java object, return a
diff --git a/core/jni/android/opengl/util.cpp b/core/jni/android/opengl/util.cpp
index 461507f..5c2d0d0 100644
--- a/core/jni/android/opengl/util.cpp
+++ b/core/jni/android/opengl/util.cpp
@@ -16,6 +16,7 @@
#include "jni.h"
#include "JNIHelp.h"
+#include "GraphicsJNI.h"
#include <math.h>
#include <stdio.h>
@@ -149,10 +150,6 @@
return result;
}
-static void doThrowIAE(JNIEnv* env, const char* msg) {
- jniThrowException(env, "java/lang/IllegalArgumentException", msg);
-}
-
template<class JArray, class T>
class ArrayHelper {
public:
@@ -548,14 +545,6 @@
// ---------------------------------------------------------------------------
-static jfieldID nativeBitmapID = 0;
-
-void nativeUtilsClassInit(JNIEnv *env, jclass clazz)
-{
- jclass bitmapClass = env->FindClass("android/graphics/Bitmap");
- nativeBitmapID = env->GetFieldID(bitmapClass, "mNativeBitmap", "J");
-}
-
extern void setGLDebugLevel(int level);
void setTracingLevel(JNIEnv *env, jclass clazz, jint level)
{
@@ -629,16 +618,14 @@
static jint util_getInternalFormat(JNIEnv *env, jclass clazz,
jobject jbitmap)
{
- SkBitmap const * nativeBitmap =
- (SkBitmap const *)env->GetLongField(jbitmap, nativeBitmapID);
+ SkBitmap const * nativeBitmap = GraphicsJNI::getSkBitmap(env, jbitmap);
return getInternalFormat(nativeBitmap->colorType());
}
static jint util_getType(JNIEnv *env, jclass clazz,
jobject jbitmap)
{
- SkBitmap const * nativeBitmap =
- (SkBitmap const *)env->GetLongField(jbitmap, nativeBitmapID);
+ SkBitmap const * nativeBitmap = GraphicsJNI::getSkBitmap(env, jbitmap);
return getType(nativeBitmap->colorType());
}
@@ -646,8 +633,7 @@
jint target, jint level, jint internalformat,
jobject jbitmap, jint type, jint border)
{
- SkBitmap const * nativeBitmap =
- (SkBitmap const *)env->GetLongField(jbitmap, nativeBitmapID);
+ SkBitmap const * nativeBitmap = GraphicsJNI::getSkBitmap(env, jbitmap);
const SkBitmap& bitmap(*nativeBitmap);
SkColorType colorType = bitmap.colorType();
if (internalformat < 0) {
@@ -694,8 +680,7 @@
jint target, jint level, jint xoffset, jint yoffset,
jobject jbitmap, jint format, jint type)
{
- SkBitmap const * nativeBitmap =
- (SkBitmap const *)env->GetLongField(jbitmap, nativeBitmapID);
+ SkBitmap const * nativeBitmap = GraphicsJNI::getSkBitmap(env, jbitmap);
const SkBitmap& bitmap(*nativeBitmap);
SkColorType colorType = bitmap.colorType();
if (format < 0) {
@@ -1014,7 +999,6 @@
};
static JNINativeMethod gUtilsMethods[] = {
- {"nativeClassInit", "()V", (void*)nativeUtilsClassInit },
{ "native_getInternalFormat", "(Landroid/graphics/Bitmap;)I", (void*) util_getInternalFormat },
{ "native_getType", "(Landroid/graphics/Bitmap;)I", (void*) util_getType },
{ "native_texImage2D", "(IIILandroid/graphics/Bitmap;II)I", (void*)util_texImage2D },
diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp
index f14e89e..c337a9f 100644
--- a/core/jni/android_graphics_Canvas.cpp
+++ b/core/jni/android_graphics_Canvas.cpp
@@ -21,7 +21,6 @@
#include <Canvas.h>
#include "SkDrawFilter.h"
#include "SkGraphics.h"
-#include "SkPorterDuff.h"
#include "Paint.h"
#include "TypefaceImpl.h"
diff --git a/core/jni/android_text_StaticLayout.cpp b/core/jni/android_text_StaticLayout.cpp
index db73e69..a6f19b1 100644
--- a/core/jni/android_text_StaticLayout.cpp
+++ b/core/jni/android_text_StaticLayout.cpp
@@ -29,6 +29,7 @@
#include <list>
#include <algorithm>
+
namespace android {
struct JLineBreaksID {
@@ -40,6 +41,53 @@
static jclass gLineBreaks_class;
static JLineBreaksID gLineBreaks_fieldID;
+class Builder {
+ public:
+ ~Builder() {
+ utext_close(&mUText);
+ delete mBreakIterator;
+ }
+
+ void setLocale(const Locale& locale) {
+ delete mBreakIterator;
+ UErrorCode status = U_ZERO_ERROR;
+ mBreakIterator = BreakIterator::createLineInstance(locale, status);
+ // TODO: check status
+ }
+
+ void resize(size_t size) {
+ mTextBuf.resize(size);
+ }
+
+ uint16_t* buffer() {
+ return mTextBuf.data();
+ }
+
+ // set text to current contents of buffer
+ void setText() {
+ UErrorCode status = U_ZERO_ERROR;
+ utext_openUChars(&mUText, mTextBuf.data(), mTextBuf.size(), &status);
+ mBreakIterator->setText(&mUText, status);
+ }
+
+ void finish() {
+ if (mTextBuf.size() > MAX_TEXT_BUF_RETAIN) {
+ mTextBuf.clear();
+ mTextBuf.shrink_to_fit();
+ }
+ }
+
+ BreakIterator* breakIterator() const {
+ return mBreakIterator;
+ }
+
+ private:
+ const size_t MAX_TEXT_BUF_RETAIN = 32678;
+ BreakIterator* mBreakIterator = nullptr;
+ UText mUText = UTEXT_INITIALIZER;
+ std::vector<uint16_t>mTextBuf;
+};
+
static const int CHAR_SPACE = 0x20;
static const int CHAR_TAB = 0x09;
static const int CHAR_NEWLINE = 0x0a;
@@ -50,7 +98,7 @@
// specified stops must be a sorted array (allowed to be null)
TabStops(JNIEnv* env, jintArray stops, jint defaultTabWidth) :
mStops(env), mTabWidth(defaultTabWidth) {
- if (stops != NULL) {
+ if (stops != nullptr) {
mStops.reset(stops);
mNumStops = mStops.size();
} else {
@@ -430,37 +478,6 @@
}
};
-class ScopedBreakIterator {
- public:
- ScopedBreakIterator(JNIEnv* env, BreakIterator* breakIterator, const jchar* inputText,
- jint length) : mBreakIterator(breakIterator), mChars(inputText) {
- UErrorCode status = U_ZERO_ERROR;
- mUText = utext_openUChars(NULL, mChars, length, &status);
- if (mUText == NULL) {
- return;
- }
-
- mBreakIterator->setText(mUText, status);
- }
-
- inline BreakIterator* operator->() {
- return mBreakIterator;
- }
-
- ~ScopedBreakIterator() {
- utext_close(mUText);
- delete mBreakIterator;
- }
- private:
- BreakIterator* mBreakIterator;
- const jchar* mChars;
- UText* mUText;
-
- // disable copying and assignment
- ScopedBreakIterator(const ScopedBreakIterator&);
- void operator=(const ScopedBreakIterator&);
-};
-
static jint recycleCopy(JNIEnv* env, jobject recycle, jintArray recycleBreaks,
jfloatArray recycleWidths, jbooleanArray recycleFlags,
jint recycleLength, const std::vector<jint>& breaks,
@@ -526,7 +543,7 @@
primitives->push_back(p);
}
-static jint nComputeLineBreaks(JNIEnv* env, jclass, jstring javaLocaleName,
+static jint nComputeLineBreaks(JNIEnv* env, jclass, jlong nativePtr,
jcharArray inputText, jfloatArray widths, jint length,
jfloat firstWidth, jint firstWidthLineLimit, jfloat restWidth,
jintArray variableTabStops, jint defaultTabStop, jboolean optimize,
@@ -535,29 +552,24 @@
jint recycleLength) {
std::vector<int> breaks;
- ScopedCharArrayRO textScopedArr(env, inputText);
+ Builder* b = reinterpret_cast<Builder*>(nativePtr);
+ b->resize(length);
+ env->GetCharArrayRegion(inputText, 0, length, b->buffer());
+ b->setText();
+
+ // TODO: this array access is pretty inefficient, but we'll replace it anyway
ScopedFloatArrayRO widthsScopedArr(env, widths);
- ScopedIcuLocale icuLocale(env, javaLocaleName);
- if (icuLocale.valid()) {
- UErrorCode status = U_ZERO_ERROR;
- BreakIterator* it = BreakIterator::createLineInstance(icuLocale.locale(), status);
- if (!U_SUCCESS(status) || it == NULL) {
- if (it) {
- delete it;
- }
- } else {
- ScopedBreakIterator breakIterator(env, it, textScopedArr.get(), length);
- int loc = breakIterator->first();
- while ((loc = breakIterator->next()) != BreakIterator::DONE) {
- breaks.push_back(loc);
- }
- }
+ BreakIterator* breakIterator = b->breakIterator();
+ int loc = breakIterator->first();
+ while ((loc = breakIterator->next()) != BreakIterator::DONE) {
+ breaks.push_back(loc);
}
+ // TODO: all these allocations can be moved into the builder
std::vector<Primitive> primitives;
TabStops tabStops(env, variableTabStops, defaultTabStop);
- computePrimitives(textScopedArr.get(), widthsScopedArr.get(), length, breaks, tabStops, &primitives);
+ computePrimitives(b->buffer(), widthsScopedArr.get(), length, breaks, tabStops, &primitives);
LineWidth lineWidth(firstWidth, firstWidthLineLimit, restWidth);
std::vector<int> computedBreaks;
@@ -571,13 +583,41 @@
GreedyLineBreaker breaker(primitives, lineWidth);
breaker.computeBreaks(&computedBreaks, &computedWidths, &computedFlags);
}
+ b->finish();
return recycleCopy(env, recycle, recycleBreaks, recycleWidths, recycleFlags, recycleLength,
computedBreaks, computedWidths, computedFlags);
}
+static jlong nNewBuilder(JNIEnv*, jclass) {
+ return reinterpret_cast<jlong>(new Builder);
+}
+
+static void nFreeBuilder(JNIEnv*, jclass, jlong nativePtr) {
+ delete reinterpret_cast<Builder*>(nativePtr);
+}
+
+static void nFinishBuilder(JNIEnv*, jclass, jlong nativePtr) {
+ Builder* b = reinterpret_cast<Builder*>(nativePtr);
+ b->finish();
+}
+
+static void nBuilderSetLocale(JNIEnv* env, jclass, jlong nativePtr, jstring javaLocaleName) {
+ ScopedIcuLocale icuLocale(env, javaLocaleName);
+ Builder* b = reinterpret_cast<Builder*>(nativePtr);
+
+ if (icuLocale.valid()) {
+ b->setLocale(icuLocale.locale());
+ }
+}
+
static JNINativeMethod gMethods[] = {
- {"nComputeLineBreaks", "(Ljava/lang/String;[C[FIFIF[IIZLandroid/text/StaticLayout$LineBreaks;[I[F[ZI)I", (void*) nComputeLineBreaks}
+ {"nNewBuilder", "()J", (void*) nNewBuilder},
+ {"nFreeBuilder", "(J)V", (void*) nFreeBuilder},
+ {"nFinishBuilder", "(J)V", (void*) nFinishBuilder},
+ {"nBuilderSetLocale", "(JLjava/lang/String;)V", (void*) nBuilderSetLocale},
+ {"nComputeLineBreaks", "(J[C[FIFIF[IIZLandroid/text/StaticLayout$LineBreaks;[I[F[ZI)I",
+ (void*) nComputeLineBreaks}
};
int register_android_text_StaticLayout(JNIEnv* env)
diff --git a/core/jni/android_view_PointerIcon.cpp b/core/jni/android_view_PointerIcon.cpp
index bbd031e..f6d9a1a 100644
--- a/core/jni/android_view_PointerIcon.cpp
+++ b/core/jni/android_view_PointerIcon.cpp
@@ -80,7 +80,7 @@
jobject bitmapObj = env->GetObjectField(loadedPointerIconObj, gPointerIconClassInfo.mBitmap);
if (bitmapObj) {
- SkBitmap* bitmap = GraphicsJNI::getNativeBitmap(env, bitmapObj);
+ SkBitmap* bitmap = GraphicsJNI::getSkBitmap(env, bitmapObj);
if (bitmap) {
outPointerIcon->bitmap = *bitmap; // use a shared pixel ref
}
diff --git a/core/jni/com_google_android_gles_jni_EGLImpl.cpp b/core/jni/com_google_android_gles_jni_EGLImpl.cpp
index 6c21bab..7080e2a 100644
--- a/core/jni/com_google_android_gles_jni_EGLImpl.cpp
+++ b/core/jni/com_google_android_gles_jni_EGLImpl.cpp
@@ -30,6 +30,7 @@
#include <gui/GLConsumer.h>
#include <gui/Surface.h>
+#include <GraphicsJNI.h>
#include <SkBitmap.h>
#include <SkPixelRef.h>
@@ -46,7 +47,6 @@
static jfieldID gSurface_EGLSurfaceFieldID;
static jfieldID gSurface_NativePixelRefFieldID;
static jfieldID gConfig_EGLConfigFieldID;
-static jfieldID gBitmap_NativeBitmapFieldID;
static inline EGLDisplay getDisplay(JNIEnv* env, jobject o) {
if (!o) return EGL_NO_DISPLAY;
@@ -85,9 +85,6 @@
jclass surface_class = _env->FindClass("com/google/android/gles_jni/EGLSurfaceImpl");
gSurface_EGLSurfaceFieldID = _env->GetFieldID(surface_class, "mEGLSurface", "J");
gSurface_NativePixelRefFieldID = _env->GetFieldID(surface_class, "mNativePixelRef", "J");
-
- jclass bitmap_class = _env->FindClass("android/graphics/Bitmap");
- gBitmap_NativeBitmapFieldID = _env->GetFieldID(bitmap_class, "mNativeBitmap", "J");
}
static const jint gNull_attrib_base[] = {EGL_NONE};
@@ -280,9 +277,7 @@
EGLConfig cnf = getConfig(_env, config);
jint* base = 0;
- SkBitmap const * nativeBitmap =
- (SkBitmap const *)_env->GetLongField(native_pixmap,
- gBitmap_NativeBitmapFieldID);
+ SkBitmap const * nativeBitmap = GraphicsJNI::getSkBitmap(_env, native_pixmap);
SkPixelRef* ref = nativeBitmap ? nativeBitmap->pixelRef() : 0;
if (ref == NULL) {
jniThrowException(_env, "java/lang/IllegalArgumentException", "Bitmap has no PixelRef");
diff --git a/docs/html/google/play-services/wallet.jd b/docs/html/google/play-services/wallet.jd
index 3d0c64a..744c8d3 100644
--- a/docs/html/google/play-services/wallet.jd
+++ b/docs/html/google/play-services/wallet.jd
@@ -17,14 +17,14 @@
available to US-based merchants. Once you've completed integration, you can
apply for production access by <a class="external-link" href="https://support.google.com/wallet/business/contact/ui_review">submitting your sandbox integration for review</a>.</p>
- <p>Check out the <a
+ <p>Check out the <a
href="{@docRoot}reference/com/google/android/gms/wallet/package-summary.html">Instant
Buy API reference</a> and visit
<a href="https://developers.google.com/wallet/instant-buy/">developers.google.com/wallet/instant-buy/</a>
for complete information about integrating Google Wallet Instant Buy into your app.</p>
</div>
-<div class="col-4">
+<div class="col-4">
<img src="{@docRoot}images/google/gps-wallet-instant.png" alt="" style="padding-bottom:14px;width:210px">
</div>
</div>
@@ -44,16 +44,16 @@
<h4>Streamline Purchases with Google+ Sign-On</h4>
<p>For users ready to purchase, you can simplify the login and account creation steps
by adding Google+ sign in. Users can sign in with a single click and share their
- profile information during the purchase.
+ profile information during the purchase.
<br />
<a href="https://developers.google.com/commerce/wallet/instant-buy/wallet-sso#android"
class="external-link">Add Google+ Sign-In for Wallet</a>.</p>
-
+
<h4>Minimize User Data Entry</h4>
<p>Google Wallet provides auto-completion of addresses, minimizing user data entry. You can also
retrieve billing and shipping addresses directly from the user’s Wallet to-do form pre-fills.<br />
<a class="external-link"
- href="{@docRoot}reference/com/google/android/gms/wallet/MaskedWallet#getBillingAddress()">Get
+ href="{@docRoot}reference/com/google/android/gms/wallet/MaskedWallet.html#getBillingAddress()">Get
billing addresses</a>.</p>
</div>
@@ -75,7 +75,7 @@
class="external-link" href="https://developers.google.com/wallet/instant-buy/android/tutorial">Instant Buy Android API tutorial</a>
provides directions on how to get the Wallet sample up and running.</p>
<h4>3. Read the documentation</h4>
- <p>For quick access while developing your Android apps, the <a
+ <p>For quick access while developing your Android apps, the <a
href="{@docRoot}reference/com/google/android/gms/wallet/package-summary.html">Google Wallet
API reference</a> is available here on developer.android.com.</p>
diff --git a/docs/html/guide/topics/connectivity/usb/host.jd b/docs/html/guide/topics/connectivity/usb/host.jd
index 355dd2d..f957b60 100644
--- a/docs/html/guide/topics/connectivity/usb/host.jd
+++ b/docs/html/guide/topics/connectivity/usb/host.jd
@@ -31,7 +31,7 @@
<li><a href="{@docRoot}resources/samples/USB/AdbTest/index.html">AdbTest</a></li>
<li><a href=
- "{@docRoot}resources/samples/USB/MissileLauncher/index.html">MissleLauncher</a></li>
+ "{@docRoot}resources/samples/USB/MissileLauncher/index.html">MissileLauncher</a></li>
</ol>
</div>
</div>
@@ -283,7 +283,7 @@
<h3 id="permission-d">Obtaining permission to communicate with a device</h3>
- <p>Before communicating with the USB device, your applicaton must have permission from your
+ <p>Before communicating with the USB device, your application must have permission from your
users.</p>
<p class="note"><strong>Note:</strong> If your application <a href="#using-intents">uses an
@@ -388,7 +388,7 @@
should have more logic to correctly find the correct interface and endpoints to communicate on
and also should do any transferring of data in a different thread than the main UI thread:</p>
<pre>
-private Byte[] bytes
+private Byte[] bytes;
private static int TIMEOUT = 0;
private boolean forceClaim = true;
@@ -409,7 +409,7 @@
<p>For more information, see the <a href=
"{@docRoot}resources/samples/USB/AdbTest/index.html">AdbTest sample</a>, which shows how to do
asynchronous bulk transfers, and the <a href=
- "{@docRoot}resources/samples/USB/MissileLauncher/index.html">MissleLauncher sample</a>, which
+ "{@docRoot}resources/samples/USB/MissileLauncher/index.html">MissileLauncher sample</a>, which
shows how to listen on an interrupt endpoint asynchronously.</p>
<h3 id="terminating-d">Terminating communication with a device</h3>
diff --git a/docs/html/tools/adk/adk.jd b/docs/html/tools/adk/adk.jd
index 7e75c11..3f45c3c 100644
--- a/docs/html/tools/adk/adk.jd
+++ b/docs/html/tools/adk/adk.jd
@@ -331,7 +331,7 @@
<li>Install the application to your device.</li>
<li>Connect the ADK board (USB-A) to your Android-powered device (micro-USB). Ensure that the
- power cable to the accessory is plugged in or that the micro-USB port on the accesory is
+ power cable to the accessory is plugged in or that the micro-USB port on the accessory is
connected to your computer for power (this also allows you to <a href="#monitoring">monitor the
ADK board</a>). When connected, accept the prompt that asks for whether or not to open the
DemoKit application to connect to the accessory. If the prompt does not show up, connect and
diff --git a/docs/html/tools/sdk/tools-notes.jd b/docs/html/tools/sdk/tools-notes.jd
index b5a6477..47b603a 100644
--- a/docs/html/tools/sdk/tools-notes.jd
+++ b/docs/html/tools/sdk/tools-notes.jd
@@ -24,7 +24,7 @@
<div class="toggle-content opened">
<p><a href="#" onclick="return toggleContent(this)">
<img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img"
- alt=""/>SDK Tools, Revision 24.1.2</a> <em>(February 2014)</em>
+ alt=""/>SDK Tools, Revision 24.1.2</a> <em>(February 2015)</em>
</p>
<div class="toggle-content-toggleme">
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index 132c6ef..5b20d48 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -21,6 +21,7 @@
import android.os.Parcelable;
import android.os.Trace;
import android.util.DisplayMetrics;
+
import dalvik.system.VMRuntime;
import java.io.OutputStream;
@@ -37,21 +38,14 @@
* @see Bitmap#setDensity(int)
*/
public static final int DENSITY_NONE = 0;
-
- /**
- * Note: mNativeBitmap is used by FaceDetector_jni.cpp
- * Don't change/rename without updating FaceDetector_jni.cpp
- *
- * @hide
- */
- public final long mNativeBitmap;
+
+ private final long mSkBitmapPtr;
/**
* Backing buffer for the Bitmap.
*/
private byte[] mBuffer;
- @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"}) // Keep to finalize native resources
private final BitmapFinalizer mFinalizer;
private final boolean mIsMutable;
@@ -92,11 +86,11 @@
sDefaultDensity = density;
}
+ @SuppressWarnings("deprecation")
static int getDefaultDensity() {
if (sDefaultDensity >= 0) {
return sDefaultDensity;
}
- //noinspection deprecation
sDefaultDensity = DisplayMetrics.DENSITY_DEVICE;
return sDefaultDensity;
}
@@ -105,7 +99,7 @@
* Private constructor that must received an already allocated native bitmap
* int (pointer).
*/
- @SuppressWarnings({"UnusedDeclaration"}) // called from JNI
+ // called from JNI
Bitmap(long nativeBitmap, byte[] buffer, int width, int height, int density,
boolean isMutable, boolean requestPremultiplied,
byte[] ninePatchChunk, NinePatch.InsetStruct ninePatchInsets) {
@@ -120,7 +114,7 @@
mBuffer = buffer;
// we delete this in our finalizer
- mNativeBitmap = nativeBitmap;
+ mSkBitmapPtr = nativeBitmap;
mNinePatchChunk = ninePatchChunk;
mNinePatchInsets = ninePatchInsets;
@@ -136,7 +130,7 @@
* Native bitmap has been reconfigured, so set premult and cached
* width/height values
*/
- @SuppressWarnings({"UnusedDeclaration"}) // called from JNI
+ // called from JNI
void reinit(int width, int height, boolean requestPremultiplied) {
mWidth = width;
mHeight = height;
@@ -227,7 +221,7 @@
throw new IllegalStateException("native-backed bitmaps may not be reconfigured");
}
- nativeReconfigure(mNativeBitmap, width, height, config.nativeInt, mBuffer.length,
+ nativeReconfigure(mSkBitmapPtr, width, height, config.nativeInt, mBuffer.length,
mRequestPremultiplied);
mWidth = width;
mHeight = height;
@@ -305,7 +299,7 @@
*/
public void recycle() {
if (!mRecycled && mFinalizer.mNativeBitmap != 0) {
- if (nativeRecycle(mNativeBitmap)) {
+ if (nativeRecycle(mSkBitmapPtr)) {
// return value indicates whether native pixel object was actually recycled.
// false indicates that it is still in use at the native level and these
// objects should not be collected now. They will be collected later when the
@@ -331,13 +325,13 @@
* Returns the generation ID of this bitmap. The generation ID changes
* whenever the bitmap is modified. This can be used as an efficient way to
* check if a bitmap has changed.
- *
+ *
* @return The current generation ID for this bitmap.
*/
public int getGenerationId() {
- return nativeGenerationId(mNativeBitmap);
+ return nativeGenerationId(mSkBitmapPtr);
}
-
+
/**
* This is called by methods that want to throw an exception if the bitmap
* has already been recycled.
@@ -399,12 +393,12 @@
* encoded: red is stored with 5 bits of precision (32 possible
* values), green is stored with 6 bits of precision (64 possible
* values) and blue is stored with 5 bits of precision.
- *
+ *
* This configuration can produce slight visual artifacts depending
* on the configuration of the source. For instance, without
* dithering, the result might show a greenish tint. To get better
* results dithering should be applied.
- *
+ *
* This configuration may be useful when using opaque bitmaps
* that do not require high color fidelity.
*/
@@ -414,18 +408,18 @@
* Each pixel is stored on 2 bytes. The three RGB color channels
* and the alpha channel (translucency) are stored with a 4 bits
* precision (16 possible values.)
- *
+ *
* This configuration is mostly useful if the application needs
* to store translucency information but also needs to save
* memory.
- *
+ *
* It is recommended to use {@link #ARGB_8888} instead of this
* configuration.
*
* Note: as of {@link android.os.Build.VERSION_CODES#KITKAT},
* any bitmap created with this configuration will be created
* using {@link #ARGB_8888} instead.
- *
+ *
* @deprecated Because of the poor quality of this configuration,
* it is advised to use {@link #ARGB_8888} instead.
*/
@@ -436,7 +430,7 @@
* Each pixel is stored on 4 bytes. Each channel (RGB and alpha
* for translucency) is stored with 8 bits of precision (256
* possible values.)
- *
+ *
* This configuration is very flexible and offers the best
* quality. It should be used whenever possible.
*/
@@ -444,11 +438,10 @@
final int nativeInt;
- @SuppressWarnings({"deprecation"})
private static Config sConfigs[] = {
null, ALPHA_8, null, RGB_565, ARGB_4444, ARGB_8888
};
-
+
Config(int ni) {
this.nativeInt = ni;
}
@@ -492,7 +485,7 @@
throw new RuntimeException("Buffer not large enough for pixels");
}
- nativeCopyPixelsToBuffer(mNativeBitmap, dst);
+ nativeCopyPixelsToBuffer(mSkBitmapPtr, dst);
// now update the buffer's position
int position = dst.position();
@@ -532,7 +525,7 @@
throw new RuntimeException("Buffer not large enough for pixels");
}
- nativeCopyPixelsFromBuffer(mNativeBitmap, src);
+ nativeCopyPixelsFromBuffer(mSkBitmapPtr, src);
// now update the buffer's position
int position = src.position();
@@ -554,7 +547,7 @@
*/
public Bitmap copy(Config config, boolean isMutable) {
checkRecycled("Can't copy a recycled bitmap");
- Bitmap b = nativeCopy(mNativeBitmap, config.nativeInt, isMutable);
+ Bitmap b = nativeCopy(mSkBitmapPtr, config.nativeInt, isMutable);
if (b != null) {
b.setPremultiplied(mRequestPremultiplied);
b.mDensity = mDensity;
@@ -564,7 +557,7 @@
/**
* Creates a new bitmap, scaled from an existing bitmap, when possible. If the
- * specified width and height are the same as the current width and height of
+ * specified width and height are the same as the current width and height of
* the source bitmap, the source bitmap is returned and no new bitmap is
* created.
*
@@ -639,7 +632,7 @@
* transformed by the optional matrix. The new bitmap may be the
* same object as source, or a copy may have been made. It is
* initialized with the same density as the original bitmap.
- *
+ *
* If the source bitmap is immutable and the requested subset is the
* same as the source bitmap itself, then the source bitmap is
* returned and no new bitmap is created.
@@ -781,8 +774,8 @@
* @param config The bitmap config to create.
* @param hasAlpha If the bitmap is ARGB_8888 this flag can be used to mark the
* bitmap as opaque. Doing so will clear the bitmap in black
- * instead of transparent.
- *
+ * instead of transparent.
+ *
* @throws IllegalArgumentException if the width or height are <= 0
*/
private static Bitmap createBitmap(int width, int height, Config config, boolean hasAlpha) {
@@ -800,8 +793,8 @@
* @param config The bitmap config to create.
* @param hasAlpha If the bitmap is ARGB_8888 this flag can be used to mark the
* bitmap as opaque. Doing so will clear the bitmap in black
- * instead of transparent.
- *
+ * instead of transparent.
+ *
* @throws IllegalArgumentException if the width or height are <= 0
*/
private static Bitmap createBitmap(DisplayMetrics display, int width, int height,
@@ -815,7 +808,7 @@
}
bm.setHasAlpha(hasAlpha);
if (config == Config.ARGB_8888 && !hasAlpha) {
- nativeErase(bm.mNativeBitmap, 0xff000000);
+ nativeErase(bm.mSkBitmapPtr, 0xff000000);
}
// No need to initialize the bitmap to zeroes with other configs;
// it is backed by a VM byte array which is by definition preinitialized
@@ -1005,7 +998,7 @@
throw new IllegalArgumentException("quality must be 0..100");
}
Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, "Bitmap.compress");
- boolean result = nativeCompress(mNativeBitmap, format.nativeInt, quality,
+ boolean result = nativeCompress(mSkBitmapPtr, format.nativeInt, quality,
stream, new byte[WORKING_COMPRESS_STORAGE]);
Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
return result;
@@ -1022,12 +1015,12 @@
* <p>Indicates whether pixels stored in this bitmaps are stored pre-multiplied.
* When a pixel is pre-multiplied, the RGB components have been multiplied by
* the alpha component. For instance, if the original color is a 50%
- * translucent red <code>(128, 255, 0, 0)</code>, the pre-multiplied form is
+ * translucent red <code>(128, 255, 0, 0)</code>, the pre-multiplied form is
* <code>(128, 128, 0, 0)</code>.</p>
- *
+ *
* <p>This method always returns false if {@link #getConfig()} is
* {@link Bitmap.Config#RGB_565}.</p>
- *
+ *
* <p>The return value is undefined if {@link #getConfig()} is
* {@link Bitmap.Config#ALPHA_8}.</p>
*
@@ -1046,7 +1039,7 @@
* @see BitmapFactory.Options#inPremultiplied
*/
public final boolean isPremultiplied() {
- return nativeIsPremultiplied(mNativeBitmap);
+ return nativeIsPremultiplied(mSkBitmapPtr);
}
/**
@@ -1071,7 +1064,7 @@
*/
public final void setPremultiplied(boolean premultiplied) {
mRequestPremultiplied = premultiplied;
- nativeSetPremultiplied(mNativeBitmap, premultiplied);
+ nativeSetPremultiplied(mSkBitmapPtr, premultiplied);
}
/** Returns the bitmap's width */
@@ -1137,7 +1130,7 @@
public int getScaledHeight(int targetDensity) {
return scaleFromDensity(getHeight(), mDensity, targetDensity);
}
-
+
/**
* @hide
*/
@@ -1145,11 +1138,11 @@
if (sdensity == DENSITY_NONE || tdensity == DENSITY_NONE || sdensity == tdensity) {
return size;
}
-
+
// Scale by tdensity / sdensity, rounding up.
return ((size * tdensity) + (sdensity >> 1)) / sdensity;
}
-
+
/**
* Return the number of bytes between rows in the bitmap's pixels. Note that
* this refers to the pixels as stored natively by the bitmap. If you call
@@ -1163,7 +1156,7 @@
* @return number of bytes between rows of the native bitmap pixels.
*/
public final int getRowBytes() {
- return nativeRowBytes(mNativeBitmap);
+ return nativeRowBytes(mSkBitmapPtr);
}
/**
@@ -1206,7 +1199,7 @@
* that config, otherwise return null.
*/
public final Config getConfig() {
- return Config.nativeToConfig(nativeConfig(mNativeBitmap));
+ return Config.nativeToConfig(nativeConfig(mSkBitmapPtr));
}
/** Returns true if the bitmap's config supports per-pixel alpha, and
@@ -1218,7 +1211,7 @@
* it will return true by default.
*/
public final boolean hasAlpha() {
- return nativeHasAlpha(mNativeBitmap);
+ return nativeHasAlpha(mSkBitmapPtr);
}
/**
@@ -1232,28 +1225,28 @@
* non-opaque per-pixel alpha values.
*/
public void setHasAlpha(boolean hasAlpha) {
- nativeSetHasAlpha(mNativeBitmap, hasAlpha, mRequestPremultiplied);
+ nativeSetHasAlpha(mSkBitmapPtr, hasAlpha, mRequestPremultiplied);
}
/**
* Indicates whether the renderer responsible for drawing this
* bitmap should attempt to use mipmaps when this bitmap is drawn
* scaled down.
- *
+ *
* If you know that you are going to draw this bitmap at less than
* 50% of its original size, you may be able to obtain a higher
* quality
- *
+ *
* This property is only a suggestion that can be ignored by the
* renderer. It is not guaranteed to have any effect.
- *
+ *
* @return true if the renderer should attempt to use mipmaps,
* false otherwise
- *
+ *
* @see #setHasMipMap(boolean)
*/
public final boolean hasMipMap() {
- return nativeHasMipMap(mNativeBitmap);
+ return nativeHasMipMap(mSkBitmapPtr);
}
/**
@@ -1264,7 +1257,7 @@
* If you know that you are going to draw this bitmap at less than
* 50% of its original size, you may be able to obtain a higher
* quality by turning this property on.
- *
+ *
* Note that if the renderer respects this hint it might have to
* allocate extra memory to hold the mipmap levels for this bitmap.
*
@@ -1277,7 +1270,7 @@
* @see #hasMipMap()
*/
public final void setHasMipMap(boolean hasMipMap) {
- nativeSetHasMipMap(mNativeBitmap, hasMipMap);
+ nativeSetHasMipMap(mSkBitmapPtr, hasMipMap);
}
/**
@@ -1290,7 +1283,7 @@
if (!isMutable()) {
throw new IllegalStateException("cannot erase immutable bitmaps");
}
- nativeErase(mNativeBitmap, c);
+ nativeErase(mSkBitmapPtr, c);
}
/**
@@ -1306,7 +1299,7 @@
public int getPixel(int x, int y) {
checkRecycled("Can't call getPixel() on a recycled bitmap");
checkPixelAccess(x, y);
- return nativeGetPixel(mNativeBitmap, x, y);
+ return nativeGetPixel(mSkBitmapPtr, x, y);
}
/**
@@ -1339,14 +1332,14 @@
return; // nothing to do
}
checkPixelsAccess(x, y, width, height, offset, stride, pixels);
- nativeGetPixels(mNativeBitmap, pixels, offset, stride,
+ nativeGetPixels(mSkBitmapPtr, pixels, offset, stride,
x, y, width, height);
}
/**
* Shared code to check for illegal arguments passed to getPixel()
* or setPixel()
- *
+ *
* @param x x coordinate of the pixel
* @param y y coordinate of the pixel
*/
@@ -1420,7 +1413,7 @@
throw new IllegalStateException();
}
checkPixelAccess(x, y);
- nativeSetPixel(mNativeBitmap, x, y, color);
+ nativeSetPixel(mSkBitmapPtr, x, y, color);
}
/**
@@ -1456,7 +1449,7 @@
return; // nothing to do
}
checkPixelsAccess(x, y, width, height, offset, stride, pixels);
- nativeSetPixels(mNativeBitmap, pixels, offset, stride,
+ nativeSetPixels(mSkBitmapPtr, pixels, offset, stride,
x, y, width, height);
}
@@ -1494,7 +1487,7 @@
*/
public void writeToParcel(Parcel p, int flags) {
checkRecycled("Can't parcel a recycled bitmap");
- if (!nativeWriteToParcel(mNativeBitmap, mIsMutable, mDensity, p)) {
+ if (!nativeWriteToParcel(mSkBitmapPtr, mIsMutable, mDensity, p)) {
throw new RuntimeException("native writeToParcel failed");
}
}
@@ -1522,9 +1515,9 @@
* -2, -2, so that drawing the alpha bitmap offset by (-2, -2) and then
* drawing the original would result in the blur visually aligning with
* the original.
- *
+ *
* <p>The initial density of the returned bitmap is the same as the original's.
- *
+ *
* @param paint Optional paint used to modify the alpha values in the
* resulting bitmap. Pass null for default behavior.
* @param offsetXY Optional array that returns the X (index 0) and Y
@@ -1538,7 +1531,7 @@
public Bitmap extractAlpha(Paint paint, int[] offsetXY) {
checkRecycled("Can't extractAlpha on a recycled bitmap");
long nativePaint = paint != null ? paint.getNativeInstance() : 0;
- Bitmap bm = nativeExtractAlpha(mNativeBitmap, nativePaint, offsetXY);
+ Bitmap bm = nativeExtractAlpha(mSkBitmapPtr, nativePaint, offsetXY);
if (bm == null) {
throw new RuntimeException("Failed to extractAlpha on Bitmap");
}
@@ -1552,7 +1545,7 @@
* If other is null, return false.
*/
public boolean sameAs(Bitmap other) {
- return this == other || (other != null && nativeSameAs(mNativeBitmap, other.mNativeBitmap));
+ return this == other || (other != null && nativeSameAs(mSkBitmapPtr, other.mSkBitmapPtr));
}
/**
@@ -1567,7 +1560,12 @@
* and therefore is harmless.
*/
public void prepareToDraw() {
- nativePrepareToDraw(mNativeBitmap);
+ nativePrepareToDraw(mSkBitmapPtr);
+ }
+
+ /** @hide */
+ public final long getSkBitmap() {
+ return mSkBitmapPtr;
}
private static class BitmapFinalizer {
@@ -1658,8 +1656,4 @@
private static native boolean nativeHasMipMap(long nativeBitmap);
private static native void nativeSetHasMipMap(long nativeBitmap, boolean hasMipMap);
private static native boolean nativeSameAs(long nativeBitmap0, long nativeBitmap1);
-
- /* package */ final long ni() {
- return mNativeBitmap;
- }
}
diff --git a/graphics/java/android/graphics/BitmapShader.java b/graphics/java/android/graphics/BitmapShader.java
index 5e004a3..f2f890e 100644
--- a/graphics/java/android/graphics/BitmapShader.java
+++ b/graphics/java/android/graphics/BitmapShader.java
@@ -42,7 +42,7 @@
mBitmap = bitmap;
mTileX = tileX;
mTileY = tileY;
- final long b = bitmap.ni();
+ final long b = bitmap.getSkBitmap();
init(nativeCreate(b, tileX.nativeInt, tileY.nativeInt));
}
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index e4c2f0e..85fa3cb 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -154,7 +154,7 @@
throw new IllegalStateException("Immutable bitmap passed to Canvas constructor");
}
throwIfCannotDraw(bitmap);
- mNativeCanvasWrapper = initRaster(bitmap.ni());
+ mNativeCanvasWrapper = initRaster(bitmap.getSkBitmap());
mFinalizer = new CanvasFinalizer(mNativeCanvasWrapper);
mBitmap = bitmap;
mDensity = bitmap.mDensity;
@@ -219,7 +219,7 @@
}
throwIfCannotDraw(bitmap);
- native_setBitmap(mNativeCanvasWrapper, bitmap.ni(), true);
+ native_setBitmap(mNativeCanvasWrapper, bitmap.getSkBitmap(), true);
mDensity = bitmap.mDensity;
}
@@ -1339,7 +1339,7 @@
*/
public void drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint) {
throwIfCannotDraw(bitmap);
- native_drawBitmap(mNativeCanvasWrapper, bitmap.ni(), left, top,
+ native_drawBitmap(mNativeCanvasWrapper, bitmap.getSkBitmap(), left, top,
paint != null ? paint.getNativeInstance() : 0, mDensity, mScreenDensity, bitmap.mDensity);
}
@@ -1385,7 +1385,7 @@
bottom = src.bottom;
}
- native_drawBitmap(mNativeCanvasWrapper, bitmap.ni(), left, top, right, bottom,
+ native_drawBitmap(mNativeCanvasWrapper, bitmap.getSkBitmap(), left, top, right, bottom,
dst.left, dst.top, dst.right, dst.bottom, nativePaint, mScreenDensity,
bitmap.mDensity);
}
@@ -1432,7 +1432,7 @@
bottom = src.bottom;
}
- native_drawBitmap(mNativeCanvasWrapper, bitmap.ni(), left, top, right, bottom,
+ native_drawBitmap(mNativeCanvasWrapper, bitmap.getSkBitmap(), left, top, right, bottom,
dst.left, dst.top, dst.right, dst.bottom, nativePaint, mScreenDensity,
bitmap.mDensity);
}
@@ -1513,7 +1513,7 @@
* @param paint May be null. The paint used to draw the bitmap
*/
public void drawBitmap(@NonNull Bitmap bitmap, @NonNull Matrix matrix, @Nullable Paint paint) {
- nativeDrawBitmapMatrix(mNativeCanvasWrapper, bitmap.ni(), matrix.ni(),
+ nativeDrawBitmapMatrix(mNativeCanvasWrapper, bitmap.getSkBitmap(), matrix.ni(),
paint != null ? paint.getNativeInstance() : 0);
}
@@ -1568,7 +1568,7 @@
// no mul by 2, since we need only 1 color per vertex
checkRange(colors.length, colorOffset, count);
}
- nativeDrawBitmapMesh(mNativeCanvasWrapper, bitmap.ni(), meshWidth, meshHeight,
+ nativeDrawBitmapMesh(mNativeCanvasWrapper, bitmap.getSkBitmap(), meshWidth, meshHeight,
verts, vertOffset, colors, colorOffset,
paint != null ? paint.getNativeInstance() : 0);
}
diff --git a/graphics/java/android/graphics/NinePatch.java b/graphics/java/android/graphics/NinePatch.java
index ebc86aa..9c4299a 100644
--- a/graphics/java/android/graphics/NinePatch.java
+++ b/graphics/java/android/graphics/NinePatch.java
@@ -98,7 +98,7 @@
public NinePatch(Bitmap bitmap, byte[] chunk, String srcName) {
mBitmap = bitmap;
mSrcName = srcName;
- mNativeChunk = validateNinePatchChunk(mBitmap.ni(), chunk);
+ mNativeChunk = validateNinePatchChunk(mBitmap.getSkBitmap(), chunk);
}
/**
@@ -199,12 +199,12 @@
}
void drawSoftware(Canvas canvas, RectF location, Paint paint) {
- nativeDraw(canvas.getNativeCanvasWrapper(), location, mBitmap.ni(), mNativeChunk,
+ nativeDraw(canvas.getNativeCanvasWrapper(), location, mBitmap.getSkBitmap(), mNativeChunk,
paint != null ? paint.getNativeInstance() : 0, canvas.mDensity, mBitmap.mDensity);
}
void drawSoftware(Canvas canvas, Rect location, Paint paint) {
- nativeDraw(canvas.getNativeCanvasWrapper(), location, mBitmap.ni(), mNativeChunk,
+ nativeDraw(canvas.getNativeCanvasWrapper(), location, mBitmap.getSkBitmap(), mNativeChunk,
paint != null ? paint.getNativeInstance() : 0, canvas.mDensity, mBitmap.mDensity);
}
@@ -252,7 +252,7 @@
* that are transparent.
*/
public final Region getTransparentRegion(Rect bounds) {
- long r = nativeGetTransparentRegion(mBitmap.ni(), mNativeChunk, bounds);
+ long r = nativeGetTransparentRegion(mBitmap.getSkBitmap(), mNativeChunk, bounds);
return r != 0 ? new Region(r) : null;
}
diff --git a/graphics/java/android/graphics/pdf/PdfRenderer.java b/graphics/java/android/graphics/pdf/PdfRenderer.java
index 79934da..b32dcc6 100644
--- a/graphics/java/android/graphics/pdf/PdfRenderer.java
+++ b/graphics/java/android/graphics/pdf/PdfRenderer.java
@@ -380,7 +380,7 @@
final long transformPtr = (transform != null) ? transform.native_instance : 0;
- nativeRenderPage(mNativeDocument, mNativePage, destination.mNativeBitmap, contentLeft,
+ nativeRenderPage(mNativeDocument, mNativePage, destination.getSkBitmap(), contentLeft,
contentTop, contentRight, contentBottom, transformPtr, renderMode);
}
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index efbb709..71088b7 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -22,7 +22,6 @@
#include <SkDeque.h>
#include <SkDrawFilter.h>
#include <SkGraphics.h>
-#include <SkPorterDuff.h>
#include <SkShader.h>
#include <SkTArray.h>
#include <SkTemplates.h>
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index 1cf589d..16758d0 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -215,7 +215,7 @@
status_t JMediaCodec::setCallback(jobject cb) {
if (cb != NULL) {
if (mCallbackNotification == NULL) {
- mCallbackNotification = new AMessage(kWhatCallbackNotify, id());
+ mCallbackNotification = new AMessage(kWhatCallbackNotify, this);
}
} else {
mCallbackNotification.clear();
diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp
index 93138fa..2f6bbf4 100644
--- a/media/jni/android_media_MediaMetadataRetriever.cpp
+++ b/media/jni/android_media_MediaMetadataRetriever.cpp
@@ -40,7 +40,6 @@
struct fields_t {
jfieldID context;
jclass bitmapClazz; // Must be a global ref
- jfieldID nativeBitmap;
jmethodID createBitmapMethod;
jmethodID createScaledBitmapMethod;
jclass configClazz; // Must be a global ref
@@ -282,8 +281,7 @@
return NULL;
}
- SkBitmap *bitmap =
- (SkBitmap *) env->GetLongField(jBitmap, fields.nativeBitmap);
+ SkBitmap *bitmap = GraphicsJNI::getSkBitmap(env, jBitmap);
bitmap->lockPixels();
rotate((uint16_t*)bitmap->getPixels(),
@@ -421,10 +419,6 @@
if (fields.createScaledBitmapMethod == NULL) {
return;
}
- fields.nativeBitmap = env->GetFieldID(fields.bitmapClazz, "mNativeBitmap", "J");
- if (fields.nativeBitmap == NULL) {
- return;
- }
jclass configClazz = env->FindClass("android/graphics/Bitmap$Config");
if (configClazz == NULL) {
diff --git a/native/graphics/jni/bitmap.cpp b/native/graphics/jni/bitmap.cpp
index ea32edc..ddb01a0 100644
--- a/native/graphics/jni/bitmap.cpp
+++ b/native/graphics/jni/bitmap.cpp
@@ -27,7 +27,7 @@
return ANDROID_BITMAP_RESULT_BAD_PARAMETER;
}
- SkBitmap* bm = GraphicsJNI::getNativeBitmap(env, jbitmap);
+ SkBitmap* bm = GraphicsJNI::getSkBitmap(env, jbitmap);
if (NULL == bm) {
return ANDROID_BITMAP_RESULT_JNI_EXCEPTION;
}
@@ -64,7 +64,7 @@
return ANDROID_BITMAP_RESULT_BAD_PARAMETER;
}
- SkBitmap* bm = GraphicsJNI::getNativeBitmap(env, jbitmap);
+ SkBitmap* bm = GraphicsJNI::getSkBitmap(env, jbitmap);
if (NULL == bm) {
return ANDROID_BITMAP_RESULT_JNI_EXCEPTION;
}
@@ -87,7 +87,7 @@
return ANDROID_BITMAP_RESULT_BAD_PARAMETER;
}
- SkBitmap* bm = GraphicsJNI::getNativeBitmap(env, jbitmap);
+ SkBitmap* bm = GraphicsJNI::getSkBitmap(env, jbitmap);
if (NULL == bm) {
return ANDROID_BITMAP_RESULT_JNI_EXCEPTION;
}
diff --git a/opengl/java/android/opengl/GLUtils.java b/opengl/java/android/opengl/GLUtils.java
index a9d33dd..4d890c9 100644
--- a/opengl/java/android/opengl/GLUtils.java
+++ b/opengl/java/android/opengl/GLUtils.java
@@ -29,14 +29,6 @@
public final class GLUtils {
- /*
- * We use a class initializer to allow the native code to cache some
- * field offsets.
- */
- static {
- nativeClassInit();
- }
-
private GLUtils() {
}
@@ -275,8 +267,6 @@
*/
native public static void setTracingLevel(int level);
- native private static void nativeClassInit();
-
native private static int native_getInternalFormat(Bitmap bitmap);
native private static int native_getType(Bitmap bitmap);
native private static int native_texImage2D(int target, int level, int internalformat,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 3a812cc..37d9a73 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -59,6 +59,7 @@
import android.service.notification.StatusBarNotification;
import android.text.TextUtils;
import android.util.Log;
+import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.view.Display;
@@ -2150,6 +2151,14 @@
}
public boolean isKeyguardSecure() {
+ if (mStatusBarKeyguardViewManager == null) {
+ // startKeyguard() hasn't been called yet, so we don't know.
+ // Make sure anything that needs to know isKeyguardSecure() checks and re-checks this
+ // value onVisibilityChanged().
+ Slog.w(TAG, "isKeyguardSecure() called before startKeyguard(), returning false",
+ new Throwable());
+ return false;
+ }
return mStatusBarKeyguardViewManager.isSecure();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index acf7af9..0c21b20 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -220,6 +220,7 @@
public void setPhoneStatusBar(PhoneStatusBar phoneStatusBar) {
mPhoneStatusBar = phoneStatusBar;
+ updateCameraVisibility(); // in case onFinishInflate() was called too early
}
private Intent getCameraIntent() {
@@ -231,6 +232,10 @@
}
private void updateCameraVisibility() {
+ if (mCameraImageView == null) {
+ // Things are not set up yet; reply hazy, ask again later
+ return;
+ }
ResolveInfo resolved = mContext.getPackageManager().resolveActivityAsUser(getCameraIntent(),
PackageManager.MATCH_DEFAULT_ONLY,
mLockPatternUtils.getCurrentUser());
@@ -253,7 +258,7 @@
private boolean isCameraDisabledByDpm() {
final DevicePolicyManager dpm =
(DevicePolicyManager) getContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
- if (dpm != null) {
+ if (dpm != null && mPhoneStatusBar != null) {
try {
final int userId = ActivityManagerNative.getDefault().getCurrentUser().id;
final int disabledFlags = dpm.getKeyguardDisabledFeatures(null, userId);
diff --git a/rs/jni/Android.mk b/rs/jni/Android.mk
index f1f0bfc..94f0859 100644
--- a/rs/jni/Android.mk
+++ b/rs/jni/Android.mk
@@ -14,7 +14,8 @@
libskia \
libutils \
libui \
- libgui
+ libgui \
+ libjnigraphics
LOCAL_STATIC_LIBRARIES :=
@@ -23,6 +24,7 @@
LOCAL_C_INCLUDES += \
$(JNI_H_INCLUDE) \
frameworks/rs \
+ frameworks/base/core/jni \
$(rs_generated_include_dir)
LOCAL_CFLAGS += -Wno-unused-parameter -std=c++11
diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp
index a145166..d8e1464 100644
--- a/rs/jni/android_renderscript_RenderScript.cpp
+++ b/rs/jni/android_renderscript_RenderScript.cpp
@@ -24,8 +24,6 @@
#include <utils/misc.h>
#include <inttypes.h>
-#include <SkBitmap.h>
-
#include <androidfw/Asset.h>
#include <androidfw/AssetManager.h>
#include <androidfw/ResourceTypes.h>
@@ -35,6 +33,7 @@
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/android_view_Surface.h"
#include "android_runtime/android_util_AssetManager.h"
+#include "android/graphics/GraphicsJNI.h"
#include <rs.h>
#include <rsEnv.h>
@@ -172,14 +171,10 @@
// ---------------------------------------------------------------------------
static jfieldID gContextId = 0;
-static jfieldID gNativeBitmapID = 0;
static void _nInit(JNIEnv *_env, jclass _this)
{
gContextId = _env->GetFieldID(_this, "mContext", "J");
-
- jclass bitmapClass = _env->FindClass("android/graphics/Bitmap");
- gNativeBitmapID = _env->GetFieldID(bitmapClass, "mNativeBitmap", "J");
}
// ---------------------------------------------------------------------------
@@ -934,7 +929,7 @@
jobject jbitmap, jint usage)
{
SkBitmap const * nativeBitmap =
- (SkBitmap const *)_env->GetLongField(jbitmap, gNativeBitmapID);
+ GraphicsJNI::getSkBitmap(_env, jbitmap);
const SkBitmap& bitmap(*nativeBitmap);
bitmap.lockPixels();
@@ -951,7 +946,7 @@
jint mip, jobject jbitmap, jint usage)
{
SkBitmap const * nativeBitmap =
- (SkBitmap const *)_env->GetLongField(jbitmap, gNativeBitmapID);
+ GraphicsJNI::getSkBitmap(_env, jbitmap);
const SkBitmap& bitmap(*nativeBitmap);
bitmap.lockPixels();
@@ -968,7 +963,7 @@
jobject jbitmap, jint usage)
{
SkBitmap const * nativeBitmap =
- (SkBitmap const *)_env->GetLongField(jbitmap, gNativeBitmapID);
+ GraphicsJNI::getSkBitmap(_env, jbitmap);
const SkBitmap& bitmap(*nativeBitmap);
bitmap.lockPixels();
@@ -984,7 +979,7 @@
nAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
{
SkBitmap const * nativeBitmap =
- (SkBitmap const *)_env->GetLongField(jbitmap, gNativeBitmapID);
+ GraphicsJNI::getSkBitmap(_env, jbitmap);
const SkBitmap& bitmap(*nativeBitmap);
int w = bitmap.width();
int h = bitmap.height();
@@ -1001,7 +996,7 @@
nAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
{
SkBitmap const * nativeBitmap =
- (SkBitmap const *)_env->GetLongField(jbitmap, gNativeBitmapID);
+ GraphicsJNI::getSkBitmap(_env, jbitmap);
const SkBitmap& bitmap(*nativeBitmap);
bitmap.lockPixels();
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index 94d400a..26510328 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -601,7 +601,7 @@
return token;
}
- // High level policy: apps are ineligible for backup if certain conditions apply
+ // High level policy: apps are generally ineligible for backup if certain conditions apply
public static boolean appIsEligibleForBackup(ApplicationInfo app) {
// 1. their manifest states android:allowBackup="false"
if ((app.flags&ApplicationInfo.FLAG_ALLOW_BACKUP) == 0) {
@@ -628,7 +628,7 @@
return (pkg.applicationInfo.flags & ApplicationInfo.FLAG_FULL_BACKUP_ONLY) != 0;
}
- // No agent means we do full backups for it
+ // No agent or fullBackupOnly="true" means we do indeed perform full-data backups for it
return true;
}
@@ -1266,7 +1266,23 @@
for (int i = 0; i < N; i++) {
String pkgName = in.readUTF();
long lastBackup = in.readLong();
- schedule.add(new FullBackupEntry(pkgName, lastBackup));
+ try {
+ PackageInfo pkg = mPackageManager.getPackageInfo(pkgName, 0);
+ if (appGetsFullBackup(pkg)
+ && appIsEligibleForBackup(pkg.applicationInfo)) {
+ schedule.add(new FullBackupEntry(pkgName, lastBackup));
+ } else {
+ if (DEBUG) {
+ Slog.i(TAG, "Package " + pkgName
+ + " no longer eligible for full backup");
+ }
+ }
+ } catch (NameNotFoundException e) {
+ if (DEBUG) {
+ Slog.i(TAG, "Package " + pkgName
+ + " not installed; dropping from full backup");
+ }
+ }
}
Collections.sort(schedule);
} catch (Exception e) {
@@ -1289,7 +1305,7 @@
schedule = new ArrayList<FullBackupEntry>(N);
for (int i = 0; i < N; i++) {
PackageInfo info = apps.get(i);
- if (appGetsFullBackup(info)) {
+ if (appGetsFullBackup(info) && appIsEligibleForBackup(info.applicationInfo)) {
schedule.add(new FullBackupEntry(info.packageName, 0));
}
}
@@ -1761,11 +1777,11 @@
addPackageParticipantsLocked(pkgList);
}
// If they're full-backup candidates, add them there instead
+ final long now = System.currentTimeMillis();
for (String packageName : pkgList) {
try {
PackageInfo app = mPackageManager.getPackageInfo(packageName, 0);
- long now = System.currentTimeMillis();
- if (appGetsFullBackup(app)) {
+ if (appGetsFullBackup(app) && appIsEligibleForBackup(app.applicationInfo)) {
enqueueFullBackup(packageName, now);
scheduleNextFullBackupJob();
}
@@ -2462,7 +2478,7 @@
BackupRequest request = mQueue.get(0);
mQueue.remove(0);
- Slog.d(TAG, "starting agent for backup of " + request);
+ Slog.d(TAG, "starting key/value backup of " + request);
addBackupTrace("launch agent for " + request.packageName);
// Verify that the requested app exists; it might be something that
@@ -2473,13 +2489,24 @@
try {
mCurrentPackage = mPackageManager.getPackageInfo(request.packageName,
PackageManager.GET_SIGNATURES);
- if (mCurrentPackage.applicationInfo.backupAgentName == null) {
+ if (!appIsEligibleForBackup(mCurrentPackage.applicationInfo)) {
// The manifest has changed but we had a stale backup request pending.
// This won't happen again because the app won't be requesting further
// backups.
Slog.i(TAG, "Package " + request.packageName
+ " no longer supports backup; skipping");
- addBackupTrace("skipping - no agent, completion is noop");
+ addBackupTrace("skipping - not eligible, completion is noop");
+ executeNextState(BackupState.RUNNING_QUEUE);
+ return;
+ }
+
+ if (appGetsFullBackup(mCurrentPackage)) {
+ // It's possible that this app *formerly* was enqueued for key/value backup,
+ // but has since been updated and now only supports the full-data path.
+ // Don't proceed with a key/value backup for it in this case.
+ Slog.i(TAG, "Package " + request.packageName
+ + " requests full-data rather than key/value; skipping");
+ addBackupTrace("skipping - fullBackupOnly, completion is noop");
executeNextState(BackupState.RUNNING_QUEUE);
return;
}
@@ -9161,6 +9188,8 @@
// check whether there is data for it in the current dataset, falling back
// to the ancestral dataset if not.
long token = getAvailableRestoreToken(packageName);
+ if (DEBUG) Slog.v(TAG, "restorePackage pkg=" + packageName
+ + " token=" + Long.toHexString(token));
// If we didn't come up with a place to look -- no ancestral dataset and
// the app has never been backed up from this device -- there's nothing
diff --git a/services/core/java/com/android/server/AssetAtlasService.java b/services/core/java/com/android/server/AssetAtlasService.java
index a2c87b9..e6dc1c7 100644
--- a/services/core/java/com/android/server/AssetAtlasService.java
+++ b/services/core/java/com/android/server/AssetAtlasService.java
@@ -291,7 +291,7 @@
}
canvas.drawBitmap(bitmap, 0.0f, 0.0f, null);
canvas.restore();
- atlasMap[mapIndex++] = bitmap.mNativeBitmap;
+ atlasMap[mapIndex++] = bitmap.getSkBitmap();
atlasMap[mapIndex++] = entry.x;
atlasMap[mapIndex++] = entry.y;
atlasMap[mapIndex++] = entry.rotated ? 1 : 0;
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 059dde1..fc95b00 100755
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -16,6 +16,8 @@
package com.android.server.am;
+import static com.android.server.am.ActivityManagerDebugConfig.*;
+
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
@@ -33,6 +35,7 @@
import android.os.SystemProperties;
import android.util.ArrayMap;
import android.util.ArraySet;
+
import com.android.internal.app.ProcessStats;
import com.android.internal.os.BatteryStatsImpl;
import com.android.internal.os.TransferPipe;
@@ -67,14 +70,15 @@
import android.util.TimeUtils;
public final class ActiveServices {
- static final boolean DEBUG_SERVICE = ActivityManagerService.DEBUG_SERVICE;
- static final boolean DEBUG_SERVICE_EXECUTING = ActivityManagerService.DEBUG_SERVICE_EXECUTING;
- static final boolean DEBUG_DELAYED_SERVICE = ActivityManagerService.DEBUG_SERVICE;
- static final boolean DEBUG_DELAYED_STARTS = DEBUG_DELAYED_SERVICE;
- static final boolean DEBUG_MU = ActivityManagerService.DEBUG_MU;
- static final boolean LOG_SERVICE_START_STOP = false;
- static final String TAG = ActivityManagerService.TAG;
- static final String TAG_MU = ActivityManagerService.TAG_MU;
+ private static final String TAG = TAG_WITH_CLASS_NAME ? "ActiveServices" : TAG_AM;
+ private static final String TAG_MU = TAG + POSTFIX_MU;
+ private static final String TAG_SERVICE = TAG + POSTFIX_SERVICE;
+ private static final String TAG_SERVICE_EXECUTING = TAG + POSTFIX_SERVICE_EXECUTING;
+
+ private static final boolean DEBUG_DELAYED_SERVICE = DEBUG_SERVICE;
+ private static final boolean DEBUG_DELAYED_STARTS = DEBUG_DELAYED_SERVICE;
+
+ private static final boolean LOG_SERVICE_START_STOP = false;
// How long we wait for a service to finish executing.
static final int SERVICE_TIMEOUT = 20*1000;
@@ -206,11 +210,12 @@
void ensureNotStartingBackground(ServiceRecord r) {
if (mStartingBackground.remove(r)) {
- if (DEBUG_DELAYED_STARTS) Slog.v(TAG, "No longer background starting: " + r);
+ if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE,
+ "No longer background starting: " + r);
rescheduleDelayedStarts();
}
if (mDelayedStartList.remove(r)) {
- if (DEBUG_DELAYED_STARTS) Slog.v(TAG, "No longer delaying start: " + r);
+ if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "No longer delaying start: " + r);
}
}
@@ -229,16 +234,17 @@
while (mDelayedStartList.size() > 0
&& mStartingBackground.size() < mMaxStartingBackground) {
ServiceRecord r = mDelayedStartList.remove(0);
- if (DEBUG_DELAYED_STARTS) Slog.v(TAG, "REM FR DELAY LIST (exec next): " + r);
+ if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE,
+ "REM FR DELAY LIST (exec next): " + r);
if (r.pendingStarts.size() <= 0) {
Slog.w(TAG, "**** NO PENDING STARTS! " + r + " startReq=" + r.startRequested
+ " delayedStop=" + r.delayedStop);
}
if (DEBUG_DELAYED_SERVICE) {
if (mDelayedStartList.size() > 0) {
- Slog.v(TAG, "Remaining delayed list:");
+ Slog.v(TAG_SERVICE, "Remaining delayed list:");
for (int i=0; i<mDelayedStartList.size(); i++) {
- Slog.v(TAG, " #" + i + ": " + mDelayedStartList.get(i));
+ Slog.v(TAG_SERVICE, " #" + i + ": " + mDelayedStartList.get(i));
}
}
}
@@ -248,7 +254,7 @@
if (mStartingBackground.size() > 0) {
ServiceRecord next = mStartingBackground.get(0);
long when = next.startingBgTimeout > now ? next.startingBgTimeout : now;
- if (DEBUG_DELAYED_SERVICE) Slog.v(TAG, "Top bg start is " + next
+ if (DEBUG_DELAYED_SERVICE) Slog.v(TAG_SERVICE, "Top bg start is " + next
+ ", can delay others up to " + when);
Message msg = obtainMessage(MSG_BG_START_TIMEOUT);
sendMessageAtTime(msg, when);
@@ -298,7 +304,7 @@
ComponentName startServiceLocked(IApplicationThread caller,
Intent service, String resolvedType,
int callingPid, int callingUid, int userId) {
- if (DEBUG_DELAYED_STARTS) Slog.v(TAG, "startService: " + service
+ if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "startService: " + service
+ " type=" + resolvedType + " args=" + service.getExtras());
final boolean callerFg;
@@ -337,7 +343,7 @@
NeededUriGrants neededGrants = mAm.checkGrantUriPermissionFromIntentLocked(
callingUid, r.packageName, service, service.getFlags(), null, r.userId);
if (unscheduleServiceRestartLocked(r, callingUid, false)) {
- if (DEBUG_SERVICE) Slog.v(TAG, "START SERVICE WHILE RESTART PENDING: " + r);
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "START SERVICE WHILE RESTART PENDING: " + r);
}
r.lastActivity = SystemClock.uptimeMillis();
r.startRequested = true;
@@ -360,29 +366,30 @@
// service is started. This is especially the case for receivers, which
// may start a service in onReceive() to do some additional work and have
// initialized some global state as part of that.
- if (DEBUG_DELAYED_SERVICE) Slog.v(TAG, "Potential start delay of " + r + " in "
- + proc);
+ if (DEBUG_DELAYED_SERVICE) Slog.v(TAG_SERVICE, "Potential start delay of "
+ + r + " in " + proc);
if (r.delayed) {
// This service is already scheduled for a delayed start; just leave
// it still waiting.
- if (DEBUG_DELAYED_STARTS) Slog.v(TAG, "Continuing to delay: " + r);
+ if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "Continuing to delay: " + r);
return r.name;
}
if (smap.mStartingBackground.size() >= mMaxStartingBackground) {
// Something else is starting, delay!
- Slog.i(TAG, "Delaying start of: " + r);
+ Slog.i(TAG_SERVICE, "Delaying start of: " + r);
smap.mDelayedStartList.add(r);
r.delayed = true;
return r.name;
}
- if (DEBUG_DELAYED_STARTS) Slog.v(TAG, "Not delaying: " + r);
+ if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "Not delaying: " + r);
addToStarting = true;
} else if (proc.curProcState >= ActivityManager.PROCESS_STATE_SERVICE) {
// We slightly loosen when we will enqueue this new service as a background
// starting service we are waiting for, to also include processes that are
// currently running other services or receivers.
addToStarting = true;
- if (DEBUG_DELAYED_STARTS) Slog.v(TAG, "Not delaying, but counting as bg: " + r);
+ if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE,
+ "Not delaying, but counting as bg: " + r);
} else if (DEBUG_DELAYED_STARTS) {
StringBuilder sb = new StringBuilder(128);
sb.append("Not potential delay (state=").append(proc.curProcState)
@@ -394,16 +401,17 @@
}
sb.append("): ");
sb.append(r.toString());
- Slog.v(TAG, sb.toString());
+ Slog.v(TAG_SERVICE, sb.toString());
}
} else if (DEBUG_DELAYED_STARTS) {
if (callerFg) {
- Slog.v(TAG, "Not potential delay (callerFg=" + callerFg + " uid="
+ Slog.v(TAG_SERVICE, "Not potential delay (callerFg=" + callerFg + " uid="
+ callingUid + " pid=" + callingPid + "): " + r);
} else if (r.app != null) {
- Slog.v(TAG, "Not potential delay (cur app=" + r.app + "): " + r);
+ Slog.v(TAG_SERVICE, "Not potential delay (cur app=" + r.app + "): " + r);
} else {
- Slog.v(TAG, "Not potential delay (user " + r.userId + " not started): " + r);
+ Slog.v(TAG_SERVICE,
+ "Not potential delay (user " + r.userId + " not started): " + r);
}
}
@@ -432,9 +440,9 @@
if (DEBUG_DELAYED_SERVICE) {
RuntimeException here = new RuntimeException("here");
here.fillInStackTrace();
- Slog.v(TAG, "Starting background (first=" + first + "): " + r, here);
+ Slog.v(TAG_SERVICE, "Starting background (first=" + first + "): " + r, here);
} else if (DEBUG_DELAYED_STARTS) {
- Slog.v(TAG, "Starting background (first=" + first + "): " + r);
+ Slog.v(TAG_SERVICE, "Starting background (first=" + first + "): " + r);
}
if (first) {
smap.rescheduleDelayedStarts();
@@ -451,7 +459,7 @@
// If service isn't actually running, but is is being held in the
// delayed list, then we need to keep it started but note that it
// should be stopped once no longer delayed.
- if (DEBUG_DELAYED_STARTS) Slog.v(TAG, "Delaying stop of pending: " + service);
+ if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "Delaying stop of pending: " + service);
service.delayedStop = true;
return;
}
@@ -469,7 +477,7 @@
int stopServiceLocked(IApplicationThread caller, Intent service,
String resolvedType, int userId) {
- if (DEBUG_SERVICE) Slog.v(TAG, "stopService: " + service
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "stopService: " + service
+ " type=" + resolvedType);
final ProcessRecord callerApp = mAm.getRecordForAppLocked(caller);
@@ -525,7 +533,7 @@
boolean stopServiceTokenLocked(ComponentName className, IBinder token,
int startId) {
- if (DEBUG_SERVICE) Slog.v(TAG, "stopServiceToken: " + className
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "stopServiceToken: " + className
+ " " + token + " startId=" + startId);
ServiceRecord r = findServiceLocked(className, token, UserHandle.getCallingUserId());
if (r != null) {
@@ -687,7 +695,7 @@
int bindServiceLocked(IApplicationThread caller, IBinder token,
Intent service, String resolvedType,
IServiceConnection connection, int flags, int userId) {
- if (DEBUG_SERVICE) Slog.v(TAG, "bindService: " + service
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "bindService: " + service
+ " type=" + resolvedType + " conn=" + connection.asBinder()
+ " flags=0x" + Integer.toHexString(flags));
final ProcessRecord callerApp = mAm.getRecordForAppLocked(caller);
@@ -751,7 +759,7 @@
try {
if (unscheduleServiceRestartLocked(s, callerApp.info.uid, false)) {
- if (DEBUG_SERVICE) Slog.v(TAG, "BIND SERVICE WHILE RESTART PENDING: "
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "BIND SERVICE WHILE RESTART PENDING: "
+ s);
}
@@ -819,7 +827,7 @@
mAm.updateOomAdjLocked(s.app);
}
- if (DEBUG_SERVICE) Slog.v(TAG, "Bind " + s + " with " + b
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Bind " + s + " with " + b
+ ": received=" + b.intent.received
+ " apps=" + b.intent.apps.size()
+ " doRebind=" + b.intent.doRebind);
@@ -857,7 +865,7 @@
void publishServiceLocked(ServiceRecord r, Intent intent, IBinder service) {
final long origId = Binder.clearCallingIdentity();
try {
- if (DEBUG_SERVICE) Slog.v(TAG, "PUBLISHING " + r
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "PUBLISHING " + r
+ " " + intent + ": " + service);
if (r != null) {
Intent.FilterComparison filter
@@ -873,14 +881,14 @@
ConnectionRecord c = clist.get(i);
if (!filter.equals(c.binding.intent.intent)) {
if (DEBUG_SERVICE) Slog.v(
- TAG, "Not publishing to: " + c);
+ TAG_SERVICE, "Not publishing to: " + c);
if (DEBUG_SERVICE) Slog.v(
- TAG, "Bound intent: " + c.binding.intent.intent);
+ TAG_SERVICE, "Bound intent: " + c.binding.intent.intent);
if (DEBUG_SERVICE) Slog.v(
- TAG, "Published intent: " + intent);
+ TAG_SERVICE, "Published intent: " + intent);
continue;
}
- if (DEBUG_SERVICE) Slog.v(TAG, "Publishing to: " + c);
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Publishing to: " + c);
try {
c.conn.connected(r.name, service);
} catch (Exception e) {
@@ -901,7 +909,7 @@
boolean unbindServiceLocked(IServiceConnection connection) {
IBinder binder = connection.asBinder();
- if (DEBUG_SERVICE) Slog.v(TAG, "unbindService: conn=" + binder);
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "unbindService: conn=" + binder);
ArrayList<ConnectionRecord> clist = mServiceConnections.get(binder);
if (clist == null) {
Slog.w(TAG, "Unbind failed: could not find connection for "
@@ -945,7 +953,7 @@
Intent.FilterComparison filter
= new Intent.FilterComparison(intent);
IntentBindRecord b = r.bindings.get(filter);
- if (DEBUG_SERVICE) Slog.v(TAG, "unbindFinished in " + r
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "unbindFinished in " + r
+ " at " + b + ": apps="
+ (b != null ? b.apps.size() : 0));
@@ -1012,7 +1020,7 @@
String resolvedType, int callingPid, int callingUid, int userId,
boolean createIfNeeded, boolean callingFromFg) {
ServiceRecord r = null;
- if (DEBUG_SERVICE) Slog.v(TAG, "retrieveServiceLocked: " + service
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "retrieveServiceLocked: " + service
+ " type=" + resolvedType + " callingUid=" + callingUid);
userId = mAm.handleIncomingUser(callingPid, callingUid, userId,
@@ -1036,7 +1044,7 @@
ServiceInfo sInfo =
rInfo != null ? rInfo.serviceInfo : null;
if (sInfo == null) {
- Slog.w(TAG, "Unable to start service " + service + " U=" + userId +
+ Slog.w(TAG_SERVICE, "Unable to start service " + service + " U=" + userId +
": not found");
return null;
}
@@ -1110,9 +1118,9 @@
}
private final void bumpServiceExecutingLocked(ServiceRecord r, boolean fg, String why) {
- if (DEBUG_SERVICE) Slog.v(TAG, ">>> EXECUTING "
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, ">>> EXECUTING "
+ why + " of " + r + " in app " + r.app);
- else if (DEBUG_SERVICE_EXECUTING) Slog.v(TAG, ">>> EXECUTING "
+ else if (DEBUG_SERVICE_EXECUTING) Slog.v(TAG_SERVICE_EXECUTING, ">>> EXECUTING "
+ why + " of " + r.shortName);
long now = SystemClock.uptimeMillis();
if (r.executeNesting == 0) {
@@ -1155,7 +1163,7 @@
i.hasBound = true;
i.doRebind = false;
} catch (RemoteException e) {
- if (DEBUG_SERVICE) Slog.v(TAG, "Crashed while binding " + r);
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Crashed while binding " + r);
return false;
}
}
@@ -1336,7 +1344,7 @@
return null;
}
- if (DEBUG_SERVICE) Slog.v(TAG, "Bringing up " + r + " " + r.intent);
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Bringing up " + r + " " + r.intent);
// We are now bringing the service up, so no longer in the
// restarting state.
@@ -1347,7 +1355,7 @@
// Make sure this service is no longer considered delayed, we are starting it now.
if (r.delayed) {
- if (DEBUG_DELAYED_STARTS) Slog.v(TAG, "REM FR DELAY LIST (bring up): " + r);
+ if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "REM FR DELAY LIST (bring up): " + r);
getServiceMap(r.userId).mDelayedStartList.remove(r);
r.delayed = false;
}
@@ -1430,7 +1438,8 @@
// Oh and hey we've already been asked to stop!
r.delayedStop = false;
if (r.startRequested) {
- if (DEBUG_DELAYED_STARTS) Slog.v(TAG, "Applying delayed stop (in bring up): " + r);
+ if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE,
+ "Applying delayed stop (in bring up): " + r);
stopServiceLocked(r);
}
}
@@ -1509,7 +1518,7 @@
sendServiceArgsLocked(r, execInFg, true);
if (r.delayed) {
- if (DEBUG_DELAYED_STARTS) Slog.v(TAG, "REM FR DELAY LIST (new proc): " + r);
+ if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "REM FR DELAY LIST (new proc): " + r);
getServiceMap(r.userId).mDelayedStartList.remove(r);
r.delayed = false;
}
@@ -1518,7 +1527,8 @@
// Oh and hey we've already been asked to stop!
r.delayedStop = false;
if (r.startRequested) {
- if (DEBUG_DELAYED_STARTS) Slog.v(TAG, "Applying delayed stop (from start): " + r);
+ if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE,
+ "Applying delayed stop (from start): " + r);
stopServiceLocked(r);
}
}
@@ -1534,7 +1544,7 @@
while (r.pendingStarts.size() > 0) {
try {
ServiceRecord.StartItem si = r.pendingStarts.remove(0);
- if (DEBUG_SERVICE) Slog.v(TAG, "Sending arguments to: "
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Sending arguments to: "
+ r + " " + r.intent + " args=" + si.intent);
if (si.intent == null && N > 1) {
// If somehow we got a dummy null intent in the middle,
@@ -1566,7 +1576,7 @@
} catch (RemoteException e) {
// Remote process gone... we'll let the normal cleanup take
// care of this.
- if (DEBUG_SERVICE) Slog.v(TAG, "Crashed while scheduling start: " + r);
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Crashed while scheduling start: " + r);
break;
} catch (Exception e) {
Slog.w(TAG, "Unexpected exception", e);
@@ -1636,7 +1646,7 @@
if (r.app != null && r.app.thread != null) {
for (int i=r.bindings.size()-1; i>=0; i--) {
IntentBindRecord ibr = r.bindings.valueAt(i);
- if (DEBUG_SERVICE) Slog.v(TAG, "Bringing down binding " + ibr
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Bringing down binding " + ibr
+ ": hasBound=" + ibr.hasBound);
if (ibr.hasBound) {
try {
@@ -1654,7 +1664,7 @@
}
}
- if (DEBUG_SERVICE) Slog.v(TAG, "Bringing down " + r + " " + r.intent);
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Bringing down " + r + " " + r.intent);
r.destroyTime = SystemClock.uptimeMillis();
if (LOG_SERVICE_START_STOP) {
EventLogTags.writeAmDestroyService(
@@ -1671,7 +1681,7 @@
for (int i=mPendingServices.size()-1; i>=0; i--) {
if (mPendingServices.get(i) == r) {
mPendingServices.remove(i);
- if (DEBUG_SERVICE) Slog.v(TAG, "Removed pending: " + r);
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Removed pending: " + r);
}
}
@@ -1704,11 +1714,11 @@
}
} else {
if (DEBUG_SERVICE) Slog.v(
- TAG, "Removed service that has no process: " + r);
+ TAG_SERVICE, "Removed service that has no process: " + r);
}
} else {
if (DEBUG_SERVICE) Slog.v(
- TAG, "Removed service that is not running: " + r);
+ TAG_SERVICE, "Removed service that is not running: " + r);
}
if (r.bindings.size() > 0) {
@@ -1775,7 +1785,7 @@
}
if (!c.serviceDead) {
- if (DEBUG_SERVICE) Slog.v(TAG, "Disconnecting binding " + b.intent
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Disconnecting binding " + b.intent
+ ": shouldUnbind=" + b.intent.hasBound);
if (s.app != null && s.app.thread != null && b.intent.apps.size() == 0
&& b.intent.hasBound) {
@@ -1902,19 +1912,20 @@
private void serviceDoneExecutingLocked(ServiceRecord r, boolean inDestroying,
boolean finishing) {
- if (DEBUG_SERVICE) Slog.v(TAG, "<<< DONE EXECUTING " + r
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "<<< DONE EXECUTING " + r
+ ": nesting=" + r.executeNesting
+ ", inDestroying=" + inDestroying + ", app=" + r.app);
- else if (DEBUG_SERVICE_EXECUTING) Slog.v(TAG, "<<< DONE EXECUTING " + r.shortName);
+ else if (DEBUG_SERVICE_EXECUTING) Slog.v(TAG_SERVICE_EXECUTING,
+ "<<< DONE EXECUTING " + r.shortName);
r.executeNesting--;
if (r.executeNesting <= 0) {
if (r.app != null) {
- if (DEBUG_SERVICE) Slog.v(TAG,
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE,
"Nesting at 0 of " + r.shortName);
r.app.execServicesFg = false;
r.app.executingServices.remove(r);
if (r.app.executingServices.size() == 0) {
- if (DEBUG_SERVICE || DEBUG_SERVICE_EXECUTING) Slog.v(TAG,
+ if (DEBUG_SERVICE || DEBUG_SERVICE_EXECUTING) Slog.v(TAG_SERVICE_EXECUTING,
"No more executingServices of " + r.shortName);
mAm.mHandler.removeMessages(ActivityManagerService.SERVICE_TIMEOUT_MSG, r.app);
} else if (r.executeFg) {
@@ -1927,7 +1938,7 @@
}
}
if (inDestroying) {
- if (DEBUG_SERVICE) Slog.v(TAG,
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE,
"doneExecuting remove destroying " + r);
mDestroyingServices.remove(r);
r.bindings.clear();
@@ -2141,13 +2152,13 @@
sr.executeNesting = 0;
sr.forceClearTracker();
if (mDestroyingServices.remove(sr)) {
- if (DEBUG_SERVICE) Slog.v(TAG, "killServices remove destroying " + sr);
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "killServices remove destroying " + sr);
}
final int numClients = sr.bindings.size();
for (int bindingi=numClients-1; bindingi>=0; bindingi--) {
IntentBindRecord b = sr.bindings.valueAt(bindingi);
- if (DEBUG_SERVICE) Slog.v(TAG, "Killing binding " + b
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Killing binding " + b
+ ": shouldUnbind=" + b.hasBound);
b.binder = null;
b.requested = b.received = b.hasBound = false;
@@ -2281,7 +2292,7 @@
if (sr.app == app) {
sr.forceClearTracker();
mDestroyingServices.remove(i);
- if (DEBUG_SERVICE) Slog.v(TAG, "killServices remove destroying " + sr);
+ if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "killServices remove destroying " + sr);
}
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
new file mode 100644
index 0000000..03f253b
--- /dev/null
+++ b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.am;
+
+/**
+ * Common class for the various debug {@link android.util.Log} output configuration in the activity
+ * manager package.
+ */
+class ActivityManagerDebugConfig {
+
+ // All output logs in the activity manager package use the {@link #TAG_AM} string for tagging
+ // their log output. This makes it easy to identify the origin of the log message when sifting
+ // through a large amount of log output from multiple sources. However, it also makes trying
+ // to figure-out the origin of a log message while debugging the activity manager a little
+ // painful. By setting this constant to true, log messages from the activity manager package
+ // will be tagged with their class names instead fot the generic tag.
+ static final boolean TAG_WITH_CLASS_NAME = false;
+
+ // While debugging it is sometimes useful to have the category name of the log prepended to the
+ // base log tag to make sifting through logs with the same base tag easier. By setting this
+ // constant to true, the category name of the log point will be prepended to the log tag.
+ static final boolean PREPEND_CATEGORY_NAME = false;
+
+ // Default log tag for the activity manager package.
+ static final String TAG_AM = "ActivityManager";
+
+ // Enable all debug log categories.
+ static final boolean DEBUG_ALL = false;
+
+ // Available log categories in the activity manager package.
+ static final boolean DEBUG_BACKUP = DEBUG_ALL || false;
+ static final boolean DEBUG_BROADCAST = DEBUG_ALL || false;
+ static final boolean DEBUG_BROADCAST_BACKGROUND = DEBUG_BROADCAST || false;
+ static final boolean DEBUG_BROADCAST_LIGHT = DEBUG_BROADCAST || false;
+ static final boolean DEBUG_CLEANUP = DEBUG_ALL || false;
+ static final boolean DEBUG_CONFIGURATION = DEBUG_ALL || false;
+ static final boolean DEBUG_FOCUS = false;
+ static final boolean DEBUG_IMMERSIVE = DEBUG_ALL || false;
+ static final boolean DEBUG_LOCKSCREEN = DEBUG_ALL || false;
+ static final boolean DEBUG_LRU = DEBUG_ALL || false;
+ static final boolean DEBUG_MU = DEBUG_ALL || false;
+ static final boolean DEBUG_OOM_ADJ = DEBUG_ALL || false;
+ static final boolean DEBUG_PAUSE = DEBUG_ALL || false;
+ static final boolean DEBUG_POWER = DEBUG_ALL || false;
+ static final boolean DEBUG_POWER_QUICK = DEBUG_POWER || false;
+ static final boolean DEBUG_PROCESS_OBSERVERS = DEBUG_ALL || false;
+ static final boolean DEBUG_PROCESSES = DEBUG_ALL || false;
+ static final boolean DEBUG_PROVIDER = DEBUG_ALL || false;
+ static final boolean DEBUG_PSS = DEBUG_ALL || false;
+ static final boolean DEBUG_RECENTS = DEBUG_ALL || false;
+ static final boolean DEBUG_RESULTS = DEBUG_ALL || false;
+ static final boolean DEBUG_SERVICE = DEBUG_ALL || false;
+ static final boolean DEBUG_SERVICE_EXECUTING = DEBUG_ALL || false;
+ static final boolean DEBUG_STACK = DEBUG_ALL || false;
+ static final boolean DEBUG_SWITCH = DEBUG_ALL || false;
+ static final boolean DEBUG_TASKS = DEBUG_ALL || false;
+ static final boolean DEBUG_THUMBNAILS = DEBUG_ALL || false;
+ static final boolean DEBUG_TRANSITION = DEBUG_ALL || false;
+ static final boolean DEBUG_URI_PERMISSION = DEBUG_ALL || false;
+ static final boolean DEBUG_USER_LEAVING = DEBUG_ALL || false;
+ static final boolean DEBUG_VISBILITY = DEBUG_ALL || false;
+
+ static final String POSTFIX_BACKUP = (PREPEND_CATEGORY_NAME) ? "_Backup" : "";
+ static final String POSTFIX_BROADCAST = (PREPEND_CATEGORY_NAME) ? "_Broadcast" : "";
+ static final String POSTFIX_MU = "_MU";
+ static final String POSTFIX_SERVICE = (PREPEND_CATEGORY_NAME) ? "_Service" : "";
+ static final String POSTFIX_SERVICE_EXECUTING =
+ (PREPEND_CATEGORY_NAME) ? "_ServiceExecuting" : "";
+
+}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 61ff514..1247105 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -30,6 +30,7 @@
import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
import static org.xmlpull.v1.XmlPullParser.START_TAG;
import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID;
+import static com.android.server.am.ActivityManagerDebugConfig.*;
import static com.android.server.am.TaskRecord.INVALID_TASK_ID;
import android.Manifest;
@@ -245,10 +246,11 @@
// File that stores last updated system version and called preboot receivers
static final String CALLED_PRE_BOOTS_FILENAME = "called_pre_boots.dat";
- static final String TAG = "ActivityManager";
- static final String TAG_MU = "ActivityManagerServiceMU";
- static final boolean DEBUG = false;
- static final boolean localLOGV = DEBUG;
+ static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityManagerService" : TAG_AM;
+ private static final String TAG_MU = TAG + POSTFIX_MU;
+
+ // TODO(ogunwale): Migrate all the constants below to use ActivityManagerDebugConfig class.
+ static final boolean localLOGV = DEBUG_ALL || false;
static final boolean DEBUG_BACKUP = localLOGV || false;
static final boolean DEBUG_BROADCAST = localLOGV || false;
static final boolean DEBUG_BROADCAST_LIGHT = DEBUG_BROADCAST || false;
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index b3d3d6a..8b95ae8 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -20,6 +20,7 @@
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static com.android.server.am.ActivityManagerDebugConfig.*;
import static com.android.server.am.ActivityManagerService.localLOGV;
import static com.android.server.am.ActivityManagerService.DEBUG_CONFIGURATION;
import static com.android.server.am.ActivityManagerService.DEBUG_FOCUS;
@@ -116,7 +117,7 @@
import java.util.List;
public final class ActivityStackSupervisor implements DisplayListener {
- static final boolean DEBUG = ActivityManagerService.DEBUG || false;
+ static final boolean DEBUG = DEBUG_ALL || false;
static final boolean DEBUG_ADD_REMOVE = DEBUG || false;
static final boolean DEBUG_APP = DEBUG || false;
static final boolean DEBUG_CONTAINERS = DEBUG || false;
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index 5083b1d..7a29a88 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -41,6 +41,8 @@
import android.util.EventLog;
import android.util.Slog;
+import static com.android.server.am.ActivityManagerDebugConfig.*;
+
/**
* BROADCASTS
*
@@ -48,11 +50,9 @@
* foreground priority, and one for normal (background-priority) broadcasts.
*/
public final class BroadcastQueue {
- static final String TAG = "BroadcastQueue";
- static final String TAG_MU = ActivityManagerService.TAG_MU;
- static final boolean DEBUG_BROADCAST = ActivityManagerService.DEBUG_BROADCAST;
- static final boolean DEBUG_BROADCAST_LIGHT = ActivityManagerService.DEBUG_BROADCAST_LIGHT;
- static final boolean DEBUG_MU = ActivityManagerService.DEBUG_MU;
+ private static final String TAG = TAG_WITH_CLASS_NAME ? "BroadcastQueue" : TAG_AM;
+ private static final String TAG_MU = TAG + POSTFIX_MU;
+ private static final String TAG_BROADCAST = TAG + POSTFIX_BROADCAST;
static final int MAX_BROADCAST_HISTORY = ActivityManager.isLowRamDeviceStatic() ? 10 : 50;
static final int MAX_BROADCAST_SUMMARY_HISTORY
@@ -143,7 +143,7 @@
switch (msg.what) {
case BROADCAST_INTENT_MSG: {
if (DEBUG_BROADCAST) Slog.v(
- TAG, "Received BROADCAST_INTENT_MSG");
+ TAG_BROADCAST, "Received BROADCAST_INTENT_MSG");
processNextBroadcast(true);
} break;
case BROADCAST_TIMEOUT_MSG: {
@@ -196,7 +196,7 @@
public final boolean replaceParallelBroadcastLocked(BroadcastRecord r) {
for (int i=mParallelBroadcasts.size()-1; i>=0; i--) {
if (r.intent.filterEquals(mParallelBroadcasts.get(i).intent)) {
- if (DEBUG_BROADCAST) Slog.v(TAG,
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"***** DROPPING PARALLEL ["
+ mQueueName + "]: " + r.intent);
mParallelBroadcasts.set(i, r);
@@ -209,7 +209,7 @@
public final boolean replaceOrderedBroadcastLocked(BroadcastRecord r) {
for (int i=mOrderedBroadcasts.size()-1; i>0; i--) {
if (r.intent.filterEquals(mOrderedBroadcasts.get(i).intent)) {
- if (DEBUG_BROADCAST) Slog.v(TAG,
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"***** DROPPING ORDERED ["
+ mQueueName + "]: " + r.intent);
mOrderedBroadcasts.set(i, r);
@@ -221,7 +221,7 @@
private final void processCurBroadcastLocked(BroadcastRecord r,
ProcessRecord app) throws RemoteException {
- if (DEBUG_BROADCAST) Slog.v(TAG,
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"Process cur broadcast " + r + " for app " + app);
if (app.thread == null) {
throw new RemoteException();
@@ -238,7 +238,7 @@
boolean started = false;
try {
- if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG,
+ if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG_BROADCAST,
"Delivering to component " + r.curComponent
+ ": " + r);
mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
@@ -246,12 +246,12 @@
mService.compatibilityInfoForPackageLocked(r.curReceiver.applicationInfo),
r.resultCode, r.resultData, r.resultExtras, r.ordered, r.userId,
app.repProcState);
- if (DEBUG_BROADCAST) Slog.v(TAG,
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"Process cur broadcast " + r + " DELIVERED for app " + app);
started = true;
} finally {
if (!started) {
- if (DEBUG_BROADCAST) Slog.v(TAG,
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"Process cur broadcast " + r + ": NOT STARTED!");
r.receiver = null;
r.curApp = null;
@@ -308,7 +308,7 @@
r = mPendingBroadcast;
if (r != null && r.curApp == app) {
- if (DEBUG_BROADCAST) Slog.v(TAG,
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"[" + mQueueName + "] skip & discard pending app " + r);
logBroadcastReceiverDiscardLocked(r);
finishReceiverLocked(r, r.resultCode, r.resultData,
@@ -321,7 +321,7 @@
}
public void scheduleBroadcastsLocked() {
- if (DEBUG_BROADCAST) Slog.v(TAG, "Schedule broadcasts ["
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Schedule broadcasts ["
+ mQueueName + "]: current="
+ mBroadcastsScheduled);
@@ -391,8 +391,7 @@
// on. If there are background services currently starting, then we will go into a
// special state where we hold off on continuing this broadcast until they are done.
if (mService.mServices.hasBackgroundServices(r.userId)) {
- Slog.i(ActivityManagerService.TAG, "Delay finish: "
- + r.curComponent.flattenToShortString());
+ Slog.i(TAG, "Delay finish: " + r.curComponent.flattenToShortString());
r.state = BroadcastRecord.WAITING_SERVICES;
return false;
}
@@ -412,7 +411,7 @@
if (mOrderedBroadcasts.size() > 0) {
BroadcastRecord br = mOrderedBroadcasts.get(0);
if (br.userId == userId && br.state == BroadcastRecord.WAITING_SERVICES) {
- Slog.i(ActivityManagerService.TAG, "Resuming delayed broadcast");
+ Slog.i(TAG, "Resuming delayed broadcast");
br.curComponent = null;
br.state = BroadcastRecord.IDLE;
processNextBroadcast(false);
@@ -475,7 +474,7 @@
int mode = mService.mAppOpsService.noteOperation(r.appOp,
filter.receiverList.uid, filter.packageName);
if (mode != AppOpsManager.MODE_ALLOWED) {
- if (DEBUG_BROADCAST) Slog.v(TAG,
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"App op " + r.appOp + " not allowed for broadcast to uid "
+ filter.receiverList.uid + " pkg " + filter.packageName);
skip = true;
@@ -513,7 +512,7 @@
}
}
try {
- if (DEBUG_BROADCAST_LIGHT) Slog.i(TAG, "Delivering to " + filter + " : " + r);
+ if (DEBUG_BROADCAST_LIGHT) Slog.i(TAG_BROADCAST, "Delivering to " + filter + " : " + r);
performReceiveLocked(filter.receiverList.app, filter.receiverList.receiver,
new Intent(r.intent), r.resultCode, r.resultData,
r.resultExtras, r.ordered, r.initialSticky, r.userId);
@@ -538,7 +537,7 @@
synchronized(mService) {
BroadcastRecord r;
- if (DEBUG_BROADCAST) Slog.v(TAG, "processNextBroadcast ["
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "processNextBroadcast ["
+ mQueueName + "]: "
+ mParallelBroadcasts.size() + " broadcasts, "
+ mOrderedBroadcasts.size() + " ordered broadcasts");
@@ -555,17 +554,17 @@
r.dispatchTime = SystemClock.uptimeMillis();
r.dispatchClockTime = System.currentTimeMillis();
final int N = r.receivers.size();
- if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing parallel broadcast ["
+ if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG_BROADCAST, "Processing parallel broadcast ["
+ mQueueName + "] " + r);
for (int i=0; i<N; i++) {
Object target = r.receivers.get(i);
- if (DEBUG_BROADCAST) Slog.v(TAG,
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"Delivering non-ordered on [" + mQueueName + "] to registered "
+ target + ": " + r);
deliverToRegisteredReceiverLocked(r, (BroadcastFilter)target, false);
}
addBroadcastToHistoryLocked(r);
- if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Done with parallel broadcast ["
+ if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG_BROADCAST, "Done with parallel broadcast ["
+ mQueueName + "] " + r);
}
@@ -576,7 +575,7 @@
// check that the process we're waiting for still exists.
if (mPendingBroadcast != null) {
if (DEBUG_BROADCAST_LIGHT) {
- Slog.v(TAG, "processNextBroadcast ["
+ Slog.v(TAG_BROADCAST, "processNextBroadcast ["
+ mQueueName + "]: waiting for "
+ mPendingBroadcast.curApp);
}
@@ -645,7 +644,7 @@
}
if (r.state != BroadcastRecord.IDLE) {
- if (DEBUG_BROADCAST) Slog.d(TAG,
+ if (DEBUG_BROADCAST) Slog.d(TAG_BROADCAST,
"processNextBroadcast("
+ mQueueName + ") called when not idle (state="
+ r.state + ")");
@@ -658,7 +657,7 @@
// result if requested...
if (r.resultTo != null) {
try {
- if (DEBUG_BROADCAST) Slog.i(TAG,
+ if (DEBUG_BROADCAST) Slog.i(TAG_BROADCAST,
"Finishing broadcast [" + mQueueName + "] "
+ r.intent.getAction() + " app=" + r.callerApp);
performReceiveLocked(r.callerApp, r.resultTo,
@@ -675,10 +674,10 @@
}
}
- if (DEBUG_BROADCAST) Slog.v(TAG, "Cancelling BROADCAST_TIMEOUT_MSG");
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Cancelling BROADCAST_TIMEOUT_MSG");
cancelBroadcastTimeoutLocked();
- if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Finished with ordered broadcast "
+ if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG_BROADCAST, "Finished with ordered broadcast "
+ r);
// ... and on to the next...
@@ -699,12 +698,12 @@
if (recIdx == 0) {
r.dispatchTime = r.receiverTime;
r.dispatchClockTime = System.currentTimeMillis();
- if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing ordered broadcast ["
+ if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG_BROADCAST, "Processing ordered broadcast ["
+ mQueueName + "] " + r);
}
if (! mPendingBroadcastTimeoutMessage) {
long timeoutTime = r.receiverTime + mTimeoutPeriod;
- if (DEBUG_BROADCAST) Slog.v(TAG,
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"Submitting BROADCAST_TIMEOUT_MSG ["
+ mQueueName + "] for " + r + " at " + timeoutTime);
setBroadcastTimeoutLocked(timeoutTime);
@@ -715,7 +714,7 @@
// Simple case: this is a registered receiver who gets
// a direct call.
BroadcastFilter filter = (BroadcastFilter)nextReceiver;
- if (DEBUG_BROADCAST) Slog.v(TAG,
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"Delivering ordered ["
+ mQueueName + "] to registered "
+ filter + ": " + r);
@@ -723,7 +722,7 @@
if (r.receiver == null || !r.ordered) {
// The receiver has already finished, so schedule to
// process the next one.
- if (DEBUG_BROADCAST) Slog.v(TAG, "Quick finishing ["
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Quick finishing ["
+ mQueueName + "]: ordered="
+ r.ordered + " receiver=" + r.receiver);
r.state = BroadcastRecord.IDLE;
@@ -786,7 +785,7 @@
int mode = mService.mAppOpsService.noteOperation(r.appOp,
info.activityInfo.applicationInfo.uid, info.activityInfo.packageName);
if (mode != AppOpsManager.MODE_ALLOWED) {
- if (DEBUG_BROADCAST) Slog.v(TAG,
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"App op " + r.appOp + " not allowed for broadcast to uid "
+ info.activityInfo.applicationInfo.uid + " pkg "
+ info.activityInfo.packageName);
@@ -836,7 +835,7 @@
}
if (!isAvailable) {
if (DEBUG_BROADCAST) {
- Slog.v(TAG, "Skipping delivery to " + info.activityInfo.packageName
+ Slog.v(TAG_BROADCAST, "Skipping delivery to " + info.activityInfo.packageName
+ " / " + info.activityInfo.applicationInfo.uid
+ " : package no longer available");
}
@@ -845,7 +844,7 @@
}
if (skip) {
- if (DEBUG_BROADCAST) Slog.v(TAG,
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"Skipping delivery of ordered ["
+ mQueueName + "] " + r + " for whatever reason");
r.receiver = null;
@@ -915,7 +914,7 @@
}
// Not running -- get it started, to be executed when the app comes up.
- if (DEBUG_BROADCAST) Slog.v(TAG,
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"Need to start app ["
+ mQueueName + "] " + targetProcess + " for broadcast " + r);
if ((r.curApp=mService.startProcessLocked(targetProcess,
@@ -990,7 +989,7 @@
// broadcast timeout message after each receiver finishes. Instead, we set up
// an initial timeout then kick it down the road a little further as needed
// when it expires.
- if (DEBUG_BROADCAST) Slog.v(TAG,
+ if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"Premature timeout ["
+ mQueueName + "] @ " + now + ": resetting BROADCAST_TIMEOUT_MSG for "
+ timeoutTime);
@@ -1005,7 +1004,7 @@
// for started services to finish as well before going on. So if we have actually
// waited long enough time timeout the broadcast, let's give up on the whole thing
// and just move on to the next.
- Slog.i(ActivityManagerService.TAG, "Waited long enough for: " + (br.curComponent != null
+ Slog.i(TAG, "Waited long enough for: " + (br.curComponent != null
? br.curComponent.flattenToShortString() : "(null)"));
br.curComponent = null;
br.state = BroadcastRecord.IDLE;
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 4b7f698..5d386bd 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -3616,6 +3616,19 @@
final int index = (mIndexMap.valueAt(i) + 5) / 10;
pw.print(index);
}
+ pw.println();
+ pw.print(" Devices: ");
+ final int devices = AudioSystem.getDevicesForStream(mStreamType);
+ int device, i = 0, n = 0;
+ while ((device = 1 << i) <= AudioSystem.DEVICE_OUT_DEFAULT) {
+ if ((devices & device) != 0) {
+ if (n++ > 0) {
+ pw.print(", ");
+ }
+ pw.print(AudioSystem.getOutputDeviceName(device));
+ }
+ i++;
+ }
}
}
diff --git a/services/core/java/com/android/server/pm/KeySetManagerService.java b/services/core/java/com/android/server/pm/KeySetManagerService.java
index 773b164..aa63932 100644
--- a/services/core/java/com/android/server/pm/KeySetManagerService.java
+++ b/services/core/java/com/android/server/pm/KeySetManagerService.java
@@ -414,9 +414,9 @@
// Get the package's known keys and KeySets
ArraySet<Long> deletableKeySets = getOriginalKeySetsByPackageNameLPr(packageName);
ArraySet<Long> deletableKeys = new ArraySet<Long>();
- ArraySet<Long> knownKeys = null;
- for (Long ks : deletableKeySets) {
- knownKeys = mKeySetMapping.get(ks);
+ final int origDksSize = deletableKeySets.size();
+ for (int i = 0; i < origDksSize; i++) {
+ ArraySet<Long> knownKeys = mKeySetMapping.get(deletableKeySets.valueAt(i));
if (knownKeys != null) {
deletableKeys.addAll(knownKeys);
}
@@ -429,9 +429,9 @@
}
ArraySet<Long> knownKeySets = getOriginalKeySetsByPackageNameLPr(pkgName);
deletableKeySets.removeAll(knownKeySets);
- knownKeys = new ArraySet<Long>();
- for (Long ks : knownKeySets) {
- knownKeys = mKeySetMapping.get(ks);
+ final int kksSize = knownKeySets.size();
+ for (int i = 0; i < kksSize; i++) {
+ ArraySet<Long> knownKeys = mKeySetMapping.get(knownKeySets.valueAt(i));
if (knownKeys != null) {
deletableKeys.removeAll(knownKeys);
}
@@ -440,18 +440,22 @@
// The remaining keys and KeySets are not relied on by any other
// application and so can be safely deleted.
- for (Long ks : deletableKeySets) {
+ final int dksSize = deletableKeySets.size();
+ for (int i = 0; i < dksSize; i++) {
+ Long ks = deletableKeySets.valueAt(i);
mKeySets.delete(ks);
mKeySetMapping.delete(ks);
}
- for (Long keyId : deletableKeys) {
- mPublicKeys.delete(keyId);
+ final int dkSize = deletableKeys.size();
+ for (int i = 0; i < dkSize; i++) {
+ mPublicKeys.delete(deletableKeys.valueAt(i));
}
// Now remove the deleted KeySets from each package's signingKeySets
for (String pkgName : mPackages.keySet()) {
PackageSetting p = mPackages.get(pkgName);
- for (Long ks : deletableKeySets) {
+ for (int i = 0; i < dksSize; i++) {
+ Long ks = deletableKeySets.valueAt(i);
p.keySetData.removeSigningKeySet(ks);
}
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index fc9ff76..b90666f 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -51,6 +51,7 @@
import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
import android.database.ContentObserver;
+import android.graphics.Bitmap;
import android.hardware.usb.UsbManager;
import android.media.AudioManager;
import android.media.IAudioService;
@@ -5491,6 +5492,22 @@
}
}
+ @Override
+ public void setUserIcon(ComponentName who, Bitmap icon) {
+ synchronized (this) {
+ Preconditions.checkNotNull(who, "ComponentName is null");
+ getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
+
+ int userId = UserHandle.getCallingUserId();
+ long id = Binder.clearCallingIdentity();
+ try {
+ mUserManager.setUserIcon(userId, icon);
+ } finally {
+ restoreCallingIdentity(id);
+ }
+ }
+ }
+
/**
* We need to update the internal state of whether a user has completed setup once. After
* that, we ignore any changes that reset the Settings.Secure.USER_SETUP_COMPLETE changes
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 0a4b787..f3b2d2e 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -3716,6 +3716,34 @@
}
/**
+ * Whether the device supports configuring the DTMF tone length.
+ *
+ * @return {@code true} if the DTMF tone length can be changed, and {@code false} otherwise.
+ */
+ public boolean canChangeDtmfToneLength() {
+ try {
+ return getITelephony().canChangeDtmfToneLength();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling ITelephony#canChangeDtmfToneLength", e);
+ }
+ return false;
+ }
+
+ /**
+ * Whether the device is a world phone.
+ *
+ * @return {@code true} if the device is a world phone, and {@code false} otherwise.
+ */
+ public boolean isWorldPhone() {
+ try {
+ return getITelephony().isWorldPhone();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling ITelephony#isWorldPhone", e);
+ }
+ return false;
+ }
+
+ /**
* This function retrieves value for setting "name+subId", and if that is not found
* retrieves value for setting "name", and if that is not found uses def as default
*
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 62c8746..3769dee 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -863,11 +863,25 @@
/**
* Whether video calling has been enabled by the user.
*
- * @return {@code True} if the user has enabled video calling, {@code false} otherwise.
+ * @return {@code true} if the user has enabled video calling, {@code false} otherwise.
*/
boolean isVideoCallingEnabled();
/**
+ * Whether the DTMF tone length can be changed.
+ *
+ * @return {@code true} if the DTMF tone length can be changed.
+ */
+ boolean canChangeDtmfToneLength();
+
+ /**
+ * Whether the device is a world phone.
+ *
+ * @return {@code true} if the devices is a world phone.
+ */
+ boolean isWorldPhone();
+
+ /**
* Get IMS Registration Status
*/
boolean isImsRegistered();
diff --git a/tools/aapt/Images.cpp b/tools/aapt/Images.cpp
index 5ab177b..063b4e6 100644
--- a/tools/aapt/Images.cpp
+++ b/tools/aapt/Images.cpp
@@ -481,8 +481,9 @@
// assuming the image is a round rect, compute the radius by marching
// diagonally from the top left corner towards the center
- image->outlineAlpha = max(max_alpha_over_row(image->rows[innerMidY], innerStartX, innerEndX),
- max_alpha_over_col(image->rows, innerMidX, innerStartY, innerStartY));
+ image->outlineAlpha = std::max(
+ max_alpha_over_row(image->rows[innerMidY], innerStartX, innerEndX),
+ max_alpha_over_col(image->rows, innerMidX, innerStartY, innerStartY));
int diagonalInset = 0;
find_max_opacity(image->rows, innerStartX, innerStartY, innerMidX, innerMidY, 1, 1,
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
index 6fbc17c..941a288 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -1807,7 +1807,7 @@
}
const ResTable& featureTable = featureAssetManager.getResources(false);
- mTypeIdOffset = max(mTypeIdOffset,
+ mTypeIdOffset = std::max(mTypeIdOffset,
findLargestTypeIdForPackage(featureTable, mAssetsPackage));
}
@@ -2703,20 +2703,16 @@
const String8 defaultLocale;
// For all strings...
- for (map<String16, map<String8, SourcePos> >::iterator nameIter = mLocalizations.begin();
- nameIter != mLocalizations.end();
- nameIter++) {
- const map<String8, SourcePos>& configSrcMap = nameIter->second;
+ for (const auto& nameIter : mLocalizations) {
+ const std::map<String8, SourcePos>& configSrcMap = nameIter.second;
// Look for strings with no default localization
if (configSrcMap.count(defaultLocale) == 0) {
SourcePos().warning("string '%s' has no default translation.",
- String8(nameIter->first).string());
+ String8(nameIter.first).string());
if (mBundle->getVerbose()) {
- for (map<String8, SourcePos>::const_iterator locales = configSrcMap.begin();
- locales != configSrcMap.end();
- locales++) {
- locales->second.printf("locale %s found", locales->first.string());
+ for (const auto& locale : configSrcMap) {
+ locale.second.printf("locale %s found", locale.first.string());
}
}
// !!! TODO: throw an error here in some circumstances
@@ -2727,8 +2723,8 @@
const char* allConfigs = mBundle->getConfigurations().string();
const char* start = allConfigs;
const char* comma;
-
- set<String8> missingConfigs;
+
+ std::set<String8> missingConfigs;
AaptLocaleValue locale;
do {
String8 config;
@@ -2762,13 +2758,11 @@
if (!missingConfigs.empty()) {
String8 configStr;
- for (set<String8>::iterator iter = missingConfigs.begin();
- iter != missingConfigs.end();
- iter++) {
- configStr.appendFormat(" %s", iter->string());
+ for (const auto& iter : missingConfigs) {
+ configStr.appendFormat(" %s", iter.string());
}
SourcePos().warning("string '%s' is missing %u required localizations:%s",
- String8(nameIter->first).string(),
+ String8(nameIter.first).string(),
(unsigned int)missingConfigs.size(),
configStr.string());
}
diff --git a/tools/aapt/ResourceTable.h b/tools/aapt/ResourceTable.h
index eef0ae1..9644224 100644
--- a/tools/aapt/ResourceTable.h
+++ b/tools/aapt/ResourceTable.h
@@ -17,8 +17,6 @@
#include "StringPool.h"
#include "Symbol.h"
-using namespace std;
-
class XMLNode;
class ResourceTable;
@@ -29,7 +27,7 @@
XML_COMPILE_STRIP_WHITESPACE = 1<<3,
XML_COMPILE_STRIP_RAW_VALUES = 1<<4,
XML_COMPILE_UTF8 = 1<<5,
-
+
XML_COMPILE_STANDARD_RESOURCE =
XML_COMPILE_STRIP_COMMENTS | XML_COMPILE_ASSIGN_ATTRIBUTE_IDS
| XML_COMPILE_STRIP_WHITESPACE | XML_COMPILE_STRIP_RAW_VALUES
@@ -116,7 +114,7 @@
* and would mess up iteration order for the existing
* resources.
*/
- queue<CompileResourceWorkItem>& getWorkQueue() {
+ std::queue<CompileResourceWorkItem>& getWorkQueue() {
return mWorkQueue;
}
@@ -587,10 +585,10 @@
size_t mNumLocal;
SourcePos mCurrentXmlPos;
Bundle* mBundle;
-
+
// key = string resource name, value = set of locales in which that name is defined
- map<String16, map<String8, SourcePos> > mLocalizations;
- queue<CompileResourceWorkItem> mWorkQueue;
+ std::map<String16, std::map<String8, SourcePos>> mLocalizations;
+ std::queue<CompileResourceWorkItem> mWorkQueue;
};
#endif
diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
index 8d24d38..970b9d0 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
@@ -76,13 +76,6 @@
// ---- Public Helper methods ----
/**
- * Returns the native delegate associated to a given {@link Bitmap_Delegate} object.
- */
- public static Bitmap_Delegate getDelegate(Bitmap bitmap) {
- return sManager.getDelegate(bitmap.mNativeBitmap);
- }
-
- /**
* Returns the native delegate associated to a given an int referencing a {@link Bitmap} object.
*/
public static Bitmap_Delegate getDelegate(long native_bitmap) {
@@ -187,19 +180,6 @@
return createBitmap(delegate, createFlags, density.getDpiValue());
}
- /**
- * Returns the {@link BufferedImage} used by the delegate of the given {@link Bitmap}.
- */
- public static BufferedImage getImage(Bitmap bitmap) {
- // get the delegate from the native int.
- Bitmap_Delegate delegate = sManager.getDelegate(bitmap.mNativeBitmap);
- if (delegate == null) {
- return null;
- }
-
- return delegate.mImage;
- }
-
public static int getBufferedImageType(int nativeBitmapConfig) {
switch (Config.nativeToConfig(nativeBitmapConfig)) {
case ALPHA_8: