am b9a7c675: am d2d27a5f: am f3c3edfe: am bafdb900: am 82088d62: Merge "docs: add EU legal notice" into klp-modular-docs
* commit 'b9a7c67599d2f424f2b6bc445099a893aa8433bc':
docs: add EU legal notice
diff --git a/api/current.txt b/api/current.txt
index 06e98ef..c830c63 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -7517,6 +7517,7 @@
field public static final java.lang.String ACTION_CHOOSER = "android.intent.action.CHOOSER";
field public static final java.lang.String ACTION_CLOSE_SYSTEM_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS";
field public static final java.lang.String ACTION_CONFIGURATION_CHANGED = "android.intent.action.CONFIGURATION_CHANGED";
+ field public static final java.lang.String ACTION_CONFIRM_DEVICE_CREDENTIAL = "android.intent.action.CONFIRM_DEVICE_CREDENTIAL";
field public static final java.lang.String ACTION_CREATE_DOCUMENT = "android.intent.action.CREATE_DOCUMENT";
field public static final java.lang.String ACTION_CREATE_SHORTCUT = "android.intent.action.CREATE_SHORTCUT";
field public static final java.lang.String ACTION_DATE_CHANGED = "android.intent.action.DATE_CHANGED";
@@ -7659,6 +7660,7 @@
field public static final java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
field public static final java.lang.String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list";
field public static final java.lang.String EXTRA_DATA_REMOVED = "android.intent.extra.DATA_REMOVED";
+ field public static final java.lang.String EXTRA_DETAILS = "android.intent.extra.DETAILS";
field public static final java.lang.String EXTRA_DOCK_STATE = "android.intent.extra.DOCK_STATE";
field public static final int EXTRA_DOCK_STATE_CAR = 2; // 0x2
field public static final int EXTRA_DOCK_STATE_DESK = 1; // 0x1
@@ -31054,6 +31056,36 @@
field public static final int WEEKDAY_WEDNESDAY = 4; // 0x4
}
+ public static abstract class TtsSpan.Builder {
+ ctor public TtsSpan.Builder(java.lang.String);
+ method public android.text.style.TtsSpan build();
+ method public C setIntArgument(java.lang.String, int);
+ method public C setLongArgument(java.lang.String, long);
+ method public C setStringArgument(java.lang.String, java.lang.String);
+ }
+
+ public static class TtsSpan.CardinalBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ ctor public TtsSpan.CardinalBuilder();
+ ctor public TtsSpan.CardinalBuilder(long);
+ ctor public TtsSpan.CardinalBuilder(java.lang.String);
+ method public android.text.style.TtsSpan.CardinalBuilder setNumber(long);
+ method public android.text.style.TtsSpan.CardinalBuilder setNumber(java.lang.String);
+ }
+
+ public static class TtsSpan.SemioticClassBuilder extends android.text.style.TtsSpan.Builder {
+ ctor public TtsSpan.SemioticClassBuilder(java.lang.String);
+ method public C setAnimacy(java.lang.String);
+ method public C setCase(java.lang.String);
+ method public C setGender(java.lang.String);
+ method public C setMultiplicity(java.lang.String);
+ }
+
+ public static class TtsSpan.TextBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ ctor public TtsSpan.TextBuilder();
+ ctor public TtsSpan.TextBuilder(java.lang.String);
+ method public android.text.style.TtsSpan.TextBuilder setText(java.lang.String);
+ }
+
public class TypefaceSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
ctor public TypefaceSpan(java.lang.String);
ctor public TypefaceSpan(android.os.Parcel);
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 5bf8a97..bc14c1e 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -1413,6 +1413,21 @@
public static final String ACTION_UNINSTALL_PACKAGE = "android.intent.action.UNINSTALL_PACKAGE";
/**
+ * Activity Action: Prompt the user to confirm credentials (pin, pattern or password)
+ * for the current user of the device. Launch this activity using
+ * {@link android.app.Activity#startActivityForResult(Intent, int)} and check if the
+ * result is {@link android.app.Activity#RESULT_OK} for a successful response to the
+ * challenge.<p/>
+ * This intent is handled by the system at a high priority and applications cannot intercept
+ * it.<p/>
+ * You can use {@link android.app.KeyguardManager#isKeyguardSecure()} to determine if the user will be
+ * prompted.
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_CONFIRM_DEVICE_CREDENTIAL = "android.intent.action.CONFIRM_DEVICE_CREDENTIAL";
+
+
+ /**
* Specify whether the package should be uninstalled for all users.
* @hide because these should not be part of normal application flow.
*/
@@ -3161,11 +3176,17 @@
/**
* A CharSequence dialog title to provide to the user when used with a
- * {@link #ACTION_CHOOSER}.
+ * {@link #ACTION_CHOOSER} or {@link #ACTION_CONFIRM_DEVICE_CREDENTIAL}.
*/
public static final String EXTRA_TITLE = "android.intent.extra.TITLE";
/**
+ * A CharSequence description to provide to the user when used with
+ * {@link #ACTION_CONFIRM_DEVICE_CREDENTIAL}.
+ */
+ public static final String EXTRA_DETAILS = "android.intent.extra.DETAILS";
+
+ /**
* A Parcelable[] of {@link Intent} or
* {@link android.content.pm.LabeledIntent} objects as set with
* {@link #putExtra(String, Parcelable[])} of additional activities to place
diff --git a/core/java/android/text/style/TtsSpan.java b/core/java/android/text/style/TtsSpan.java
index 04b2da5..3ab3b31 100644
--- a/core/java/android/text/style/TtsSpan.java
+++ b/core/java/android/text/style/TtsSpan.java
@@ -22,10 +22,13 @@
import android.text.TextUtils;
/**
- * A span that supplies additional meta-data intended for text-to-speech rendering
- * of the associated text. If the text is being processed by a text-to-speech
- * engine, the engine may use the data in this span in addition to or instead of
- * its associated text.
+ * A span that supplies additional meta-data for the associated text intended
+ * for text-to-speech engines. If the text is being processed by a
+ * text-to-speech engine, the engine may use the data in this span in addition
+ * to or instead of its associated text.
+ *
+ * The inner classes are there for convenience and provide builders for each
+ * TtsSpan type.
*/
public class TtsSpan implements ParcelableSpan {
private final String mType;
@@ -432,10 +435,18 @@
mArgs = src.readPersistableBundle();
}
+ /**
+ * Returns the type.
+ * @return The type of this instance.
+ */
public String getType() {
return mType;
}
+ /**
+ * Returns a bundle of the arguments set.
+ * @return The bundle of the arguments set.
+ */
public PersistableBundle getArgs() {
return mArgs;
}
@@ -455,4 +466,217 @@
public int getSpanTypeId() {
return TextUtils.TTS_SPAN;
}
+
+ /**
+ * A simple builder for TtsSpans.
+ * This builder can be used directly, but the more specific subclasses of
+ * this builder like {@link TtsSpan.TextBuilder} and
+ * {@link TtsSpan.CardinalBuilder} are likely more useful.
+ *
+ * This class uses generics so methods from this class can return instances of
+ * its child classes, resulting in a fluent API (CRTP pattern).
+ */
+ public static abstract class Builder<C extends Builder<C>> {
+ // Holds the type of this class.
+ private final String mType;
+
+ // Holds the arguments of this class. It only stores objects of type
+ // String, Integer and Long.
+ private PersistableBundle mArgs = new PersistableBundle();
+
+ public Builder(String type) {
+ mType = type;
+ }
+
+ /**
+ * Returns a TtsSpan built from the parameters set by the setter
+ * methods.
+ * @return A TtsSpan built with parameters of this builder.
+ */
+ public TtsSpan build() {
+ return new TtsSpan(mType, mArgs);
+ }
+
+ /**
+ * Sets an argument to a string value.
+ * @param arg The argument name.
+ * @param value The value the argument should be set to.
+ * @return This instance.
+ */
+ @SuppressWarnings("unchecked")
+ public C setStringArgument(String arg, String value) {
+ mArgs.putString(arg, value);
+ return (C) this;
+ }
+
+ /**
+ * Sets an argument to an int value.
+ * @param arg The argument name.
+ * @param value The value the argument should be set to.
+ */
+ @SuppressWarnings("unchecked")
+ public C setIntArgument(String arg, int value) {
+ mArgs.putInt(arg, value);
+ return (C) this;
+ }
+
+ /**
+ * Sets an argument to a long value.
+ * @param arg The argument name.
+ * @param value The value the argument should be set to.
+ */
+ @SuppressWarnings("unchecked")
+ public C setLongArgument(String arg, long value) {
+ mArgs.putLong(arg, value);
+ return (C) this;
+ }
+ }
+
+ /**
+ * A builder for TtsSpans, has setters for morphosyntactic features.
+ * This builder can be used directly, but the more specific subclasses of
+ * this builder like {@link TtsSpan.TextBuilder} and
+ * {@link TtsSpan.CardinalBuilder} are likely more useful.
+ */
+ public static class SemioticClassBuilder<C extends SemioticClassBuilder<C>>
+ extends Builder<C> {
+
+ public SemioticClassBuilder(String type) {
+ super(type);
+ }
+
+ /**
+ * Sets the gender information for this instance.
+ * @param gender Can any of {@link TtsSpan#GENDER_NEUTRAL},
+ * {@link TtsSpan#GENDER_MALE} and {@link TtsSpan#GENDER_FEMALE}.
+ * @return This instance.
+ */
+ public C setGender(String gender) {
+ return setStringArgument(TtsSpan.ARG_GENDER, gender);
+ }
+
+ /**
+ * Sets the animacy information for this instance.
+ * @param animacy Can be any of {@link TtsSpan#ANIMACY_ANIMATE} and
+ * {@link TtsSpan#ANIMACY_INANIMATE}.
+ * @return This instance.
+ */
+ public C setAnimacy(String animacy) {
+ return setStringArgument(TtsSpan.ARG_ANIMACY, animacy);
+ }
+
+ /**
+ * Sets the multiplicity information for this instance.
+ * @param multiplicity Can be any of
+ * {@link TtsSpan#MULTIPLICITY_SINGLE},
+ * {@link TtsSpan#MULTIPLICITY_DUAL} and
+ * {@link TtsSpan#MULTIPLICITY_PLURAL}.
+ * @return This instance.
+ */
+ public C setMultiplicity(String multiplicity) {
+ return setStringArgument(TtsSpan.ARG_MULTIPLICITY, multiplicity);
+ }
+
+ /**
+ * Sets the grammatical case information for this instance.
+ * @param grammaticalCase Can be any of {@link TtsSpan#CASE_NOMINATIVE},
+ * {@link TtsSpan#CASE_ACCUSATIVE}, {@link TtsSpan#CASE_DATIVE},
+ * {@link TtsSpan#CASE_ABLATIVE}, {@link TtsSpan#CASE_GENITIVE},
+ * {@link TtsSpan#CASE_VOCATIVE}, {@link TtsSpan#CASE_LOCATIVE} and
+ * {@link TtsSpan#CASE_INSTRUMENTAL}.
+ * @return This instance.
+ */
+ public C setCase(String grammaticalCase) {
+ return setStringArgument(TtsSpan.ARG_CASE, grammaticalCase);
+ }
+ }
+
+ /**
+ * A builder for TtsSpans of type {@link TtsSpan #TYPE_TEXT}.
+ */
+ public static class TextBuilder extends SemioticClassBuilder<TextBuilder> {
+
+ /**
+ * Creates a TtsSpan of type {@link TtsSpan#TYPE_TEXT}.
+ */
+ public TextBuilder() {
+ super(TtsSpan.TYPE_TEXT);
+ }
+
+ /**
+ * Creates a TtsSpan of type {@link TtsSpan#TYPE_TEXT} and sets the
+ * {@link TtsSpan#ARG_TEXT} argument.
+ * @param text The text to be synthesized.
+ * @see #setText(String)
+ */
+ public TextBuilder(String text) {
+ this();
+ setText(text);
+ }
+
+ /**
+ * Sets the {@link TtsSpan#ARG_TEXT} argument, the text to be
+ * synthesized.
+ * @param text The string that will be synthesized.
+ * @return This instance.
+ */
+ public TextBuilder setText(String text) {
+ return setStringArgument(TtsSpan.ARG_TEXT, text);
+ }
+ }
+
+ /**
+ * A builder for TtsSpans of type {@link TtsSpan #TYPE_CARDINAL}.
+ */
+ public static class CardinalBuilder extends SemioticClassBuilder<CardinalBuilder> {
+
+ /**
+ * Creates a TtsSpan of type {@link TtsSpan#TYPE_CARDINAL}.
+ */
+ public CardinalBuilder() {
+ super(TtsSpan.TYPE_CARDINAL);
+ }
+
+ /**
+ * Creates a TtsSpan of type {@link TtsSpan#TYPE_CARDINAL} and sets the
+ * {@link TtsSpan#ARG_NUMBER} argument.
+ * @param number The number to synthesize.
+ * @see #setNumber(long)
+ */
+ public CardinalBuilder(long number) {
+ this();
+ setNumber(number);
+ }
+
+ /**
+ * Creates a TtsSpan of type {@link TtsSpan#TYPE_CARDINAL} and sets the
+ * {@link TtsSpan#ARG_NUMBER} argument.
+ * @param number The number to synthesize.
+ * @see #setNumber(String)
+ */
+ public CardinalBuilder(String number) {
+ this();
+ setNumber(number);
+ }
+
+ /**
+ * Convenience method that converts the number to a String and set it to
+ * the value for {@link TtsSpan#ARG_NUMBER}.
+ * @param number The number that will be synthesized.
+ * @return This instance.
+ */
+ public CardinalBuilder setNumber(long number) {
+ return setNumber(String.valueOf(number));
+ }
+
+ /**
+ * Sets the {@link TtsSpan#ARG_NUMBER} argument.
+ * @param number A non-empty string of digits with an optional
+ * leading + or -.
+ * @return This instance.
+ */
+ public CardinalBuilder setNumber(String number) {
+ return setStringArgument(TtsSpan.ARG_NUMBER, number);
+ }
+ }
}
diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp
index 74be577..320c259 100644
--- a/core/jni/android/graphics/Graphics.cpp
+++ b/core/jni/android/graphics/Graphics.cpp
@@ -386,7 +386,6 @@
SkASSERT(env->IsInstanceOf(paint, gPaint_class));
jlong typefaceHandle = env->GetLongField(paint, gPaint_nativeTypefaceID);
android::TypefaceImpl* p = reinterpret_cast<android::TypefaceImpl*>(typefaceHandle);
- SkASSERT(p);
return p;
}
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 64366e5..1f7acec 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -39,6 +39,7 @@
#include <cutils/fs.h>
#include <cutils/multiuser.h>
#include <cutils/sched_policy.h>
+#include <private/android_filesystem_config.h>
#include <utils/String8.h>
#include <selinux/android.h>
#include <processgroup/processgroup.h>
@@ -536,8 +537,15 @@
jint debug_flags, jobjectArray rlimits,
jint mount_external, jstring se_info, jstring se_name,
jintArray fdsToClose) {
+ // Grant CAP_WAKE_ALARM to the Bluetooth process.
+ jlong capabilities = 0;
+ if (uid == AID_BLUETOOTH) {
+ capabilities |= (1LL << CAP_WAKE_ALARM);
+ }
+
return ForkAndSpecializeCommon(env, uid, gid, gids, debug_flags,
- rlimits, 0, 0, mount_external, se_info, se_name, false, fdsToClose);
+ rlimits, capabilities, capabilities, mount_external, se_info,
+ se_name, false, fdsToClose);
}
static jint com_android_internal_os_Zygote_nativeForkSystemServer(
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 350660b..a7dba66 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -235,6 +235,7 @@
<protected-broadcast android:name="com.android.server.WifiManager.action.DELAYED_DRIVER_STOP" />
<protected-broadcast android:name="android.net.wifi.WIFI_STATE_CHANGED" />
<protected-broadcast android:name="android.net.wifi.WIFI_AP_STATE_CHANGED" />
+ <protected-broadcast android:name="android.net.wifi.WIFI_CREDENTIAL_CHANGED" />
<protected-broadcast android:name="android.net.wifi.WIFI_SCAN_AVAILABLE" />
<protected-broadcast android:name="android.net.wifi.SCAN_RESULTS" />
<protected-broadcast android:name="android.net.wifi.RSSI_CHANGED" />
@@ -805,6 +806,19 @@
android:description="@string/permdesc_changeWifiState"
android:label="@string/permlab_changeWifiState" />
+ <!-- @SystemApi @hide Allows applications to read Wi-Fi credential.
+ <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.READ_WIFI_CREDENTIAL"
+ android:permissionGroup="android.permission-group.NETWORK"
+ android:protectionLevel="signature|system" />
+
+ <!-- @SystemApi @hide Allow system apps to receive broadcast
+ when a wifi network credential is changed.
+ <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.RECEIVE_WIFI_CREDENTIAL_CHANGE"
+ android:permissionGroup="android.permission-group.NETWORK"
+ android:protectionLevel="signature|system" />
+
<!-- @hide -->
<permission android:name="android.permission.ACCESS_WIMAX_STATE"
android:permissionGroup="android.permission-group.NETWORK"
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index a3fd1df..e16894e 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -3171,25 +3171,34 @@
file.delete();
file = getUserPackagesStateBackupFile(userId);
file.delete();
- removeCrossProfileIntentFiltersToUserLPr(userId);
+ removeCrossProfileIntentFiltersLPw(userId);
removeCrossProfilePackagesLPw(userId);
}
- void removeCrossProfileIntentFiltersToUserLPr(int targetUserId) {
- for (int i = 0; i < mCrossProfileIntentResolvers.size(); i++) {
- int sourceUserId = mCrossProfileIntentResolvers.keyAt(i);
- CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(sourceUserId);
- boolean needsWriting = false;
- HashSet<CrossProfileIntentFilter> cpifs =
- new HashSet<CrossProfileIntentFilter>(cpir.filterSet());
- for (CrossProfileIntentFilter cpif : cpifs) {
- if (cpif.getTargetUserId() == targetUserId) {
- needsWriting = true;
- cpir.removeFilter(cpif);
- }
+ void removeCrossProfileIntentFiltersLPw(int userId) {
+ synchronized (mCrossProfileIntentResolvers) {
+ // userId is the source user
+ if (mCrossProfileIntentResolvers.get(userId) != null) {
+ mCrossProfileIntentResolvers.remove(userId);
+ writePackageRestrictionsLPr(userId);
}
- if (needsWriting) {
- writePackageRestrictionsLPr(sourceUserId);
+ // userId is the target user
+ int count = mCrossProfileIntentResolvers.size();
+ for (int i = 0; i < count; i++) {
+ int sourceUserId = mCrossProfileIntentResolvers.keyAt(i);
+ CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(sourceUserId);
+ boolean needsWriting = false;
+ HashSet<CrossProfileIntentFilter> cpifs =
+ new HashSet<CrossProfileIntentFilter>(cpir.filterSet());
+ for (CrossProfileIntentFilter cpif : cpifs) {
+ if (cpif.getTargetUserId() == userId) {
+ needsWriting = true;
+ cpir.removeFilter(cpif);
+ }
+ }
+ if (needsWriting) {
+ writePackageRestrictionsLPr(sourceUserId);
+ }
}
}
}
diff --git a/telecomm/java/android/telecomm/TelecommManager.java b/telecomm/java/android/telecomm/TelecommManager.java
index fcd2eba..9d1e8f5 100644
--- a/telecomm/java/android/telecomm/TelecommManager.java
+++ b/telecomm/java/android/telecomm/TelecommManager.java
@@ -31,18 +31,6 @@
* @hide
*/
public class TelecommManager {
-
- /**
- * The extra used with an {@link android.content.Intent#ACTION_CALL} or
- * {@link android.content.Intent#ACTION_DIAL} {@code Intent} to specify a {@link PhoneAccount}
- * to use when making the call.
- *
- * <p class="note">
- * Retrieve with
- * {@link android.content.Intent#getParcelableExtra(String)}.
- */
- public static final String EXTRA_PHONE_ACCOUNT = "account";
-
private static final String TAG = "TelecommManager";
private static final String TELECOMM_SERVICE_NAME = "telecomm";
diff --git a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
index 7c8ef70..2ff0fc1 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
@@ -20,6 +20,7 @@
import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.layoutlib.bridge.impl.GcSnapshot;
+import com.android.layoutlib.bridge.impl.PorterDuffUtility;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.graphics.Bitmap.Config;
@@ -534,7 +535,8 @@
// set the color
graphics.setColor(new Color(color, true /*alpha*/));
- Composite composite = PorterDuffXfermode_Delegate.getComposite(mode, 0xFF);
+ Composite composite = PorterDuffUtility.getComposite(
+ PorterDuffUtility.getPorterDuffMode(mode), 0xFF);
if (composite != null) {
graphics.setComposite(composite);
}
diff --git a/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java
index ee90595..4ac376c 100644
--- a/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java
@@ -21,11 +21,10 @@
import android.graphics.PorterDuff.Mode;
-import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
-import static com.android.layoutlib.bridge.impl.PorterDuffUtility.getAlphaCompositeRule;
+import static com.android.layoutlib.bridge.impl.PorterDuffUtility.getComposite;
import static com.android.layoutlib.bridge.impl.PorterDuffUtility.getPorterDuffMode;
/**
@@ -57,7 +56,7 @@
@Override
public boolean isSupported() {
- return getAlphaCompositeRule(mMode) != -1;
+ return true;
}
@Override
@@ -68,7 +67,7 @@
@Override
public void applyFilter(Graphics2D g, int width, int height) {
BufferedImage image = createFilterImage(width, height);
- g.setComposite(getComposite());
+ g.setComposite(getComposite(mMode, 0xFF));
g.drawImage(image, 0, 0, null);
}
@@ -101,49 +100,36 @@
return image;
}
- private AlphaComposite getComposite() {
- return AlphaComposite.getInstance(getAlphaCompositeRule(mMode));
- }
-
// For filtering the colors, the src image should contain the "color" only for pixel values
// which are not transparent in the target image. But, we are using a simple rectangular image
- // completely filled with color. Hence some AlphaComposite rules do not apply as intended.
- // However, in such cases, they can usually be mapped to some other mode, which produces an
+ // completely filled with color. Hence some Composite rules do not apply as intended. However,
+ // in such cases, they can usually be mapped to some other mode, which produces an
// equivalent result.
private Mode getCompatibleMode(Mode mode) {
Mode m = mode;
+ // Modes that are directly supported:
+ // CLEAR, DST, SRC_IN, DST_IN, DST_OUT, SRC_ATOP, DARKEN, LIGHTEN, MULTIPLY, SCREEN,
+ // ADD, OVERLAY
switch (mode) {
- // Modes that are directly supported.
- case CLEAR:
- case DST:
- case SRC_IN:
- case DST_IN:
- case DST_OUT:
- case SRC_ATOP:
- break;
- // Modes that can be mapped to one of the supported modes.
- case SRC:
- m = Mode.SRC_IN;
- break;
- case SRC_OVER:
- m = Mode.SRC_ATOP;
- break;
- case DST_OVER:
- m = Mode.DST;
- break;
- case SRC_OUT:
- m = Mode.CLEAR;
- break;
- case DST_ATOP:
- m = Mode.DST_IN;
- break;
- case XOR:
- m = Mode.DST_OUT;
- break;
- // This mode is not supported, but used by Action Bar Overflow Popup Menus. We map this
- // to the closest supported mode, to prevent showing excessive warnings to the user.
- case MULTIPLY:
- m = Mode.SRC_IN;
+ // Modes that can be mapped to one of the supported modes.
+ case SRC:
+ m = Mode.SRC_IN;
+ break;
+ case SRC_OVER:
+ m = Mode.SRC_ATOP;
+ break;
+ case DST_OVER:
+ m = Mode.DST;
+ break;
+ case SRC_OUT:
+ m = Mode.CLEAR;
+ break;
+ case DST_ATOP:
+ m = Mode.DST_IN;
+ break;
+ case XOR:
+ m = Mode.DST_OUT;
+ break;
}
return m;
}
diff --git a/tools/layoutlib/bridge/src/android/graphics/PorterDuffXfermode_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PorterDuffXfermode_Delegate.java
index f6c36b6..8825f84 100644
--- a/tools/layoutlib/bridge/src/android/graphics/PorterDuffXfermode_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/PorterDuffXfermode_Delegate.java
@@ -16,17 +16,14 @@
package android.graphics;
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.DelegateManager;
+import com.android.layoutlib.bridge.impl.PorterDuffUtility;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.graphics.PorterDuff.Mode;
-import java.awt.AlphaComposite;
import java.awt.Composite;
-import static com.android.layoutlib.bridge.impl.PorterDuffUtility.getAlphaCompositeRule;
import static com.android.layoutlib.bridge.impl.PorterDuffUtility.getPorterDuffMode;
/**
@@ -58,7 +55,7 @@
@Override
public Composite getComposite(int alpha) {
- return getComposite(mMode, alpha);
+ return PorterDuffUtility.getComposite(mMode, alpha);
}
@Override
@@ -72,9 +69,6 @@
return null;
}
- public static Composite getComposite(int mode, int alpha) {
- return getComposite(getPorterDuffMode(mode), alpha);
- }
// ---- native methods ----
@@ -90,17 +84,4 @@
mMode = getPorterDuffMode(mode);
}
- private static Composite getComposite(Mode mode, int alpha255) {
- float alpha1 = alpha255 != 0xFF ? alpha255 / 255.f : 1.f;
- int rule = getAlphaCompositeRule(mode);
- if (rule >= 0) {
- return AlphaComposite.getInstance(rule, alpha1);
- }
-
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_BROKEN,
- String.format("Unsupported PorterDuff Mode: %1$s", mode.name()),
- null, null /*data*/);
-
- return AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha1);
- }
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/PorterDuffUtility.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/PorterDuffUtility.java
index bc53e93..9588035 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/PorterDuffUtility.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/PorterDuffUtility.java
@@ -19,11 +19,14 @@
import com.android.ide.common.rendering.api.LayoutLog;
import com.android.layoutlib.bridge.Bridge;
+import android.graphics.BlendComposite;
+import android.graphics.BlendComposite.BlendingMode;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffColorFilter_Delegate;
import android.graphics.PorterDuffXfermode_Delegate;
import java.awt.AlphaComposite;
+import java.awt.Composite;
/**
* Provides various utility methods for {@link PorterDuffColorFilter_Delegate} and {@link
@@ -51,46 +54,54 @@
}
/**
- * A utility method to convert the porterDuffMode to an int to be used as a rule for {@link
- * AlphaComposite}. If {@code AlphaComposite} doesn't support the mode, -1 is returned.
+ * A utility method to get the {@link Composite} that represents the filter for the given
+ * PorterDuff mode and the alpha. Defaults to {@link Mode#SRC_OVER} for invalid modes.
*/
- public static int getAlphaCompositeRule(Mode porterDuffMode) {
- switch (porterDuffMode) {
+ public static Composite getComposite(Mode mode, int alpha255) {
+ float alpha1 = alpha255 != 0xFF ? alpha255 / 255.f : 1.f;
+ switch (mode) {
case CLEAR:
- return AlphaComposite.CLEAR;
- case DARKEN:
- break;
- case DST:
- return AlphaComposite.DST;
- case DST_ATOP:
- return AlphaComposite.DST_ATOP;
- case DST_IN:
- return AlphaComposite.DST_IN;
- case DST_OUT:
- return AlphaComposite.DST_OUT;
- case DST_OVER:
- return AlphaComposite.DST_OVER;
- case LIGHTEN:
- break;
- case MULTIPLY:
- break;
- case SCREEN:
- break;
+ return AlphaComposite.getInstance(AlphaComposite.CLEAR, alpha1);
case SRC:
- return AlphaComposite.SRC;
- case SRC_ATOP:
- return AlphaComposite.SRC_ATOP;
- case SRC_IN:
- return AlphaComposite.SRC_IN;
- case SRC_OUT:
- return AlphaComposite.SRC_OUT;
+ return AlphaComposite.getInstance(AlphaComposite.SRC, alpha1);
+ case DST:
+ return AlphaComposite.getInstance(AlphaComposite.DST, alpha1);
case SRC_OVER:
- return AlphaComposite.SRC_OVER;
+ return AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha1);
+ case DST_OVER:
+ return AlphaComposite.getInstance(AlphaComposite.DST_OVER, alpha1);
+ case SRC_IN:
+ return AlphaComposite.getInstance(AlphaComposite.SRC_IN, alpha1);
+ case DST_IN:
+ return AlphaComposite.getInstance(AlphaComposite.DST_IN, alpha1);
+ case SRC_OUT:
+ return AlphaComposite.getInstance(AlphaComposite.SRC_OUT, alpha1);
+ case DST_OUT:
+ return AlphaComposite.getInstance(AlphaComposite.DST_OUT, alpha1);
+ case SRC_ATOP:
+ return AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha1);
+ case DST_ATOP:
+ return AlphaComposite.getInstance(AlphaComposite.DST_ATOP, alpha1);
case XOR:
- return AlphaComposite.XOR;
- }
- // This is an unsupported mode.
- return -1;
+ return AlphaComposite.getInstance(AlphaComposite.XOR, alpha1);
+ case DARKEN:
+ return BlendComposite.getInstance(BlendingMode.DARKEN, alpha1);
+ case LIGHTEN:
+ return BlendComposite.getInstance(BlendingMode.LIGHTEN, alpha1);
+ case MULTIPLY:
+ return BlendComposite.getInstance(BlendingMode.MULTIPLY, alpha1);
+ case SCREEN:
+ return BlendComposite.getInstance(BlendingMode.SCREEN, alpha1);
+ case ADD:
+ return BlendComposite.getInstance(BlendingMode.ADD, alpha1);
+ case OVERLAY:
+ return BlendComposite.getInstance(BlendingMode.OVERLAY, alpha1);
+ default:
+ Bridge.getLog().fidelityWarning(LayoutLog.TAG_BROKEN,
+ String.format("Unsupported PorterDuff Mode: %1$s", mode.name()),
+ null, null /*data*/);
+ return AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha1);
+ }
}
}
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index 22ba924..292f1e8 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -41,6 +41,8 @@
List<WifiConfiguration> getConfiguredNetworks();
+ List<WifiConfiguration> getPrivilegedConfiguredNetworks();
+
int addOrUpdateNetwork(in WifiConfiguration config);
boolean removeNetwork(int netId);
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index cf4cb89..8945e52 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -18,6 +18,7 @@
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
+import android.annotation.SystemApi;
import android.content.Context;
import android.net.DhcpInfo;
import android.net.wifi.ScanSettings;
@@ -82,7 +83,29 @@
* Extra int indicating scan availability, WIFI_STATE_ENABLED and WIFI_STATE_DISABLED
* @hide
*/
- public static final String EXTRA_SCAN_AVAILABLE = "scan_enabled";
+ public static final String EXTRA_SCAN_AVAILABLE = "scan_enabled";
+
+ /**
+ * Broadcast intent action indicating that the credential of a Wi-Fi network
+ * has been changed. One extra provides the ssid of the network. Another
+ * extra provides the event type, whether the credential is saved or forgot.
+ * @hide
+ */
+ @SystemApi
+ public static final String WIFI_CREDENTIAL_CHANGED_ACTION =
+ "android.net.wifi.WIFI_CREDENTIAL_CHANGED";
+ /** @hide */
+ @SystemApi
+ public static final String EXTRA_WIFI_CREDENTIAL_EVENT_TYPE = "et";
+ /** @hide */
+ @SystemApi
+ public static final String EXTRA_WIFI_CREDENTIAL_SSID = "ssid";
+ /** @hide */
+ @SystemApi
+ public static final int WIFI_CREDENTIAL_SAVED = 0;
+ /** @hide */
+ @SystemApi
+ public static final int WIFI_CREDENTIAL_FORGOT = 1;
/**
* Broadcast intent action indicating that Wi-Fi has been enabled, disabled,
@@ -606,6 +629,16 @@
}
}
+ /** @hide */
+ @SystemApi
+ public List<WifiConfiguration> getPrivilegedConfiguredNetworks() {
+ try {
+ return mService.getPrivilegedConfiguredNetworks();
+ } catch (RemoteException e) {
+ return null;
+ }
+ }
+
/**
* Add a new network description to the set of configured networks.
* The {@code networkId} field of the supplied configuration object