Merge "Adding a setting to force user activity." into nyc-dev
diff --git a/Android.mk b/Android.mk
index 08f3468..242534b 100644
--- a/Android.mk
+++ b/Android.mk
@@ -1044,6 +1044,42 @@
$(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 f61f0fa..9d4674e 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -50907,6 +50907,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
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 59c162c..23b9d97 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -54005,6 +54005,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
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 d83c0179..cdffa46 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -50981,6 +50981,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
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 455f869..b08142a 100644
--- a/core/java/android/app/AlarmManager.java
+++ b/core/java/android/app/AlarmManager.java
@@ -985,11 +985,16 @@
/**
* 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 @@
/**
* 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 @@
}
/**
- * 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 af9705f..53a6351 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -3723,7 +3723,9 @@
* 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 ec536e0..1f603ef 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -1000,8 +1000,8 @@
}
/**
- * 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 @@
}
/**
- * 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 @@
}
/**
- * 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 0dc856c..e1e8a07 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -1596,9 +1596,9 @@
/**
* 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 @@
/**
* 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 @@
* 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 e325354..47fdac6 100644
--- a/core/java/android/service/notification/NotificationRankerService.java
+++ b/core/java/android/service/notification/NotificationRankerService.java
@@ -119,7 +119,13 @@
@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 fa4c8d2..70443ba 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 @@
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 @@
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 84d0fc7..9907ea9 100644
--- a/core/java/com/android/internal/policy/DividerSnapAlgorithm.java
+++ b/core/java/com/android/internal/policy/DividerSnapAlgorithm.java
@@ -279,6 +279,26 @@
}
/**
+ * 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 c6baf1c..d80d8f2 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 @@
{
// 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 @@
}
Vector<uint16_t> tagsToMove;
- tagsToMove.add(TAG_ORIENTATION);
tagsToMove.add(TAG_NEWSUBFILETYPE);
tagsToMove.add(TAG_ACTIVEAREA);
tagsToMove.add(TAG_BITSPERSAMPLE);
@@ -1904,12 +1905,6 @@
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 0000000..91e37b4
--- /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 0000000..91e37b4
--- /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 98a265e..dbdf8b4 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 0000000..e26b57c
--- /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 ddf0528..4e3ed36 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 @@
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 4c56a22..f147fd4 100644
--- a/libs/hwui/tests/unit/FrameBuilderTests.cpp
+++ b/libs/hwui/tests/unit/FrameBuilderTests.cpp
@@ -349,6 +349,29 @@
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 @@
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 da77dfd..73ce26f 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.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 @@
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 8f8683b..69dcabe 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 @@
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 c2e1f7d..51553be 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 @@
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 c0e4340..91418ad 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 @@
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 @@
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 5b4a3f0..65e7973 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 @@
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 9f97c71..03cdcb2 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 @@
}
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 d9e8bd9..29b0f4b 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 @@
}
@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 @@
}
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 2ea9507..9dfe369 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 @@
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 fb50df9..d36a1d7 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -1993,6 +1993,9 @@
// 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 d11b436..5561456 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.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 @@
* 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 @@
: 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 @@
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 02c786e..516602e 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 @@
*/
@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 5f67b7f..e2c71a1 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 @@
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_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 d218afc..ea1a569 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 @@
* {@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 {