diff options
31 files changed, 838 insertions, 90 deletions
diff --git a/Android.mk b/Android.mk index 08f34688fb51..242534b93bcb 100644 --- a/Android.mk +++ b/Android.mk @@ -1044,6 +1044,42 @@ $(static_doc_index_redirect): \ $(full_target): $(static_doc_index_redirect) $(full_target): $(framework_built) +# ==== static html in the sdk, reference only =============================== +include $(CLEAR_VARS) + +LOCAL_SRC_FILES:=$(framework_docs_LOCAL_SRC_FILES) +LOCAL_INTERMEDIATE_SOURCES:=$(framework_docs_LOCAL_INTERMEDIATE_SOURCES) +LOCAL_JAVA_LIBRARIES:=$(framework_docs_LOCAL_JAVA_LIBRARIES) +LOCAL_MODULE_CLASS:=$(framework_docs_LOCAL_MODULE_CLASS) +LOCAL_DROIDDOC_SOURCE_PATH:=$(framework_docs_LOCAL_DROIDDOC_SOURCE_PATH) +LOCAL_DROIDDOC_HTML_DIR:=$(framework_docs_LOCAL_DROIDDOC_HTML_DIR) +LOCAL_ADDITIONAL_JAVA_DIR:=$(framework_docs_LOCAL_ADDITIONAL_JAVA_DIR) +LOCAL_ADDITIONAL_DEPENDENCIES:=$(framework_docs_LOCAL_ADDITIONAL_DEPENDENCIES) + +LOCAL_MODULE := offline-refonly + +LOCAL_DROIDDOC_OPTIONS:=\ + $(framework_docs_LOCAL_DROIDDOC_OPTIONS) \ + -offlinemode \ + -title "Android SDK" \ + -proofread $(OUT_DOCS)/$(LOCAL_MODULE)-proofread.txt \ + -sdkvalues $(OUT_DOCS) \ + -hdf android.whichdoc offline \ + -referenceonly + +LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk-refonly + +include $(BUILD_DROIDDOC) + +static_doc_index_redirect := $(out_dir)/index.html +$(static_doc_index_redirect): \ + $(LOCAL_PATH)/docs/docs-preview-index.html | $(ACP) + $(hide) mkdir -p $(dir $@) + $(hide) $(ACP) $< $@ + +$(full_target): $(static_doc_index_redirect) +$(full_target): $(framework_built) + # ==== docs for the web (on the androiddevdocs app engine server) ======================= include $(CLEAR_VARS) diff --git a/api/current.txt b/api/current.txt index f61f0fadf67b..9d4674e63717 100644 --- a/api/current.txt +++ b/api/current.txt @@ -50907,6 +50907,7 @@ package java.lang { public abstract interface Iterable { method public default void forEach(java.util.function.Consumer<? super T>); method public abstract java.util.Iterator<T> iterator(); + method public default java.util.Spliterator<T> spliterator(); } public class LinkageError extends java.lang.Error { @@ -57327,6 +57328,7 @@ package java.util { method public E removeLast(); method public boolean removeLastOccurrence(java.lang.Object); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public class ArrayList extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { @@ -57338,6 +57340,7 @@ package java.util { method public void forEach(java.util.function.Consumer<? super E>); method public E get(int); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public void trimToSize(); } @@ -57438,6 +57441,14 @@ package java.util { method public static void sort(java.lang.Object[], int, int); method public static void sort(T[], java.util.Comparator<? super T>); method public static void sort(T[], int, int, java.util.Comparator<? super T>); + method public static java.util.Spliterator<T> spliterator(T[]); + method public static java.util.Spliterator<T> spliterator(T[], int, int); + method public static java.util.Spliterator.OfInt spliterator(int[]); + method public static java.util.Spliterator.OfInt spliterator(int[], int, int); + method public static java.util.Spliterator.OfLong spliterator(long[]); + method public static java.util.Spliterator.OfLong spliterator(long[], int, int); + method public static java.util.Spliterator.OfDouble spliterator(double[]); + method public static java.util.Spliterator.OfDouble spliterator(double[], int, int); method public static java.lang.String toString(long[]); method public static java.lang.String toString(int[]); method public static java.lang.String toString(short[]); @@ -57937,6 +57948,7 @@ package java.util { method public java.lang.Object clone(); method public java.util.Iterator<E> iterator(); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public class Hashtable extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable { @@ -58081,6 +58093,7 @@ package java.util { method public E removeLast(); method public boolean removeLastOccurrence(java.lang.Object); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public abstract interface List implements java.util.Collection { @@ -58247,6 +58260,8 @@ package java.util { } public static abstract interface Map.Entry { + method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(); + method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(java.util.Comparator<? super K>); method public abstract boolean equals(java.lang.Object); method public abstract K getKey(); method public abstract V getValue(); @@ -58425,6 +58440,7 @@ package java.util { public class PriorityQueue extends java.util.AbstractQueue implements java.io.Serializable { ctor public PriorityQueue(); ctor public PriorityQueue(int); + ctor public PriorityQueue(java.util.Comparator<? super E>); ctor public PriorityQueue(int, java.util.Comparator<? super E>); ctor public PriorityQueue(java.util.Collection<? extends E>); ctor public PriorityQueue(java.util.PriorityQueue<? extends E>); @@ -58435,6 +58451,7 @@ package java.util { method public E peek(); method public E poll(); method public int size(); + method public final java.util.Spliterator<E> spliterator(); } public class Properties extends java.util.Hashtable { @@ -58677,6 +58694,111 @@ package java.util { method public abstract java.util.SortedSet<E> tailSet(E); } + public abstract interface Spliterator { + method public abstract int characteristics(); + method public abstract long estimateSize(); + method public default void forEachRemaining(java.util.function.Consumer<? super T>); + method public default java.util.Comparator<? super T> getComparator(); + method public default long getExactSizeIfKnown(); + method public default boolean hasCharacteristics(int); + method public abstract boolean tryAdvance(java.util.function.Consumer<? super T>); + method public abstract java.util.Spliterator<T> trySplit(); + field public static final int CONCURRENT = 4096; // 0x1000 + field public static final int DISTINCT = 1; // 0x1 + field public static final int IMMUTABLE = 1024; // 0x400 + field public static final int NONNULL = 256; // 0x100 + field public static final int ORDERED = 16; // 0x10 + field public static final int SIZED = 64; // 0x40 + field public static final int SORTED = 4; // 0x4 + field public static final int SUBSIZED = 16384; // 0x4000 + } + + public static abstract interface Spliterator.OfDouble implements java.util.Spliterator.OfPrimitive { + method public default void forEachRemaining(java.util.function.DoubleConsumer); + method public default void forEachRemaining(java.util.function.Consumer<? super java.lang.Double>); + method public abstract boolean tryAdvance(java.util.function.DoubleConsumer); + method public default boolean tryAdvance(java.util.function.Consumer<? super java.lang.Double>); + method public abstract java.util.Spliterator.OfDouble trySplit(); + } + + public static abstract interface Spliterator.OfInt implements java.util.Spliterator.OfPrimitive { + method public default void forEachRemaining(java.util.function.IntConsumer); + method public default void forEachRemaining(java.util.function.Consumer<? super java.lang.Integer>); + method public abstract boolean tryAdvance(java.util.function.IntConsumer); + method public default boolean tryAdvance(java.util.function.Consumer<? super java.lang.Integer>); + method public abstract java.util.Spliterator.OfInt trySplit(); + } + + public static abstract interface Spliterator.OfLong implements java.util.Spliterator.OfPrimitive { + method public default void forEachRemaining(java.util.function.LongConsumer); + method public default void forEachRemaining(java.util.function.Consumer<? super java.lang.Long>); + method public abstract boolean tryAdvance(java.util.function.LongConsumer); + method public default boolean tryAdvance(java.util.function.Consumer<? super java.lang.Long>); + method public abstract java.util.Spliterator.OfLong trySplit(); + } + + public static abstract interface Spliterator.OfPrimitive implements java.util.Spliterator { + method public default void forEachRemaining(T_CONS); + method public abstract boolean tryAdvance(T_CONS); + method public abstract T_SPLITR trySplit(); + } + + public final class Spliterators { + method public static java.util.Spliterator.OfDouble emptyDoubleSpliterator(); + method public static java.util.Spliterator.OfInt emptyIntSpliterator(); + method public static java.util.Spliterator.OfLong emptyLongSpliterator(); + method public static java.util.Spliterator<T> emptySpliterator(); + method public static java.util.Iterator<T> iterator(java.util.Spliterator<? extends T>); + method public static java.util.PrimitiveIterator.OfInt iterator(java.util.Spliterator.OfInt); + method public static java.util.PrimitiveIterator.OfLong iterator(java.util.Spliterator.OfLong); + method public static java.util.PrimitiveIterator.OfDouble iterator(java.util.Spliterator.OfDouble); + method public static java.util.Spliterator<T> spliterator(java.lang.Object[], int); + method public static java.util.Spliterator<T> spliterator(java.lang.Object[], int, int, int); + method public static java.util.Spliterator.OfInt spliterator(int[], int); + method public static java.util.Spliterator.OfInt spliterator(int[], int, int, int); + method public static java.util.Spliterator.OfLong spliterator(long[], int); + method public static java.util.Spliterator.OfLong spliterator(long[], int, int, int); + method public static java.util.Spliterator.OfDouble spliterator(double[], int); + method public static java.util.Spliterator.OfDouble spliterator(double[], int, int, int); + method public static java.util.Spliterator<T> spliterator(java.util.Collection<? extends T>, int); + method public static java.util.Spliterator<T> spliterator(java.util.Iterator<? extends T>, long, int); + method public static java.util.Spliterator.OfInt spliterator(java.util.PrimitiveIterator.OfInt, long, int); + method public static java.util.Spliterator.OfLong spliterator(java.util.PrimitiveIterator.OfLong, long, int); + method public static java.util.Spliterator.OfDouble spliterator(java.util.PrimitiveIterator.OfDouble, long, int); + method public static java.util.Spliterator<T> spliteratorUnknownSize(java.util.Iterator<? extends T>, int); + method public static java.util.Spliterator.OfInt spliteratorUnknownSize(java.util.PrimitiveIterator.OfInt, int); + method public static java.util.Spliterator.OfLong spliteratorUnknownSize(java.util.PrimitiveIterator.OfLong, int); + method public static java.util.Spliterator.OfDouble spliteratorUnknownSize(java.util.PrimitiveIterator.OfDouble, int); + } + + public static abstract class Spliterators.AbstractDoubleSpliterator implements java.util.Spliterator.OfDouble { + ctor protected Spliterators.AbstractDoubleSpliterator(long, int); + method public int characteristics(); + method public long estimateSize(); + method public java.util.Spliterator.OfDouble trySplit(); + } + + public static abstract class Spliterators.AbstractIntSpliterator implements java.util.Spliterator.OfInt { + ctor protected Spliterators.AbstractIntSpliterator(long, int); + method public int characteristics(); + method public long estimateSize(); + method public java.util.Spliterator.OfInt trySplit(); + } + + public static abstract class Spliterators.AbstractLongSpliterator implements java.util.Spliterator.OfLong { + ctor protected Spliterators.AbstractLongSpliterator(long, int); + method public int characteristics(); + method public long estimateSize(); + method public java.util.Spliterator.OfLong trySplit(); + } + + public static abstract class Spliterators.AbstractSpliterator implements java.util.Spliterator { + ctor protected Spliterators.AbstractSpliterator(long, int); + method public int characteristics(); + method public long estimateSize(); + method public java.util.Spliterator<T> trySplit(); + } + public class Stack extends java.util.Vector { ctor public Stack(); method public boolean empty(); @@ -58816,6 +58938,7 @@ package java.util { method public E pollFirst(); method public E pollLast(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public java.util.NavigableSet<E> subSet(E, boolean, E, boolean); method public java.util.SortedSet<E> subSet(E, E); method public java.util.NavigableSet<E> tailSet(E, boolean); @@ -58872,6 +58995,7 @@ package java.util { method public synchronized void setElementAt(E, int); method public synchronized void setSize(int); method public synchronized int size(); + method public java.util.Spliterator<E> spliterator(); method public synchronized void trimToSize(); field protected int capacityIncrement; field protected int elementCount; diff --git a/api/system-current.txt b/api/system-current.txt index 59c162c91e44..23b9d97efd98 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -54005,6 +54005,7 @@ package java.lang { public abstract interface Iterable { method public default void forEach(java.util.function.Consumer<? super T>); method public abstract java.util.Iterator<T> iterator(); + method public default java.util.Spliterator<T> spliterator(); } public class LinkageError extends java.lang.Error { @@ -60425,6 +60426,7 @@ package java.util { method public E removeLast(); method public boolean removeLastOccurrence(java.lang.Object); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public class ArrayList extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { @@ -60436,6 +60438,7 @@ package java.util { method public void forEach(java.util.function.Consumer<? super E>); method public E get(int); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public void trimToSize(); } @@ -60536,6 +60539,14 @@ package java.util { method public static void sort(java.lang.Object[], int, int); method public static void sort(T[], java.util.Comparator<? super T>); method public static void sort(T[], int, int, java.util.Comparator<? super T>); + method public static java.util.Spliterator<T> spliterator(T[]); + method public static java.util.Spliterator<T> spliterator(T[], int, int); + method public static java.util.Spliterator.OfInt spliterator(int[]); + method public static java.util.Spliterator.OfInt spliterator(int[], int, int); + method public static java.util.Spliterator.OfLong spliterator(long[]); + method public static java.util.Spliterator.OfLong spliterator(long[], int, int); + method public static java.util.Spliterator.OfDouble spliterator(double[]); + method public static java.util.Spliterator.OfDouble spliterator(double[], int, int); method public static java.lang.String toString(long[]); method public static java.lang.String toString(int[]); method public static java.lang.String toString(short[]); @@ -61035,6 +61046,7 @@ package java.util { method public java.lang.Object clone(); method public java.util.Iterator<E> iterator(); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public class Hashtable extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable { @@ -61179,6 +61191,7 @@ package java.util { method public E removeLast(); method public boolean removeLastOccurrence(java.lang.Object); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public abstract interface List implements java.util.Collection { @@ -61345,6 +61358,8 @@ package java.util { } public static abstract interface Map.Entry { + method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(); + method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(java.util.Comparator<? super K>); method public abstract boolean equals(java.lang.Object); method public abstract K getKey(); method public abstract V getValue(); @@ -61523,6 +61538,7 @@ package java.util { public class PriorityQueue extends java.util.AbstractQueue implements java.io.Serializable { ctor public PriorityQueue(); ctor public PriorityQueue(int); + ctor public PriorityQueue(java.util.Comparator<? super E>); ctor public PriorityQueue(int, java.util.Comparator<? super E>); ctor public PriorityQueue(java.util.Collection<? extends E>); ctor public PriorityQueue(java.util.PriorityQueue<? extends E>); @@ -61533,6 +61549,7 @@ package java.util { method public E peek(); method public E poll(); method public int size(); + method public final java.util.Spliterator<E> spliterator(); } public class Properties extends java.util.Hashtable { @@ -61775,6 +61792,111 @@ package java.util { method public abstract java.util.SortedSet<E> tailSet(E); } + public abstract interface Spliterator { + method public abstract int characteristics(); + method public abstract long estimateSize(); + method public default void forEachRemaining(java.util.function.Consumer<? super T>); + method public default java.util.Comparator<? super T> getComparator(); + method public default long getExactSizeIfKnown(); + method public default boolean hasCharacteristics(int); + method public abstract boolean tryAdvance(java.util.function.Consumer<? super T>); + method public abstract java.util.Spliterator<T> trySplit(); + field public static final int CONCURRENT = 4096; // 0x1000 + field public static final int DISTINCT = 1; // 0x1 + field public static final int IMMUTABLE = 1024; // 0x400 + field public static final int NONNULL = 256; // 0x100 + field public static final int ORDERED = 16; // 0x10 + field public static final int SIZED = 64; // 0x40 + field public static final int SORTED = 4; // 0x4 + field public static final int SUBSIZED = 16384; // 0x4000 + } + + public static abstract interface Spliterator.OfDouble implements java.util.Spliterator.OfPrimitive { + method public default void forEachRemaining(java.util.function.DoubleConsumer); + method public default void forEachRemaining(java.util.function.Consumer<? super java.lang.Double>); + method public abstract boolean tryAdvance(java.util.function.DoubleConsumer); + method public default boolean tryAdvance(java.util.function.Consumer<? super java.lang.Double>); + method public abstract java.util.Spliterator.OfDouble trySplit(); + } + + public static abstract interface Spliterator.OfInt implements java.util.Spliterator.OfPrimitive { + method public default void forEachRemaining(java.util.function.IntConsumer); + method public default void forEachRemaining(java.util.function.Consumer<? super java.lang.Integer>); + method public abstract boolean tryAdvance(java.util.function.IntConsumer); + method public default boolean tryAdvance(java.util.function.Consumer<? super java.lang.Integer>); + method public abstract java.util.Spliterator.OfInt trySplit(); + } + + public static abstract interface Spliterator.OfLong implements java.util.Spliterator.OfPrimitive { + method public default void forEachRemaining(java.util.function.LongConsumer); + method public default void forEachRemaining(java.util.function.Consumer<? super java.lang.Long>); + method public abstract boolean tryAdvance(java.util.function.LongConsumer); + method public default boolean tryAdvance(java.util.function.Consumer<? super java.lang.Long>); + method public abstract java.util.Spliterator.OfLong trySplit(); + } + + public static abstract interface Spliterator.OfPrimitive implements java.util.Spliterator { + method public default void forEachRemaining(T_CONS); + method public abstract boolean tryAdvance(T_CONS); + method public abstract T_SPLITR trySplit(); + } + + public final class Spliterators { + method public static java.util.Spliterator.OfDouble emptyDoubleSpliterator(); + method public static java.util.Spliterator.OfInt emptyIntSpliterator(); + method public static java.util.Spliterator.OfLong emptyLongSpliterator(); + method public static java.util.Spliterator<T> emptySpliterator(); + method public static java.util.Iterator<T> iterator(java.util.Spliterator<? extends T>); + method public static java.util.PrimitiveIterator.OfInt iterator(java.util.Spliterator.OfInt); + method public static java.util.PrimitiveIterator.OfLong iterator(java.util.Spliterator.OfLong); + method public static java.util.PrimitiveIterator.OfDouble iterator(java.util.Spliterator.OfDouble); + method public static java.util.Spliterator<T> spliterator(java.lang.Object[], int); + method public static java.util.Spliterator<T> spliterator(java.lang.Object[], int, int, int); + method public static java.util.Spliterator.OfInt spliterator(int[], int); + method public static java.util.Spliterator.OfInt spliterator(int[], int, int, int); + method public static java.util.Spliterator.OfLong spliterator(long[], int); + method public static java.util.Spliterator.OfLong spliterator(long[], int, int, int); + method public static java.util.Spliterator.OfDouble spliterator(double[], int); + method public static java.util.Spliterator.OfDouble spliterator(double[], int, int, int); + method public static java.util.Spliterator<T> spliterator(java.util.Collection<? extends T>, int); + method public static java.util.Spliterator<T> spliterator(java.util.Iterator<? extends T>, long, int); + method public static java.util.Spliterator.OfInt spliterator(java.util.PrimitiveIterator.OfInt, long, int); + method public static java.util.Spliterator.OfLong spliterator(java.util.PrimitiveIterator.OfLong, long, int); + method public static java.util.Spliterator.OfDouble spliterator(java.util.PrimitiveIterator.OfDouble, long, int); + method public static java.util.Spliterator<T> spliteratorUnknownSize(java.util.Iterator<? extends T>, int); + method public static java.util.Spliterator.OfInt spliteratorUnknownSize(java.util.PrimitiveIterator.OfInt, int); + method public static java.util.Spliterator.OfLong spliteratorUnknownSize(java.util.PrimitiveIterator.OfLong, int); + method public static java.util.Spliterator.OfDouble spliteratorUnknownSize(java.util.PrimitiveIterator.OfDouble, int); + } + + public static abstract class Spliterators.AbstractDoubleSpliterator implements java.util.Spliterator.OfDouble { + ctor protected Spliterators.AbstractDoubleSpliterator(long, int); + method public int characteristics(); + method public long estimateSize(); + method public java.util.Spliterator.OfDouble trySplit(); + } + + public static abstract class Spliterators.AbstractIntSpliterator implements java.util.Spliterator.OfInt { + ctor protected Spliterators.AbstractIntSpliterator(long, int); + method public int characteristics(); + method public long estimateSize(); + method public java.util.Spliterator.OfInt trySplit(); + } + + public static abstract class Spliterators.AbstractLongSpliterator implements java.util.Spliterator.OfLong { + ctor protected Spliterators.AbstractLongSpliterator(long, int); + method public int characteristics(); + method public long estimateSize(); + method public java.util.Spliterator.OfLong trySplit(); + } + + public static abstract class Spliterators.AbstractSpliterator implements java.util.Spliterator { + ctor protected Spliterators.AbstractSpliterator(long, int); + method public int characteristics(); + method public long estimateSize(); + method public java.util.Spliterator<T> trySplit(); + } + public class Stack extends java.util.Vector { ctor public Stack(); method public boolean empty(); @@ -61914,6 +62036,7 @@ package java.util { method public E pollFirst(); method public E pollLast(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public java.util.NavigableSet<E> subSet(E, boolean, E, boolean); method public java.util.SortedSet<E> subSet(E, E); method public java.util.NavigableSet<E> tailSet(E, boolean); @@ -61970,6 +62093,7 @@ package java.util { method public synchronized void setElementAt(E, int); method public synchronized void setSize(int); method public synchronized int size(); + method public java.util.Spliterator<E> spliterator(); method public synchronized void trimToSize(); field protected int capacityIncrement; field protected int elementCount; diff --git a/api/test-current.txt b/api/test-current.txt index d83c01799ff9..cdffa46df172 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -50981,6 +50981,7 @@ package java.lang { public abstract interface Iterable { method public default void forEach(java.util.function.Consumer<? super T>); method public abstract java.util.Iterator<T> iterator(); + method public default java.util.Spliterator<T> spliterator(); } public class LinkageError extends java.lang.Error { @@ -57401,6 +57402,7 @@ package java.util { method public E removeLast(); method public boolean removeLastOccurrence(java.lang.Object); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public class ArrayList extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { @@ -57412,6 +57414,7 @@ package java.util { method public void forEach(java.util.function.Consumer<? super E>); method public E get(int); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public void trimToSize(); } @@ -57512,6 +57515,14 @@ package java.util { method public static void sort(java.lang.Object[], int, int); method public static void sort(T[], java.util.Comparator<? super T>); method public static void sort(T[], int, int, java.util.Comparator<? super T>); + method public static java.util.Spliterator<T> spliterator(T[]); + method public static java.util.Spliterator<T> spliterator(T[], int, int); + method public static java.util.Spliterator.OfInt spliterator(int[]); + method public static java.util.Spliterator.OfInt spliterator(int[], int, int); + method public static java.util.Spliterator.OfLong spliterator(long[]); + method public static java.util.Spliterator.OfLong spliterator(long[], int, int); + method public static java.util.Spliterator.OfDouble spliterator(double[]); + method public static java.util.Spliterator.OfDouble spliterator(double[], int, int); method public static java.lang.String toString(long[]); method public static java.lang.String toString(int[]); method public static java.lang.String toString(short[]); @@ -58011,6 +58022,7 @@ package java.util { method public java.lang.Object clone(); method public java.util.Iterator<E> iterator(); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public class Hashtable extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable { @@ -58155,6 +58167,7 @@ package java.util { method public E removeLast(); method public boolean removeLastOccurrence(java.lang.Object); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public abstract interface List implements java.util.Collection { @@ -58321,6 +58334,8 @@ package java.util { } public static abstract interface Map.Entry { + method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(); + method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(java.util.Comparator<? super K>); method public abstract boolean equals(java.lang.Object); method public abstract K getKey(); method public abstract V getValue(); @@ -58499,6 +58514,7 @@ package java.util { public class PriorityQueue extends java.util.AbstractQueue implements java.io.Serializable { ctor public PriorityQueue(); ctor public PriorityQueue(int); + ctor public PriorityQueue(java.util.Comparator<? super E>); ctor public PriorityQueue(int, java.util.Comparator<? super E>); ctor public PriorityQueue(java.util.Collection<? extends E>); ctor public PriorityQueue(java.util.PriorityQueue<? extends E>); @@ -58509,6 +58525,7 @@ package java.util { method public E peek(); method public E poll(); method public int size(); + method public final java.util.Spliterator<E> spliterator(); } public class Properties extends java.util.Hashtable { @@ -58751,6 +58768,111 @@ package java.util { method public abstract java.util.SortedSet<E> tailSet(E); } + public abstract interface Spliterator { + method public abstract int characteristics(); + method public abstract long estimateSize(); + method public default void forEachRemaining(java.util.function.Consumer<? super T>); + method public default java.util.Comparator<? super T> getComparator(); + method public default long getExactSizeIfKnown(); + method public default boolean hasCharacteristics(int); + method public abstract boolean tryAdvance(java.util.function.Consumer<? super T>); + method public abstract java.util.Spliterator<T> trySplit(); + field public static final int CONCURRENT = 4096; // 0x1000 + field public static final int DISTINCT = 1; // 0x1 + field public static final int IMMUTABLE = 1024; // 0x400 + field public static final int NONNULL = 256; // 0x100 + field public static final int ORDERED = 16; // 0x10 + field public static final int SIZED = 64; // 0x40 + field public static final int SORTED = 4; // 0x4 + field public static final int SUBSIZED = 16384; // 0x4000 + } + + public static abstract interface Spliterator.OfDouble implements java.util.Spliterator.OfPrimitive { + method public default void forEachRemaining(java.util.function.DoubleConsumer); + method public default void forEachRemaining(java.util.function.Consumer<? super java.lang.Double>); + method public abstract boolean tryAdvance(java.util.function.DoubleConsumer); + method public default boolean tryAdvance(java.util.function.Consumer<? super java.lang.Double>); + method public abstract java.util.Spliterator.OfDouble trySplit(); + } + + public static abstract interface Spliterator.OfInt implements java.util.Spliterator.OfPrimitive { + method public default void forEachRemaining(java.util.function.IntConsumer); + method public default void forEachRemaining(java.util.function.Consumer<? super java.lang.Integer>); + method public abstract boolean tryAdvance(java.util.function.IntConsumer); + method public default boolean tryAdvance(java.util.function.Consumer<? super java.lang.Integer>); + method public abstract java.util.Spliterator.OfInt trySplit(); + } + + public static abstract interface Spliterator.OfLong implements java.util.Spliterator.OfPrimitive { + method public default void forEachRemaining(java.util.function.LongConsumer); + method public default void forEachRemaining(java.util.function.Consumer<? super java.lang.Long>); + method public abstract boolean tryAdvance(java.util.function.LongConsumer); + method public default boolean tryAdvance(java.util.function.Consumer<? super java.lang.Long>); + method public abstract java.util.Spliterator.OfLong trySplit(); + } + + public static abstract interface Spliterator.OfPrimitive implements java.util.Spliterator { + method public default void forEachRemaining(T_CONS); + method public abstract boolean tryAdvance(T_CONS); + method public abstract T_SPLITR trySplit(); + } + + public final class Spliterators { + method public static java.util.Spliterator.OfDouble emptyDoubleSpliterator(); + method public static java.util.Spliterator.OfInt emptyIntSpliterator(); + method public static java.util.Spliterator.OfLong emptyLongSpliterator(); + method public static java.util.Spliterator<T> emptySpliterator(); + method public static java.util.Iterator<T> iterator(java.util.Spliterator<? extends T>); + method public static java.util.PrimitiveIterator.OfInt iterator(java.util.Spliterator.OfInt); + method public static java.util.PrimitiveIterator.OfLong iterator(java.util.Spliterator.OfLong); + method public static java.util.PrimitiveIterator.OfDouble iterator(java.util.Spliterator.OfDouble); + method public static java.util.Spliterator<T> spliterator(java.lang.Object[], int); + method public static java.util.Spliterator<T> spliterator(java.lang.Object[], int, int, int); + method public static java.util.Spliterator.OfInt spliterator(int[], int); + method public static java.util.Spliterator.OfInt spliterator(int[], int, int, int); + method public static java.util.Spliterator.OfLong spliterator(long[], int); + method public static java.util.Spliterator.OfLong spliterator(long[], int, int, int); + method public static java.util.Spliterator.OfDouble spliterator(double[], int); + method public static java.util.Spliterator.OfDouble spliterator(double[], int, int, int); + method public static java.util.Spliterator<T> spliterator(java.util.Collection<? extends T>, int); + method public static java.util.Spliterator<T> spliterator(java.util.Iterator<? extends T>, long, int); + method public static java.util.Spliterator.OfInt spliterator(java.util.PrimitiveIterator.OfInt, long, int); + method public static java.util.Spliterator.OfLong spliterator(java.util.PrimitiveIterator.OfLong, long, int); + method public static java.util.Spliterator.OfDouble spliterator(java.util.PrimitiveIterator.OfDouble, long, int); + method public static java.util.Spliterator<T> spliteratorUnknownSize(java.util.Iterator<? extends T>, int); + method public static java.util.Spliterator.OfInt spliteratorUnknownSize(java.util.PrimitiveIterator.OfInt, int); + method public static java.util.Spliterator.OfLong spliteratorUnknownSize(java.util.PrimitiveIterator.OfLong, int); + method public static java.util.Spliterator.OfDouble spliteratorUnknownSize(java.util.PrimitiveIterator.OfDouble, int); + } + + public static abstract class Spliterators.AbstractDoubleSpliterator implements java.util.Spliterator.OfDouble { + ctor protected Spliterators.AbstractDoubleSpliterator(long, int); + method public int characteristics(); + method public long estimateSize(); + method public java.util.Spliterator.OfDouble trySplit(); + } + + public static abstract class Spliterators.AbstractIntSpliterator implements java.util.Spliterator.OfInt { + ctor protected Spliterators.AbstractIntSpliterator(long, int); + method public int characteristics(); + method public long estimateSize(); + method public java.util.Spliterator.OfInt trySplit(); + } + + public static abstract class Spliterators.AbstractLongSpliterator implements java.util.Spliterator.OfLong { + ctor protected Spliterators.AbstractLongSpliterator(long, int); + method public int characteristics(); + method public long estimateSize(); + method public java.util.Spliterator.OfLong trySplit(); + } + + public static abstract class Spliterators.AbstractSpliterator implements java.util.Spliterator { + ctor protected Spliterators.AbstractSpliterator(long, int); + method public int characteristics(); + method public long estimateSize(); + method public java.util.Spliterator<T> trySplit(); + } + public class Stack extends java.util.Vector { ctor public Stack(); method public boolean empty(); @@ -58890,6 +59012,7 @@ package java.util { method public E pollFirst(); method public E pollLast(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public java.util.NavigableSet<E> subSet(E, boolean, E, boolean); method public java.util.SortedSet<E> subSet(E, E); method public java.util.NavigableSet<E> tailSet(E, boolean); @@ -58946,6 +59069,7 @@ package java.util { method public synchronized void setElementAt(E, int); method public synchronized void setSize(int); method public synchronized int size(); + method public java.util.Spliterator<E> spliterator(); method public synchronized void trimToSize(); field protected int capacityIncrement; field protected int elementCount; diff --git a/core/java/android/app/AlarmManager.java b/core/java/android/app/AlarmManager.java index 455f8694f1a6..b08142add4d8 100644 --- a/core/java/android/app/AlarmManager.java +++ b/core/java/android/app/AlarmManager.java @@ -985,11 +985,16 @@ public class AlarmManager { /** * Gets information about the next alarm clock currently scheduled. * - * The alarm clocks considered are those scheduled by {@link #setAlarmClock} - * from any package of the calling user. + * The alarm clocks considered are those scheduled by any application + * using the {@link #setAlarmClock} method. + * + * @return An {@link AlarmClockInfo} object describing the next upcoming alarm + * clock event that will occur. If there are no alarm clock events currently + * scheduled, this method will return {@code null}. * * @see #setAlarmClock * @see AlarmClockInfo + * @see #ACTION_NEXT_ALARM_CLOCK_CHANGED */ public AlarmClockInfo getNextAlarmClock() { return getNextAlarmClock(UserHandle.myUserId()); @@ -998,11 +1003,16 @@ public class AlarmManager { /** * Gets information about the next alarm clock currently scheduled. * - * The alarm clocks considered are those scheduled by {@link #setAlarmClock} - * from any package of the given {@parm userId}. + * The alarm clocks considered are those scheduled by any application + * using the {@link #setAlarmClock} method within the given user. + * + * @return An {@link AlarmClockInfo} object describing the next upcoming alarm + * clock event that will occur within the given user. If there are no alarm clock + * events currently scheduled in that user, this method will return {@code null}. * * @see #setAlarmClock * @see AlarmClockInfo + * @see #ACTION_NEXT_ALARM_CLOCK_CHANGED * * @hide */ @@ -1015,7 +1025,7 @@ public class AlarmManager { } /** - * An immutable description of an alarm clock. + * An immutable description of a scheduled "alarm clock" event. * * @see AlarmManager#setAlarmClock * @see AlarmManager#getNextAlarmClock diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index af9705f91f9e..53a6351b36e6 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -3723,7 +3723,9 @@ public class DevicePolicyManager { * be hidden, it will not show up in recents, will not be able to show toasts or dialogs * or ring the device. * - * <p>The package must already be installed. + * <p>The package must already be installed. If the package is uninstalled while suspended + * the package will no longer be suspended. The admin can block this by using + * {@link #setUninstallBlocked}. * * @param admin The name of the admin component to check. * @param packageNames The package names to suspend or unsuspend. diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index ec536e020d04..1f603ef80638 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -1000,8 +1000,8 @@ public class PackageInstaller { } /** - * Optionally set the URI where this package was downloaded from. Used for - * verification purposes. + * Optionally set the URI where this package was downloaded from. This is + * informational and may be used as a signal for anti-malware purposes. * * @see Intent#EXTRA_ORIGINATING_URI */ @@ -1010,7 +1010,8 @@ public class PackageInstaller { } /** - * Sets the UID that initiated package installation. Used for verification purposes. + * Sets the UID that initiated package installation. This is informational + * and may be used as a signal for anti-malware purposes. * * @see PackageManager#EXTRA_VERIFICATION_INSTALLER_UID */ @@ -1019,8 +1020,8 @@ public class PackageInstaller { } /** - * Optionally set the URI that referred you to install this package. Used - * for verification purposes. + * Optionally set the URI that referred you to install this package. This is + * informational and may be used as a signal for anti-malware purposes. * * @see Intent#EXTRA_REFERRER */ diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 0dc856c5da4f..e1e8a07310ac 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -1596,9 +1596,9 @@ public abstract class PackageManager { /** * Feature for {@link #getSystemAvailableFeatures} and - * {@link #hasSystemFeature}: If this feature is supported, the Vulkan native API will enumerate - * at least one {@code VkPhysicalDevice}, and the feature version will indicate what - * level of optional hardware features limits it supports. + * {@link #hasSystemFeature(String, int)}: If this feature is supported, the Vulkan native API + * will enumerate at least one {@code VkPhysicalDevice}, and the feature version will indicate + * what level of optional hardware features limits it supports. * <p> * Level 0 includes the base Vulkan requirements as well as: * <ul><li>{@code VkPhysicalDeviceFeatures::textureCompressionETC2}</li></ul> @@ -1623,7 +1623,7 @@ public abstract class PackageManager { /** * Feature for {@link #getSystemAvailableFeatures} and - * {@link #hasSystemFeature}: The version of this feature indicates the highest + * {@link #hasSystemFeature(String, int)}: The version of this feature indicates the highest * {@code VkPhysicalDeviceProperties::apiVersion} supported by the physical devices that support * the hardware level indicated by {@link #FEATURE_VULKAN_HARDWARE_LEVEL}. The feature version * uses the same encoding as Vulkan version numbers: @@ -5367,6 +5367,9 @@ public abstract class PackageManager { * will be hidden, the application will not show up in recents, will not be able to show * toasts or dialogs or ring the device. * + * <p>The package must already be installed. If the package is uninstalled while suspended + * the package will no longer be suspended. + * * @param packageNames The names of the packages to set the suspended status. * @param suspended If set to {@code true} than the packages will be suspended, if set to * {@code false} the packages will be unsuspended. diff --git a/core/java/android/service/notification/NotificationRankerService.java b/core/java/android/service/notification/NotificationRankerService.java index e32535438514..47fdac6bf4c2 100644 --- a/core/java/android/service/notification/NotificationRankerService.java +++ b/core/java/android/service/notification/NotificationRankerService.java @@ -119,7 +119,13 @@ public abstract class NotificationRankerService extends NotificationListenerServ @Override public void registerAsSystemService(Context context, ComponentName componentName, int currentUser) { - throw new IllegalStateException("the ranker may not start itself."); + throw new UnsupportedOperationException("the ranker lifecycle is managed by the system."); + } + + /** @hide */ + @Override + public void unregisterAsSystemService() { + throw new UnsupportedOperationException("the ranker lifecycle is managed by the system."); } @Override diff --git a/core/java/android/transition/ArcMotion.java b/core/java/android/transition/ArcMotion.java index fa4c8d29897d..70443ba90f45 100644 --- a/core/java/android/transition/ArcMotion.java +++ b/core/java/android/transition/ArcMotion.java @@ -15,13 +15,13 @@ */ package android.transition; -import com.android.internal.R; - import android.content.Context; import android.content.res.TypedArray; import android.graphics.Path; import android.util.AttributeSet; +import com.android.internal.R; + /** * A PathMotion that generates a curved path along an arc on an imaginary circle containing * the two points. If the horizontal distance between the points is less than the vertical @@ -207,7 +207,7 @@ public class ArcMotion extends PathMotion { ey = (startY + endY) / 2; } else { float deltaX = endX - startX; - float deltaY = startY - endY; // Y is inverted compared to diagram above. + float deltaY = endY - startY; // hypotenuse squared. float h2 = deltaX * deltaX + deltaY * deltaY; @@ -219,24 +219,35 @@ public class ArcMotion extends PathMotion { float midDist2 = h2 * 0.25f; float minimumArcDist2 = 0; + boolean isQuadrant1Or3 = (deltaX * deltaY) > 0; - if (Math.abs(deltaX) < Math.abs(deltaY)) { + if ((Math.abs(deltaX) < Math.abs(deltaY))) { // Similar triangles bfa and bde mean that (ab/fb = eb/bd) // Therefore, eb = ab * bd / fb // ab = hypotenuse // bd = hypotenuse/2 // fb = deltaY float eDistY = h2 / (2 * deltaY); - ey = endY + eDistY; - ex = endX; + if (isQuadrant1Or3) { + ey = startY + eDistY; + ex = startX; + } else { + ey = endY - eDistY; + ex = endX; + } minimumArcDist2 = midDist2 * mMinimumVerticalTangent * mMinimumVerticalTangent; } else { // Same as above, but flip X & Y float eDistX = h2 / (2 * deltaX); - ex = endX + eDistX; - ey = endY; + if (isQuadrant1Or3) { + ex = endX - eDistX; + ey = endY; + } else { + ex = startX + eDistX; + ey = startY; + } minimumArcDist2 = midDist2 * mMinimumHorizontalTangent * mMinimumHorizontalTangent; diff --git a/core/java/com/android/internal/policy/DividerSnapAlgorithm.java b/core/java/com/android/internal/policy/DividerSnapAlgorithm.java index 84d0fc70b1ca..9907ea92670b 100644 --- a/core/java/com/android/internal/policy/DividerSnapAlgorithm.java +++ b/core/java/com/android/internal/policy/DividerSnapAlgorithm.java @@ -279,6 +279,26 @@ public class DividerSnapAlgorithm { } /** + * Cycles through all non-dismiss targets with a stepping of {@param increment}. It moves left + * if {@param increment} is negative and moves right otherwise. + */ + public SnapTarget cycleNonDismissTarget(SnapTarget snapTarget, int increment) { + int index = mTargets.indexOf(snapTarget); + if (index != -1) { + SnapTarget newTarget = mTargets.get((index + mTargets.size() + increment) + % mTargets.size()); + if (newTarget == mDismissStartTarget) { + return mLastSplitTarget; + } else if (newTarget == mDismissEndTarget) { + return mFirstSplitTarget; + } else { + return newTarget; + } + } + return snapTarget; + } + + /** * Represents a snap target for the divider. */ public static class SnapTarget { diff --git a/core/jni/android_hardware_camera2_DngCreator.cpp b/core/jni/android_hardware_camera2_DngCreator.cpp index c6baf1c645bf..d80d8f262189 100644 --- a/core/jni/android_hardware_camera2_DngCreator.cpp +++ b/core/jni/android_hardware_camera2_DngCreator.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#define LOG_NDEBUG 0 +//#define LOG_NDEBUG 0 #define LOG_TAG "DngCreator_JNI" #include <inttypes.h> #include <string.h> @@ -1792,6 +1792,8 @@ static sp<TiffWriter> DngCreator_setup(JNIEnv* env, jobject thiz, uint32_t image { // Set up orientation tags. + // Note: There's only one orientation field for the whole file, in IFD0 + // The main image and any thumbnails therefore have the same orientation. uint16_t orientation = nativeContext->getOrientation(); BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_ORIENTATION, 1, &orientation, TIFF_IFD_0), env, TAG_ORIENTATION, writer); @@ -1873,7 +1875,6 @@ static sp<TiffWriter> DngCreator_setup(JNIEnv* env, jobject thiz, uint32_t image } Vector<uint16_t> tagsToMove; - tagsToMove.add(TAG_ORIENTATION); tagsToMove.add(TAG_NEWSUBFILETYPE); tagsToMove.add(TAG_ACTIVEAREA); tagsToMove.add(TAG_BITSPERSAMPLE); @@ -1904,12 +1905,6 @@ static sp<TiffWriter> DngCreator_setup(JNIEnv* env, jobject thiz, uint32_t image return nullptr; } - // Make sure both IFDs get the same orientation tag - sp<TiffEntry> orientEntry = writer->getEntry(TAG_ORIENTATION, TIFF_IFD_SUB1); - if (orientEntry.get() != nullptr) { - writer->addEntry(orientEntry, TIFF_IFD_0); - } - // Setup thumbnail tags { diff --git a/core/res/res/values-mcc232-mnc11/config.xml b/core/res/res/values-mcc232-mnc11/config.xml new file mode 100644 index 000000000000..91e37b446077 --- /dev/null +++ b/core/res/res/values-mcc232-mnc11/config.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* + ** Copyright 2016, 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. + */ +--> + +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- Don't use roaming icon for considered operators --> + <string-array translatable="false" name="config_operatorConsideredNonRoaming"> + <item>23201</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc232-mnc12/config.xml b/core/res/res/values-mcc232-mnc12/config.xml new file mode 100644 index 000000000000..91e37b446077 --- /dev/null +++ b/core/res/res/values-mcc232-mnc12/config.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* + ** Copyright 2016, 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. + */ +--> + +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- Don't use roaming icon for considered operators --> + <string-array translatable="false" name="config_operatorConsideredNonRoaming"> + <item>23201</item> + </string-array> +</resources> diff --git a/docs/docs-documentation-redirect.html b/docs/docs-documentation-redirect.html index 98a265e87665..dbdf8b45acea 100644 --- a/docs/docs-documentation-redirect.html +++ b/docs/docs-documentation-redirect.html @@ -1,9 +1,9 @@ <html> <head> -<meta http-equiv="refresh" content="0;url=documentation.html"> +<meta http-equiv="refresh" content="0;url=reference/packages.html"> </head> <body> -<a href="documentation.html">click here if you are not redirected</a> +<a href="reference/packages.html">click here if you are not redirected</a> </body> </html> diff --git a/docs/docs-preview-index.html b/docs/docs-preview-index.html new file mode 100644 index 000000000000..e26b57c6c1eb --- /dev/null +++ b/docs/docs-preview-index.html @@ -0,0 +1,103 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" /> +<meta content="IE=edge" http-equiv="X-UA-Compatible"> +<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /> + +<title>Android N Developer Preview</title> + +<!-- STYLESHEETS --> +<link rel="stylesheet" +href="http://fonts.googleapis.com/css?family=Roboto+Condensed"> +<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold" + title="roboto"> +<link href="assets/css/default.css?v=17" rel="stylesheet" type="text/css"> +<!-- JAVASCRIPT --> +<script src="https://www.google.com/jsapi" type="text/javascript"></script> +<script src="assets/js/android_3p-bundle.js" type="text/javascript"></script> +<script type="text/javascript"> + var toRoot = "../"; + var metaTags = ["develop, getstarted, sdk, appquality, landing"]; + var devsite = false; +</script> +<script src="assets/js/docs.js?v=3" type="text/javascript"></script> +</head> + +<body> +<div id="header-wrapper"> + <div class="dac-header" id="header"> + <div class="dac-header-inner"> + <a class="dac-nav-toggle" data-dac-toggle-nav="" href="javascript:;" + title="Open navigation"> + <span class="dac-nav-hamburger"> + <span class="dac-nav-hamburger-top"></span> + <span class="dac-nav-hamburger-mid"></span> + <span class="dac-nav-hamburger-bot"></span> + </span> + </a> + <a class="dac-header-logo" href="index.html"> + <img class="dac-header-logo-image" src="assets/images/android_logo.png" + srcset="assets/images/android_logo@2x.png 2x" width="32" height="36" + alt="Android"> Developers + </a> + </div> + </div> +</div> +<nav class="dac-nav"> + <div class="dac-nav-dimmer" data-dac-toggle-nav=""></div> + <ul class="dac-nav-list" data-dac-nav=""> + <li class="dac-nav-item dac-nav-head"> + <a class="dac-nav-link dac-nav-logo" data-dac-toggle-nav="" + href="javascript:;" title="Close navigation"> + <img class="dac-logo-image" src="assets/images/android_logo.png" + srcset="assets/images/android_logo@2x.png 2x" width="32" height="36" + alt="Android"> Developers + </a> + </li> + <li class="dac-nav-item develop"> + <a class="dac-nav-link" href="reference/packages.html" + >API Reference</a> + </li> + </ul> +</nav> + +<section class="dac-expand" style="padding-top:40px;background-color:#eee"> + <div class="wrap" style="max-width:1100px;margin-top:0;height:100%"> + <div class="cols dac-hero-content" style="padding-bottom:1em;"> + <div class="col-11of16"> + + +<h1>Android N Developer Preview</h1> +<p> + Get ready for Android N! + <strong>Test your apps</strong> on Nexus devices. Support new system + behaviors to <strong>save power and memory</strong>. + Extend your apps with <strong>multi-window UI</strong>, + <strong>direct reply notifications</strong> and more. +</p> + +<h2>Get Started</h2> +<ul> + <li>View the <a href="reference/packages.html">API Reference</a></li> + <li>Read Diff Reports:</a> + <ul> + <li><a href="sdk/api_diff/n-preview-1/changes.html" + >API 23 --> Preview 1</a></li> + </ul> + </li> + <li>Downloads and additional documentation are available at the + <a href="http://developer.android.com/preview/index.html"> + Android N Developer Preview site</a></li> + <li>For information about Developer Preview 1, visit the + <a href="http://developer.android.com/preview/support.html">Support</a> + page.</li> +</ul> + + + </div> + </div> + </div> +</section> +</body> +</html> diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp index ddf0528467e0..4e3ed363e9ee 100644 --- a/libs/hwui/RecordingCanvas.cpp +++ b/libs/hwui/RecordingCanvas.cpp @@ -24,8 +24,8 @@ namespace android { namespace uirenderer { - -static Rect sUnreasonablyLargeBounds(-10000, -10000, 10000, 10000); +#define MIL_PIX 1000000 +static Rect sUnreasonablyLargeBounds(-MIL_PIX, -MIL_PIX, MIL_PIX, MIL_PIX); static const Rect& getConservativeOpBounds(const ClipBase* clip) { // if op is clipped, that rect can be used, but otherwise just use a conservatively large rect @@ -595,7 +595,7 @@ void RecordingCanvas::callDrawGLFunction(Functor* functor) { mDisplayList->functors.push_back(functor); auto clip = getRecordedClip(); addOp(alloc().create_trivial<FunctorOp>( - getConservativeOpBounds(clip), // TODO: explicitly define bounds + getConservativeOpBounds(clip), *(mState.currentSnapshot()->transform), clip, functor)); diff --git a/libs/hwui/tests/unit/FrameBuilderTests.cpp b/libs/hwui/tests/unit/FrameBuilderTests.cpp index 4c56a22b09b7..f147fd4be80e 100644 --- a/libs/hwui/tests/unit/FrameBuilderTests.cpp +++ b/libs/hwui/tests/unit/FrameBuilderTests.cpp @@ -349,6 +349,29 @@ RENDERTHREAD_TEST(FrameBuilder, textureLayer) { EXPECT_EQ(1, renderer.getIndex()); } +TEST(FrameBuilder, functor_reject) { + class FunctorTestRenderer : public TestRendererBase { + public: + void onFunctorOp(const FunctorOp& op, const BakedOpState& state) override { + EXPECT_EQ(0, mIndex++); + } + }; + Functor noopFunctor; + + // 1 million pixel tall view, scrolled down 80% + auto scrolledFunctorView = TestUtils::createNode(0, 0, 400, 1000000, + [&noopFunctor](RenderProperties& props, RecordingCanvas& canvas) { + canvas.translate(0, -800000); + canvas.callDrawGLFunction(&noopFunctor); + }); + + FrameBuilder frameBuilder(sEmptyLayerUpdateQueue, SkRect::MakeWH(200, 200), 200, 200, + TestUtils::createSyncedNodeList(scrolledFunctorView), sLightGeometry, nullptr); + FunctorTestRenderer renderer; + frameBuilder.replayBakedOps<TestDispatcher>(renderer); + EXPECT_EQ(1, renderer.getIndex()) << "Functor should not be rejected"; +} + TEST(FrameBuilder, renderNode) { class RenderNodeTestRenderer : public TestRendererBase { public: @@ -391,6 +414,7 @@ TEST(FrameBuilder, renderNode) { TestUtils::createSyncedNodeList(parent), sLightGeometry, nullptr); RenderNodeTestRenderer renderer; frameBuilder.replayBakedOps<TestDispatcher>(renderer); + EXPECT_EQ(2, renderer.getIndex()); } TEST(FrameBuilder, clipped) { diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java index da77dfd8d539..73ce26fecf29 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java @@ -23,7 +23,9 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.res.Configuration; +import android.graphics.Point; import android.graphics.Rect; +import android.hardware.display.DisplayManager; import android.os.Build; import android.os.Handler; import android.os.IBinder; @@ -389,6 +391,13 @@ public class Recents extends SystemUI return false; } + Point realSize = new Point(); + if (initialBounds == null) { + mContext.getSystemService(DisplayManager.class).getDisplay(Display.DEFAULT_DISPLAY) + .getRealSize(realSize); + initialBounds = new Rect(0, 0, realSize.x, realSize.y); + } + int currentUser = sSystemServicesProxy.getCurrentUser(); SystemServicesProxy ssp = Recents.getSystemServices(); ActivityManager.RunningTaskInfo topTask = ssp.getTopMostTask(); diff --git a/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java b/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java index 8f8683b4ea23..69dcabea28b8 100644 --- a/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java +++ b/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java @@ -17,18 +17,31 @@ package com.android.systemui.shortcut; import android.accessibilityservice.AccessibilityServiceInfo; +import android.app.ActivityManager; +import android.app.ActivityManagerNative; +import android.app.IActivityManager; import android.content.ComponentName; import android.content.Context; import android.content.pm.ServiceInfo; +import android.content.res.Configuration; import android.os.RemoteException; +import android.util.DisplayMetrics; import android.util.Log; import android.view.IWindowManager; import android.view.KeyEvent; +import android.view.WindowManager; import android.view.WindowManagerGlobal; import android.view.accessibility.AccessibilityManager; +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.MetricsProto.MetricsEvent; +import com.android.internal.policy.DividerSnapAlgorithm; import com.android.settingslib.accessibility.AccessibilityUtils; import com.android.systemui.R; import com.android.systemui.SystemUI; +import com.android.systemui.recents.Recents; +import com.android.systemui.stackdivider.Divider; +import com.android.systemui.stackdivider.DividerView; +import com.android.systemui.statusbar.phone.NavigationBarGestureHelper; import java.util.List; import java.util.Set; @@ -42,28 +55,70 @@ public class ShortcutKeyDispatcher extends SystemUI private static final String TAG = "ShortcutKeyDispatcher"; private ShortcutKeyServiceProxy mShortcutKeyServiceProxy = new ShortcutKeyServiceProxy(this); - private IWindowManager windowManagerService = WindowManagerGlobal.getWindowManagerService(); + private IWindowManager mWindowManagerService = WindowManagerGlobal.getWindowManagerService(); + private IActivityManager mActivityManager = ActivityManagerNative.getDefault(); protected final long META_MASK = ((long) KeyEvent.META_META_ON) << Integer.SIZE; protected final long ALT_MASK = ((long) KeyEvent.META_ALT_ON) << Integer.SIZE; protected final long CTRL_MASK = ((long) KeyEvent.META_CTRL_ON) << Integer.SIZE; protected final long SHIFT_MASK = ((long) KeyEvent.META_SHIFT_ON) << Integer.SIZE; + protected final long SC_DOCK_LEFT = META_MASK | KeyEvent.KEYCODE_LEFT_BRACKET; + protected final long SC_DOCK_RIGHT = META_MASK | KeyEvent.KEYCODE_RIGHT_BRACKET; + /** * Registers a shortcut key to window manager. * @param shortcutCode packed representation of shortcut key code and meta information */ public void registerShortcutKey(long shortcutCode) { try { - windowManagerService.registerShortcutKey(shortcutCode, mShortcutKeyServiceProxy); + mWindowManagerService.registerShortcutKey(shortcutCode, mShortcutKeyServiceProxy); } catch (RemoteException e) { // Do nothing } } @Override - public void onShortcutKeyPressed(long shortcutCode) {} + public void onShortcutKeyPressed(long shortcutCode) { + int orientation = mContext.getResources().getConfiguration().orientation; + if ((shortcutCode == SC_DOCK_LEFT || shortcutCode == SC_DOCK_RIGHT) + && orientation == Configuration.ORIENTATION_LANDSCAPE) { + handleDockKey(shortcutCode); + } + } @Override - public void start() {} + public void start() { + registerShortcutKey(SC_DOCK_LEFT); + registerShortcutKey(SC_DOCK_RIGHT); + } + + private void handleDockKey(long shortcutCode) { + try { + int dockSide = mWindowManagerService.getDockedStackSide(); + if (dockSide == WindowManager.DOCKED_INVALID) { + // If there is no window docked, we dock the top-most window. + Recents recents = getComponent(Recents.class); + int dockMode = (shortcutCode == SC_DOCK_LEFT) + ? ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT + : ActivityManager.DOCKED_STACK_CREATE_MODE_BOTTOM_OR_RIGHT; + recents.dockTopTask(NavigationBarGestureHelper.DRAG_MODE_NONE, dockMode, null); + MetricsLogger.action(mContext, MetricsEvent.WINDOW_DOCK_SHORTCUTS); + } else { + // If there is already a docked window, we respond by resizing the docking pane. + DividerView dividerView = getComponent(Divider.class).getView(); + DividerSnapAlgorithm snapAlgorithm = dividerView.getSnapAlgorithm(); + int dividerPosition = dividerView.getCurrentPosition(); + DividerSnapAlgorithm.SnapTarget currentTarget = + snapAlgorithm.calculateNonDismissingSnapTarget(dividerPosition); + int increment = (shortcutCode == SC_DOCK_LEFT) ? -1 : 1; + DividerSnapAlgorithm.SnapTarget target = snapAlgorithm.cycleNonDismissTarget( + currentTarget, increment); + dividerView.startDragging(true /* animate */, false /* touching */); + dividerView.stopDragging(target.position, 0f, true /* avoidDismissStart */); + } + } catch (RemoteException e) { + Log.e(TAG, "handleDockKey() failed."); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index c2e1f7d79df0..51553be35c51 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -1349,7 +1349,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { float y = event.getY(); NotificationHeaderView header = getVisibleNotificationHeader(); if (header != null) { - return header.isInTouchRect(x, y); + return header.isInTouchRect(x - getTranslation(), y); } return super.disallowSingleClick(event); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java index c0e434046139..91418ad312bf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java @@ -43,6 +43,7 @@ public abstract class ExpandableView extends FrameLayout { private boolean mWillBeGone; private int mMinClipTopAmount = 0; private boolean mClipToActualHeight = true; + private boolean mChangingPosition = false; public ExpandableView(Context context, AttributeSet attrs) { super(context, attrs); @@ -407,6 +408,14 @@ public abstract class ExpandableView extends FrameLayout { return 0; } + public void setChangingPosition(boolean changingPosition) { + mChangingPosition = changingPosition; + } + + public boolean isChangingPosition() { + return mChangingPosition; + } + /** * A listener notifying when {@link #getActualHeight} changes. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java index 5b4a3f0039c9..65e797379fef 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java @@ -105,7 +105,6 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen if (mSelectedUser != null && mSelectedUser.getIdentifier() != mCurrentUserId) { // When selected user is different from the current user, show the selected // user's static wallpaper. - mWallpaperManager.forgetLoadedWallpaper(); mCache = mWallpaperManager.getBitmapAsUser(mSelectedUser.getIdentifier()); } else { // When there is no selected user, or it's same as the current user, show the diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 9f97c71b71ec..03cdcb2d7728 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -1172,13 +1172,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } int dockSide = WindowManagerProxy.getInstance().getDockSide(); if (dockSide == WindowManager.DOCKED_INVALID) { - Point realSize = new Point(); - mContext.getSystemService(DisplayManager.class).getDisplay(Display.DEFAULT_DISPLAY) - .getRealSize(realSize); - Rect initialBounds= new Rect(0, 0, realSize.x, realSize.y); return mRecents.dockTopTask(NavigationBarGestureHelper.DRAG_MODE_NONE, - ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT, - initialBounds); + ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT, null); } else { EventBus.getDefault().send(new UndockingTaskEvent()); return false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java index d9e8bd91cace..29b0f4b75876 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java @@ -155,8 +155,21 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene } @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + if (mEntry.row.isChangingPosition()) { + if (getVisibility() == VISIBLE && mEditText.isFocusable()) { + mEditText.requestFocus(); + } + } + } + + @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); + if (mEntry.row.isChangingPosition()) { + return; + } mController.removeRemoteInput(mEntry); } @@ -229,6 +242,9 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene } private void defocusIfNeeded() { + if (mDefocusListener.mEntry.row.isChangingPosition()) { + return; + } if (isFocusable() && isEnabled()) { setInnerFocusable(false); if (mDefocusListener != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index 2ea95076d99e..9dfe36903f7f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -2252,8 +2252,10 @@ public class NotificationStackScrollLayout extends ViewGroup int currentIndex = indexOfChild(child); if (child != null && child.getParent() == this && currentIndex != newIndex) { mChangePositionInProgress = true; + ((ExpandableView)child).setChangingPosition(true); removeView(child); addView(child, newIndex); + ((ExpandableView)child).setChangingPosition(false); mChangePositionInProgress = false; if (mIsExpanded && mAnimationsEnabled && child.getVisibility() != View.GONE) { mChildrenChangingPositions.add(child); diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index fb50df9fe791..d36a1d702701 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -1993,6 +1993,9 @@ message MetricsEvent { // Settings -> Apps -> Gear -> Special access SPECIAL_ACCESS = 351; + // Logs that the user docks window via shortcut key. + WINDOW_DOCK_SHORTCUTS = 352; + // Add new aosp constants above this line. // END OF AOSP CONSTANTS } diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index d11b43614f07..5561456ceca6 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -20,6 +20,7 @@ import static android.app.ActivityManager.StackId.DOCKED_STACK_ID; import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID; import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID; import static android.app.ActivityManager.StackId.HOME_STACK_ID; +import static android.app.ActivityManager.StackId.INVALID_STACK_ID; import static android.app.ActivityManager.StackId.PINNED_STACK_ID; import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION; import static android.content.pm.ActivityInfo.CONFIG_SCREEN_LAYOUT; @@ -1404,22 +1405,37 @@ final class ActivityStack { * needed. A stack is considered translucent if it don't contain a visible or * starting (about to be visible) activity that is fullscreen (opaque). * @param starting The currently starting activity or null if there is none. + * @param stackBehindId The id of the stack directly behind this one. */ - private boolean isStackTranslucent(ActivityRecord starting) { + private boolean isStackTranslucent(ActivityRecord starting, int stackBehindId) { for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { final TaskRecord task = mTaskHistory.get(taskNdx); final ArrayList<ActivityRecord> activities = task.mActivities; for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { final ActivityRecord r = activities.get(activityNdx); - // Conditions for an activity to obscure the stack we're - // examining: - // 1. Not Finishing AND (Visible or the Starting activity) AND: - // 2. Either: - // - Full Screen Activity OR - // - On top of Home and our stack is NOT home - if (!r.finishing && (r.visible || r == starting) && (r.fullscreen || - (!isHomeStack() && r.frontOfTask && task.isOverHomeStack()))) { + if (r.finishing) { + // We don't factor in finishing activities when determining translucency since + // they will be gone soon. + continue; + } + + if (!r.visible && r != starting) { + // Also ignore invisible activities that are not the currently starting + // activity (about to be visible). + continue; + } + + if (r.fullscreen) { + // Stack isn't translucent if it has at least one fullscreen activity + // that is visible. + return false; + } + + if (!isHomeStack() && r.frontOfTask + && task.isOverHomeStack() && stackBehindId != HOME_STACK_ID) { + // Stack isn't translucent if it's top activity should have the home stack + // behind it and the stack currently behind it isn't the home stack. return false; } } @@ -1475,30 +1491,33 @@ final class ActivityStack { : STACK_INVISIBLE; } - // Find the first stack below focused stack that actually got something visible. - int belowFocusedIndex = mStacks.indexOf(focusedStack) - 1; - while (belowFocusedIndex >= 0 && - mStacks.get(belowFocusedIndex).topRunningActivityLocked() == null) { - belowFocusedIndex--; + // Find the first stack behind focused stack that actually got something visible. + int stackBehindFocusedIndex = mStacks.indexOf(focusedStack) - 1; + while (stackBehindFocusedIndex >= 0 && + mStacks.get(stackBehindFocusedIndex).topRunningActivityLocked() == null) { + stackBehindFocusedIndex--; } if ((focusedStackId == DOCKED_STACK_ID || focusedStackId == PINNED_STACK_ID) - && stackIndex == belowFocusedIndex) { + && stackIndex == stackBehindFocusedIndex) { // Stacks directly behind the docked or pinned stack are always visible. return STACK_VISIBLE; } + final int stackBehindFocusedId = (stackBehindFocusedIndex >= 0) + ? mStacks.get(stackBehindFocusedIndex).mStackId : INVALID_STACK_ID; + if (focusedStackId == FULLSCREEN_WORKSPACE_STACK_ID - && focusedStack.isStackTranslucent(starting)) { + && focusedStack.isStackTranslucent(starting, stackBehindFocusedId)) { // Stacks behind the fullscreen stack with a translucent activity are always // visible so they can act as a backdrop to the translucent activity. // For example, dialog activities - if (stackIndex == belowFocusedIndex) { + if (stackIndex == stackBehindFocusedIndex) { return STACK_VISIBLE; } - if (belowFocusedIndex >= 0) { - final ActivityStack stack = mStacks.get(belowFocusedIndex); - if ((stack.mStackId == DOCKED_STACK_ID || stack.mStackId == PINNED_STACK_ID) - && stackIndex == (belowFocusedIndex - 1)) { + if (stackBehindFocusedIndex >= 0) { + if ((stackBehindFocusedId == DOCKED_STACK_ID + || stackBehindFocusedId == PINNED_STACK_ID) + && stackIndex == (stackBehindFocusedIndex - 1)) { // The stack behind the docked or pinned stack is also visible so we can have a // complete backdrop to the translucent activity when the docked stack is up. return STACK_VISIBLE; @@ -1523,7 +1542,7 @@ final class ActivityStack { return STACK_INVISIBLE; } - if (!stack.isStackTranslucent(starting)) { + if (!stack.isStackTranslucent(starting, INVALID_STACK_ID)) { return STACK_INVISIBLE; } } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 02c786e9ba71..516602e55e5c 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -1444,16 +1444,7 @@ public class NotificationManagerService extends SystemService { */ @Override public void unregisterListener(INotificationListener token, int userid) { - final long identity = Binder.clearCallingIdentity(); - try { - if(mRankerServices.checkServiceTokenLocked(token) != null) { - mRankerServices.unregisterService(token, userid); - } else { - mListeners.unregisterService(token, userid); - } - } finally { - Binder.restoreCallingIdentity(identity); - } + mListeners.unregisterService(token, userid); } /** diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index 5f67b7f546b6..e2c71a1aa2f8 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -1087,8 +1087,25 @@ template<> const char *const JavaMethodHelper<bool>::signature_ = "(Z)V"; #define SET(setter, value) object.callSetter("set" # setter, (value)) -#define SET_IF(flag, setter, value) \ - if (flags & (flag)) object.callSetter("set" # setter, (value)) + +// If you want to check if a flag is not set, use SET_IF_NOT(FLAG, setter, +// value) to do that. SET_IF(!FLAG, setter, value) won't compile. +// +// This macros generates compilation error if the provided 'flag' is not a +// single token. For example, 'GNSS_CLOCK_HAS_BIAS' can be accepted, but +// '!GNSS_CLOCK_HAS_DRIFT' will fail to compile. +#define SET_IF(flag, setter, value) do { \ + if (flags & flag) { \ + JavaObject& name_check_##flag = object; \ + name_check_##flag.callSetter("set" # setter, (value)); \ + } \ + } while (false) +#define SET_IF_NOT(flag, setter, value) do { \ + if (!(flags & flag)) { \ + JavaObject& name_check_##flag = object; \ + name_check_##flag.callSetter("set" # setter, (value)); \ + } \ + } while (false) static jobject translate_gps_clock(JNIEnv* env, GpsClock* clock) { static uint32_t discontinuity_count_to_handle_old_lock_type = 0; @@ -1209,9 +1226,9 @@ static jobject translate_gps_measurement(JNIEnv* env, static_cast<int32_t>(measurement->multipath_indicator)); SET_IF(GNSS_MEASUREMENT_HAS_SNR, SnrInDb, measurement->snr_db); - SET_IF(!GPS_MEASUREMENT_HAS_UNCORRECTED_PSEUDORANGE_RATE, - PseudorangeRateCorrected, - true); + SET_IF_NOT(GPS_MEASUREMENT_HAS_UNCORRECTED_PSEUDORANGE_RATE, + PseudorangeRateCorrected, + true); return object.get(); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index d218afcf5a9f..ea1a569b8e5c 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -4862,10 +4862,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { * {@link DevicePolicyManager#ENCRYPTION_STATUS_ACTIVE}. */ private int getEncryptionStatus() { - if (!StorageManager.isNonDefaultBlockEncrypted()) { - return DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY; - } else if (StorageManager.isEncrypted()) { - return DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE; + if (StorageManager.isEncrypted()) { + return StorageManager.isNonDefaultBlockEncrypted() ? + DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE + : DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY; } else if (StorageManager.isEncryptable()) { return DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE; } else { |