diff options
122 files changed, 4518 insertions, 4267 deletions
diff --git a/Android.bp b/Android.bp new file mode 100644 index 000000000000..010b2b476e53 --- /dev/null +++ b/Android.bp @@ -0,0 +1,18 @@ +// Copyright (C) 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. + +subdirs = [ + "native/android", + "native/graphics/jni", +] diff --git a/Android.mk b/Android.mk index 3b99111c9500..6c9b190e286d 100644 --- a/Android.mk +++ b/Android.mk @@ -452,7 +452,7 @@ LOCAL_SRC_FILES += \ wifi/java/android/net/wifi/IWifiManager.aidl \ wifi/java/android/net/wifi/nan/IWifiNanEventCallback.aidl \ wifi/java/android/net/wifi/nan/IWifiNanManager.aidl \ - wifi/java/android/net/wifi/nan/IWifiNanSessionCallback.aidl \ + wifi/java/android/net/wifi/nan/IWifiNanDiscoverySessionCallback.aidl \ wifi/java/android/net/wifi/p2p/IWifiP2pManager.aidl \ wifi/java/android/net/wifi/IWifiScanner.aidl \ wifi/java/android/net/wifi/IRttManager.aidl \ @@ -492,7 +492,7 @@ framework_res_R_stamp := \ LOCAL_ADDITIONAL_DEPENDENCIES := $(framework_res_R_stamp) LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj core-libart core-lambda-stubs conscrypt okhttp core-junit bouncycastle ext +LOCAL_JAVA_LIBRARIES := core-oj core-libart conscrypt okhttp core-junit bouncycastle ext LOCAL_STATIC_JAVA_LIBRARIES := framework-protos LOCAL_MODULE := framework diff --git a/api/current.txt b/api/current.txt index e779e9bcde4b..b391b00458a5 100644 --- a/api/current.txt +++ b/api/current.txt @@ -2897,11 +2897,11 @@ package android.accounts { field public static final java.lang.String LOGIN_ACCOUNTS_CHANGED_ACTION = "android.accounts.LOGIN_ACCOUNTS_CHANGED"; } - public abstract interface AccountManagerCallback { + public abstract interface AccountManagerCallback<V> { method public abstract void run(android.accounts.AccountManagerFuture<V>); } - public abstract interface AccountManagerFuture { + public abstract interface AccountManagerFuture<V> { method public abstract boolean cancel(boolean); method public abstract V getResult() throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException; method public abstract V getResult(long, java.util.concurrent.TimeUnit) throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException; @@ -3047,7 +3047,7 @@ package android.animation { method public java.lang.Object evaluate(float, java.lang.Object, java.lang.Object); } - public abstract class BidirectionalTypeConverter extends android.animation.TypeConverter { + public abstract class BidirectionalTypeConverter<T, V> extends android.animation.TypeConverter { ctor public BidirectionalTypeConverter(java.lang.Class<T>, java.lang.Class<V>); method public abstract T convertBack(V); method public android.animation.BidirectionalTypeConverter<V, T> invert(); @@ -3139,26 +3139,26 @@ package android.animation { method public java.lang.String getPropertyName(); method public java.lang.Object getTarget(); method public static android.animation.ObjectAnimator ofArgb(java.lang.Object, java.lang.String, int...); - method public static android.animation.ObjectAnimator ofArgb(T, android.util.Property<T, java.lang.Integer>, int...); + method public static <T> android.animation.ObjectAnimator ofArgb(T, android.util.Property<T, java.lang.Integer>, int...); method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, float...); method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, float...); - method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, android.util.Property<T, java.lang.Float>, android.graphics.Path); + method public static <T> android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, float...); + method public static <T> android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, android.util.Property<T, java.lang.Float>, android.graphics.Path); method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, int...); method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, int...); - method public static android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, android.util.Property<T, java.lang.Integer>, android.graphics.Path); + method public static <T> android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, int...); + method public static <T> android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, android.util.Property<T, java.lang.Integer>, android.graphics.Path); method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, float[][]); method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, T...); + method public static <T> android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, T...); method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, int[][]); method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, T...); + method public static <T> android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, T...); method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeEvaluator, java.lang.Object...); method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeConverter<android.graphics.PointF, ?>, android.graphics.Path); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeEvaluator<V>, V...); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, P>, android.animation.TypeConverter<V, P>, android.animation.TypeEvaluator<V>, V...); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path); + method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeEvaluator<V>, V...); + method public static <T, V, P> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, P>, android.animation.TypeConverter<V, P>, android.animation.TypeEvaluator<V>, V...); + method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path); method public static android.animation.ObjectAnimator ofPropertyValuesHolder(java.lang.Object, android.animation.PropertyValuesHolder...); method public void setAutoCancel(boolean); method public void setProperty(android.util.Property); @@ -3182,17 +3182,17 @@ package android.animation { method public static android.animation.PropertyValuesHolder ofKeyframe(android.util.Property, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, float[][]); method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<V, float[]>, android.animation.TypeEvaluator<V>, V...); - method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...); + method public static <V> android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<V, float[]>, android.animation.TypeEvaluator<V>, V...); + method public static <T> android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, int[][]); method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<V, int[]>, android.animation.TypeEvaluator<V>, V...); - method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...); + method public static <V> android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<V, int[]>, android.animation.TypeEvaluator<V>, V...); + method public static <T> android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeEvaluator, java.lang.Object...); method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeConverter<android.graphics.PointF, ?>, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator<V>, V...); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<T, V>, android.animation.TypeEvaluator<T>, T...); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path); + method public static <V> android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator<V>, V...); + method public static <T, V> android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<T, V>, android.animation.TypeEvaluator<T>, T...); + method public static <V> android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path); method public void setConverter(android.animation.TypeConverter); method public void setEvaluator(android.animation.TypeEvaluator); method public void setFloatValues(float...); @@ -3229,12 +3229,12 @@ package android.animation { method public abstract float getInterpolation(float); } - public abstract class TypeConverter { + public abstract class TypeConverter<T, V> { ctor public TypeConverter(java.lang.Class<T>, java.lang.Class<V>); method public abstract V convert(T); } - public abstract interface TypeEvaluator { + public abstract interface TypeEvaluator<T> { method public abstract T evaluate(float, T, T); } @@ -4561,7 +4561,7 @@ package android.app { method public android.os.Parcelable saveAllState(); } - public abstract class FragmentHostCallback extends android.app.FragmentContainer { + public abstract class FragmentHostCallback<E> extends android.app.FragmentContainer { ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int); method public void onAttachFragment(android.app.Fragment); method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); @@ -4828,12 +4828,12 @@ package android.app { method public abstract void destroyLoader(int); method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); method public static void enableDebugLogging(boolean); - method public abstract android.content.Loader<D> getLoader(int); - method public abstract android.content.Loader<D> initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>); - method public abstract android.content.Loader<D> restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>); + method public abstract <D> android.content.Loader<D> getLoader(int); + method public abstract <D> android.content.Loader<D> initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>); + method public abstract <D> android.content.Loader<D> restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>); } - public static abstract interface LoaderManager.LoaderCallbacks { + public static abstract interface LoaderManager.LoaderCallbacks<D> { method public abstract android.content.Loader<D> onCreateLoader(int, android.os.Bundle); method public abstract void onLoadFinished(android.content.Loader<D>, D); method public abstract void onLoaderReset(android.content.Loader<D>); @@ -7612,7 +7612,7 @@ package android.content { ctor public AsyncQueryHandler.WorkerHandler(android.os.Looper); } - public abstract class AsyncTaskLoader extends android.content.Loader { + public abstract class AsyncTaskLoader<D> extends android.content.Loader { ctor public AsyncTaskLoader(android.content.Context); method public void cancelLoadInBackground(); method public boolean isLoadInBackgroundCanceled(); @@ -7794,7 +7794,7 @@ package android.content { method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException; method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException; method protected final android.os.ParcelFileDescriptor openFileHelper(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException; - method public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter<T>) throws java.io.FileNotFoundException; + method public <T> android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter<T>) throws java.io.FileNotFoundException; method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException; method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException; method public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String); @@ -7807,7 +7807,7 @@ package android.content { method public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]); } - public static abstract interface ContentProvider.PipeDataWriter { + public static abstract interface ContentProvider.PipeDataWriter<T> { method public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, T); } @@ -8078,7 +8078,7 @@ package android.content { method public final java.lang.String getString(int); method public final java.lang.String getString(int, java.lang.Object...); method public abstract java.lang.Object getSystemService(java.lang.String); - method public final T getSystemService(java.lang.Class<T>); + method public final <T> T getSystemService(java.lang.Class<T>); method public abstract java.lang.String getSystemServiceName(java.lang.Class<?>); method public final java.lang.CharSequence getText(int); method public abstract android.content.res.Resources.Theme getTheme(); @@ -8432,8 +8432,8 @@ package android.content { method public long getLongExtra(java.lang.String, long); method public java.lang.String getPackage(); method public android.os.Parcelable[] getParcelableArrayExtra(java.lang.String); - method public java.util.ArrayList<T> getParcelableArrayListExtra(java.lang.String); - method public T getParcelableExtra(java.lang.String); + method public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayListExtra(java.lang.String); + method public <T extends android.os.Parcelable> T getParcelableExtra(java.lang.String); method public java.lang.String getScheme(); method public android.content.Intent getSelector(); method public java.io.Serializable getSerializableExtra(java.lang.String); @@ -8908,7 +8908,7 @@ package android.content { ctor public IntentSender.SendIntentException(java.lang.Exception); } - public class Loader { + public class Loader<D> { ctor public Loader(android.content.Context); method public void abandon(); method public boolean cancelLoad(); @@ -8945,11 +8945,11 @@ package android.content { ctor public Loader.ForceLoadContentObserver(); } - public static abstract interface Loader.OnLoadCanceledListener { + public static abstract interface Loader.OnLoadCanceledListener<D> { method public abstract void onLoadCanceled(android.content.Loader<D>); } - public static abstract interface Loader.OnLoadCompleteListener { + public static abstract interface Loader.OnLoadCompleteListener<D> { method public abstract void onLoadComplete(android.content.Loader<D>, D); } @@ -10740,7 +10740,7 @@ package android.database { method public boolean isNull(int); } - public abstract class Observable { + public abstract class Observable<T> { ctor public Observable(); method public void registerObserver(T); method public void unregisterAll(); @@ -12630,7 +12630,7 @@ package android.graphics.drawable { public class AnimatedStateListDrawable extends android.graphics.drawable.StateListDrawable { ctor public AnimatedStateListDrawable(); method public void addState(int[], android.graphics.drawable.Drawable, int); - method public void addTransition(int, int, T, boolean); + method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean); } public class AnimatedVectorDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable2 { @@ -13754,7 +13754,7 @@ package android.hardware.camera2 { } public final class CameraCharacteristics extends android.hardware.camera2.CameraMetadata { - method public T get(android.hardware.camera2.CameraCharacteristics.Key<T>); + method public <T> T get(android.hardware.camera2.CameraCharacteristics.Key<T>); method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableCaptureRequestKeys(); method public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getAvailableCaptureResultKeys(); field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES; @@ -13839,7 +13839,7 @@ package android.hardware.camera2 { field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> TONEMAP_MAX_CURVE_POINTS; } - public static final class CameraCharacteristics.Key { + public static final class CameraCharacteristics.Key<T> { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); @@ -13904,7 +13904,7 @@ package android.hardware.camera2 { method public void onTorchModeUnavailable(java.lang.String); } - public abstract class CameraMetadata { + public abstract class CameraMetadata<TKey> { method public java.util.List<TKey> getKeys(); field public static final int COLOR_CORRECTION_ABERRATION_MODE_FAST = 1; // 0x1 field public static final int COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY = 2; // 0x2 @@ -14112,7 +14112,7 @@ package android.hardware.camera2 { public final class CaptureRequest extends android.hardware.camera2.CameraMetadata implements android.os.Parcelable { method public int describeContents(); - method public T get(android.hardware.camera2.CaptureRequest.Key<T>); + method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>); method public java.lang.Object getTag(); method public boolean isReprocess(); method public void writeToParcel(android.os.Parcel, int); @@ -14175,20 +14175,20 @@ package android.hardware.camera2 { public static final class CaptureRequest.Builder { method public void addTarget(android.view.Surface); method public android.hardware.camera2.CaptureRequest build(); - method public T get(android.hardware.camera2.CaptureRequest.Key<T>); + method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>); method public void removeTarget(android.view.Surface); - method public void set(android.hardware.camera2.CaptureRequest.Key<T>, T); + method public <T> void set(android.hardware.camera2.CaptureRequest.Key<T>, T); method public void setTag(java.lang.Object); } - public static final class CaptureRequest.Key { + public static final class CaptureRequest.Key<T> { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); } public class CaptureResult extends android.hardware.camera2.CameraMetadata { - method public T get(android.hardware.camera2.CaptureResult.Key<T>); + method public <T> T get(android.hardware.camera2.CaptureResult.Key<T>); method public long getFrameNumber(); method public android.hardware.camera2.CaptureRequest getRequest(); method public int getSequenceId(); @@ -14269,7 +14269,7 @@ package android.hardware.camera2 { field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_PRESET_CURVE; } - public static final class CaptureResult.Key { + public static final class CaptureResult.Key<T> { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); @@ -14394,14 +14394,14 @@ package android.hardware.camera2.params { method public android.util.Size[] getInputSizes(int); method public final int[] getOutputFormats(); method public long getOutputMinFrameDuration(int, android.util.Size); - method public long getOutputMinFrameDuration(java.lang.Class<T>, android.util.Size); - method public android.util.Size[] getOutputSizes(java.lang.Class<T>); + method public <T> long getOutputMinFrameDuration(java.lang.Class<T>, android.util.Size); + method public <T> android.util.Size[] getOutputSizes(java.lang.Class<T>); method public android.util.Size[] getOutputSizes(int); method public long getOutputStallDuration(int, android.util.Size); - method public long getOutputStallDuration(java.lang.Class<T>, android.util.Size); + method public <T> long getOutputStallDuration(java.lang.Class<T>, android.util.Size); method public final int[] getValidOutputFormatsForInput(int); method public boolean isOutputSupportedFor(int); - method public static boolean isOutputSupportedFor(java.lang.Class<T>); + method public static <T> boolean isOutputSupportedFor(java.lang.Class<T>); method public boolean isOutputSupportedFor(android.view.Surface); } @@ -16102,7 +16102,7 @@ package android.icu.math { package android.icu.text { - public final class AlphabeticIndex implements java.lang.Iterable { + public final class AlphabeticIndex<V> implements java.lang.Iterable { ctor public AlphabeticIndex(android.icu.util.ULocale); ctor public AlphabeticIndex(java.util.Locale); ctor public AlphabeticIndex(android.icu.text.RuleBasedCollator); @@ -16128,7 +16128,7 @@ package android.icu.text { method public android.icu.text.AlphabeticIndex<V> setUnderflowLabel(java.lang.String); } - public static class AlphabeticIndex.Bucket implements java.lang.Iterable { + public static class AlphabeticIndex.Bucket<V> implements java.lang.Iterable { method public java.lang.String getLabel(); method public android.icu.text.AlphabeticIndex.Bucket.LabelType getLabelType(); method public java.util.Iterator<android.icu.text.AlphabeticIndex.Record<V>> iterator(); @@ -16144,14 +16144,14 @@ package android.icu.text { enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType UNDERFLOW; } - public static final class AlphabeticIndex.ImmutableIndex implements java.lang.Iterable { + public static final class AlphabeticIndex.ImmutableIndex<V> implements java.lang.Iterable { method public android.icu.text.AlphabeticIndex.Bucket<V> getBucket(int); method public int getBucketCount(); method public int getBucketIndex(java.lang.CharSequence); method public java.util.Iterator<android.icu.text.AlphabeticIndex.Bucket<V>> iterator(); } - public static class AlphabeticIndex.Record { + public static class AlphabeticIndex.Record<V> { method public V getData(); method public java.lang.CharSequence getName(); } @@ -17664,8 +17664,8 @@ package android.icu.text { method public final android.icu.text.UnicodeSet addAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet addAll(android.icu.text.UnicodeSet); method public android.icu.text.UnicodeSet addAll(java.lang.Iterable<?>); - method public android.icu.text.UnicodeSet addAll(T...); - method public T addAllTo(T); + method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet addAll(T...); + method public <T extends java.util.Collection<java.lang.String>> T addAllTo(T); method public void addMatchSetTo(android.icu.text.UnicodeSet); method public android.icu.text.UnicodeSet applyIntPropertyValue(int, int); method public final android.icu.text.UnicodeSet applyPattern(java.lang.String); @@ -17693,15 +17693,15 @@ package android.icu.text { method public final boolean contains(java.lang.CharSequence); method public boolean containsAll(android.icu.text.UnicodeSet); method public boolean containsAll(java.lang.String); - method public boolean containsAll(java.lang.Iterable<T>); + method public <T extends java.lang.CharSequence> boolean containsAll(java.lang.Iterable<T>); method public boolean containsNone(int, int); method public boolean containsNone(android.icu.text.UnicodeSet); method public boolean containsNone(java.lang.CharSequence); - method public boolean containsNone(java.lang.Iterable<T>); + method public <T extends java.lang.CharSequence> boolean containsNone(java.lang.Iterable<T>); method public final boolean containsSome(int, int); method public final boolean containsSome(android.icu.text.UnicodeSet); method public final boolean containsSome(java.lang.CharSequence); - method public final boolean containsSome(java.lang.Iterable<T>); + method public final <T extends java.lang.CharSequence> boolean containsSome(java.lang.Iterable<T>); method public android.icu.text.UnicodeSet freeze(); method public static android.icu.text.UnicodeSet from(java.lang.CharSequence); method public static android.icu.text.UnicodeSet fromAll(java.lang.CharSequence); @@ -17719,14 +17719,14 @@ package android.icu.text { method public final android.icu.text.UnicodeSet remove(java.lang.CharSequence); method public final android.icu.text.UnicodeSet removeAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet removeAll(android.icu.text.UnicodeSet); - method public android.icu.text.UnicodeSet removeAll(java.lang.Iterable<T>); + method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet removeAll(java.lang.Iterable<T>); method public final android.icu.text.UnicodeSet removeAllStrings(); method public android.icu.text.UnicodeSet retain(int, int); method public final android.icu.text.UnicodeSet retain(int); method public final android.icu.text.UnicodeSet retain(java.lang.CharSequence); method public final android.icu.text.UnicodeSet retainAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet retainAll(android.icu.text.UnicodeSet); - method public android.icu.text.UnicodeSet retainAll(java.lang.Iterable<T>); + method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet retainAll(java.lang.Iterable<T>); method public android.icu.text.UnicodeSet set(int, int); method public android.icu.text.UnicodeSet set(android.icu.text.UnicodeSet); method public int size(); @@ -18136,7 +18136,7 @@ package android.icu.util { method public long getToDate(); } - public abstract interface Freezable implements java.lang.Cloneable { + public abstract interface Freezable<T> implements java.lang.Cloneable { method public abstract T cloneAsThawed(); method public abstract T freeze(); method public abstract boolean isFrozen(); @@ -18418,7 +18418,7 @@ package android.icu.util { field public static final android.icu.util.TimeUnit YEAR; } - public class Output { + public class Output<T> { ctor public Output(); ctor public Output(T); field public T value; @@ -28069,7 +28069,7 @@ package android.opengl { package android.os { - public abstract class AsyncTask { + public abstract class AsyncTask<Params, Progress, Result> { ctor public AsyncTask(); method public final boolean cancel(boolean); method protected abstract Result doInBackground(Params...); @@ -28295,16 +28295,16 @@ package android.os { method public float getFloat(java.lang.String, float); method public float[] getFloatArray(java.lang.String); method public java.util.ArrayList<java.lang.Integer> getIntegerArrayList(java.lang.String); - method public T getParcelable(java.lang.String); + method public <T extends android.os.Parcelable> T getParcelable(java.lang.String); method public android.os.Parcelable[] getParcelableArray(java.lang.String); - method public java.util.ArrayList<T> getParcelableArrayList(java.lang.String); + method public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayList(java.lang.String); method public java.io.Serializable getSerializable(java.lang.String); method public short getShort(java.lang.String); method public short getShort(java.lang.String, short); method public short[] getShortArray(java.lang.String); method public android.util.Size getSize(java.lang.String); method public android.util.SizeF getSizeF(java.lang.String); - method public android.util.SparseArray<T> getSparseParcelableArray(java.lang.String); + method public <T extends android.os.Parcelable> android.util.SparseArray<T> getSparseParcelableArray(java.lang.String); method public java.util.ArrayList<java.lang.String> getStringArrayList(java.lang.String); method public boolean hasFileDescriptors(); method public void putAll(android.os.Bundle); @@ -28809,8 +28809,8 @@ package android.os { method public final long[] createLongArray(); method public final java.lang.String[] createStringArray(); method public final java.util.ArrayList<java.lang.String> createStringArrayList(); - method public final T[] createTypedArray(android.os.Parcelable.Creator<T>); - method public final java.util.ArrayList<T> createTypedArrayList(android.os.Parcelable.Creator<T>); + method public final <T> T[] createTypedArray(android.os.Parcelable.Creator<T>); + method public final <T> java.util.ArrayList<T> createTypedArrayList(android.os.Parcelable.Creator<T>); method public final int dataAvail(); method public final int dataCapacity(); method public final int dataPosition(); @@ -28843,7 +28843,7 @@ package android.os { method public final long readLong(); method public final void readLongArray(long[]); method public final void readMap(java.util.Map, java.lang.ClassLoader); - method public final T readParcelable(java.lang.ClassLoader); + method public final <T extends android.os.Parcelable> T readParcelable(java.lang.ClassLoader); method public final android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader); method public final android.os.PersistableBundle readPersistableBundle(); method public final android.os.PersistableBundle readPersistableBundle(java.lang.ClassLoader); @@ -28856,9 +28856,9 @@ package android.os { method public final void readStringArray(java.lang.String[]); method public final void readStringList(java.util.List<java.lang.String>); method public final android.os.IBinder readStrongBinder(); - method public final void readTypedArray(T[], android.os.Parcelable.Creator<T>); - method public final void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>); - method public final T readTypedObject(android.os.Parcelable.Creator<T>); + method public final <T> void readTypedArray(T[], android.os.Parcelable.Creator<T>); + method public final <T> void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>); + method public final <T> T readTypedObject(android.os.Parcelable.Creator<T>); method public final java.lang.Object readValue(java.lang.ClassLoader); method public final void recycle(); method public final void setDataCapacity(int); @@ -28889,7 +28889,7 @@ package android.os { method public final void writeMap(java.util.Map); method public final void writeNoException(); method public final void writeParcelable(android.os.Parcelable, int); - method public final void writeParcelableArray(T[], int); + method public final <T extends android.os.Parcelable> void writeParcelableArray(T[], int); method public final void writePersistableBundle(android.os.PersistableBundle); method public final void writeSerializable(java.io.Serializable); method public final void writeSize(android.util.Size); @@ -28901,9 +28901,9 @@ package android.os { method public final void writeStringList(java.util.List<java.lang.String>); method public final void writeStrongBinder(android.os.IBinder); method public final void writeStrongInterface(android.os.IInterface); - method public final void writeTypedArray(T[], int); - method public final void writeTypedList(java.util.List<T>); - method public final void writeTypedObject(T, int); + method public final <T extends android.os.Parcelable> void writeTypedArray(T[], int); + method public final <T extends android.os.Parcelable> void writeTypedList(java.util.List<T>); + method public final <T extends android.os.Parcelable> void writeTypedObject(T, int); method public final void writeValue(java.lang.Object); field public static final android.os.Parcelable.Creator<java.lang.String> STRING_CREATOR; } @@ -28981,11 +28981,11 @@ package android.os { field public static final int PARCELABLE_WRITE_RETURN_VALUE = 1; // 0x1 } - public static abstract interface Parcelable.ClassLoaderCreator implements android.os.Parcelable.Creator { + public static abstract interface Parcelable.ClassLoaderCreator<T> implements android.os.Parcelable.Creator { method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader); } - public static abstract interface Parcelable.Creator { + public static abstract interface Parcelable.Creator<T> { method public abstract T createFromParcel(android.os.Parcel); method public abstract T[] newArray(int); } @@ -29099,7 +29099,7 @@ package android.os { method public abstract void onProgress(int); } - public class RemoteCallbackList { + public class RemoteCallbackList<E extends android.os.IInterface> { ctor public RemoteCallbackList(); method public int beginBroadcast(); method public void finishBroadcast(); @@ -29169,6 +29169,7 @@ package android.os { method public android.os.StrictMode.ThreadPolicy.Builder detectDiskWrites(); method public android.os.StrictMode.ThreadPolicy.Builder detectNetwork(); method public android.os.StrictMode.ThreadPolicy.Builder detectResourceMismatches(); + method public android.os.StrictMode.ThreadPolicy.Builder detectUnbufferedIo(); method public android.os.StrictMode.ThreadPolicy.Builder penaltyDeath(); method public android.os.StrictMode.ThreadPolicy.Builder penaltyDeathOnNetwork(); method public android.os.StrictMode.ThreadPolicy.Builder penaltyDialog(); @@ -29181,6 +29182,7 @@ package android.os { method public android.os.StrictMode.ThreadPolicy.Builder permitDiskWrites(); method public android.os.StrictMode.ThreadPolicy.Builder permitNetwork(); method public android.os.StrictMode.ThreadPolicy.Builder permitResourceMismatches(); + method public android.os.StrictMode.ThreadPolicy.Builder permitUnbufferedIo(); } public static final class StrictMode.VmPolicy { @@ -34409,7 +34411,7 @@ package android.service.carrier { field public static final java.lang.String SERVICE_INTERFACE = "android.service.carrier.CarrierMessagingService"; } - public static abstract interface CarrierMessagingService.ResultCallback { + public static abstract interface CarrierMessagingService.ResultCallback<T> { method public abstract void onReceiveResult(T) throws android.os.RemoteException; } @@ -34560,7 +34562,7 @@ package android.service.media { field public static final java.lang.String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED"; } - public class MediaBrowserService.Result { + public class MediaBrowserService.Result<T> { method public void detach(); method public void sendResult(T); } @@ -37430,14 +37432,14 @@ package android.telephony.gsm { package android.test { - public abstract deprecated class ActivityInstrumentationTestCase extends android.test.ActivityTestCase { + public abstract deprecated class ActivityInstrumentationTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase { ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class<T>); ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class<T>, boolean); method public T getActivity(); method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception; } - public abstract deprecated class ActivityInstrumentationTestCase2 extends android.test.ActivityTestCase { + public abstract deprecated class ActivityInstrumentationTestCase2<T extends android.app.Activity> extends android.test.ActivityTestCase { ctor public deprecated ActivityInstrumentationTestCase2(java.lang.String, java.lang.Class<T>); ctor public ActivityInstrumentationTestCase2(java.lang.Class<T>); method public T getActivity(); @@ -37452,7 +37454,7 @@ package android.test { method protected void setActivity(android.app.Activity); } - public abstract deprecated class ActivityUnitTestCase extends android.test.ActivityTestCase { + public abstract deprecated class ActivityUnitTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase { ctor public ActivityUnitTestCase(java.lang.Class<T>); method public T getActivity(); method public int getFinishedActivityRequest(); @@ -37498,7 +37500,7 @@ package android.test { method public void testStarted(java.lang.String); } - public abstract deprecated class ApplicationTestCase extends android.test.AndroidTestCase { + public abstract deprecated class ApplicationTestCase<T extends android.app.Application> extends android.test.AndroidTestCase { ctor public ApplicationTestCase(java.lang.Class<T>); method protected final void createApplication(); method public T getApplication(); @@ -37524,8 +37526,8 @@ package android.test { method public android.app.Instrumentation getInstrumentation(); method public deprecated void injectInsrumentation(android.app.Instrumentation); method public void injectInstrumentation(android.app.Instrumentation); - method public final T launchActivity(java.lang.String, java.lang.Class<T>, android.os.Bundle); - method public final T launchActivityWithIntent(java.lang.String, java.lang.Class<T>, android.content.Intent); + method public final <T extends android.app.Activity> T launchActivity(java.lang.String, java.lang.Class<T>, android.os.Bundle); + method public final <T extends android.app.Activity> T launchActivityWithIntent(java.lang.String, java.lang.Class<T>, android.content.Intent); method public void runTestOnUiThread(java.lang.Runnable) throws java.lang.Throwable; method public void sendKeys(java.lang.String); method public void sendKeys(int...); @@ -37565,7 +37567,7 @@ package android.test { public class LoaderTestCase extends android.test.AndroidTestCase { ctor public LoaderTestCase(); - method public T getLoaderResultSynchronously(android.content.Loader<T>); + method public <T> T getLoaderResultSynchronously(android.content.Loader<T>); } public final deprecated class MoreAsserts { @@ -37620,20 +37622,20 @@ package android.test { method public abstract void startTiming(boolean); } - public abstract deprecated class ProviderTestCase extends android.test.InstrumentationTestCase { + public abstract deprecated class ProviderTestCase<T extends android.content.ContentProvider> extends android.test.InstrumentationTestCase { ctor public ProviderTestCase(java.lang.Class<T>, java.lang.String); method public android.test.mock.MockContentResolver getMockContentResolver(); method public android.test.IsolatedContext getMockContext(); method public T getProvider(); - method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } - public abstract class ProviderTestCase2 extends android.test.AndroidTestCase { + public abstract class ProviderTestCase2<T extends android.content.ContentProvider> extends android.test.AndroidTestCase { ctor public ProviderTestCase2(java.lang.Class<T>, java.lang.String); method public android.test.mock.MockContentResolver getMockContentResolver(); method public android.test.IsolatedContext getMockContext(); method public T getProvider(); - method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } public deprecated class RenamingDelegatingContext extends android.content.ContextWrapper { @@ -37641,11 +37643,11 @@ package android.test { ctor public RenamingDelegatingContext(android.content.Context, android.content.Context, java.lang.String); method public java.lang.String getDatabasePrefix(); method public void makeExistingFilesAndDbsAccessible(); - method public static T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; - method public static T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } - public abstract deprecated class ServiceTestCase extends android.test.AndroidTestCase { + public abstract deprecated class ServiceTestCase<T extends android.app.Service> extends android.test.AndroidTestCase { ctor public ServiceTestCase(java.lang.Class<T>); method protected android.os.IBinder bindService(android.content.Intent); method public android.app.Application getApplication(); @@ -37658,7 +37660,7 @@ package android.test { method public void testServiceTestCaseSetUpProperly() throws java.lang.Exception; } - public abstract deprecated class SingleLaunchActivityTestCase extends android.test.InstrumentationTestCase { + public abstract deprecated class SingleLaunchActivityTestCase<T extends android.app.Activity> extends android.test.InstrumentationTestCase { ctor public SingleLaunchActivityTestCase(java.lang.String, java.lang.Class<T>); method public T getActivity(); method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception; @@ -38013,7 +38015,7 @@ package android.test.suitebuilder { ctor public TestMethod(java.lang.String, java.lang.Class<? extends junit.framework.TestCase>); ctor public TestMethod(junit.framework.TestCase); method public junit.framework.TestCase createTest() throws java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException; - method public T getAnnotation(java.lang.Class<T>); + method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>); method public java.lang.Class<? extends junit.framework.TestCase> getEnclosingClass(); method public java.lang.String getEnclosingClassname(); method public java.lang.String getName(); @@ -38456,7 +38458,7 @@ package android.text { method public int getSpanEnd(java.lang.Object); method public int getSpanFlags(java.lang.Object); method public int getSpanStart(java.lang.Object); - method public T[] getSpans(int, int, java.lang.Class<T>); + method public <T> T[] getSpans(int, int, java.lang.Class<T>); method public deprecated int getTextRunCursor(int, int, int, int, int, android.graphics.Paint); method public int getTextWatcherDepth(); method public android.text.SpannableStringBuilder insert(int, java.lang.CharSequence, int, int); @@ -38478,7 +38480,7 @@ package android.text { method public int getSpanEnd(java.lang.Object); method public int getSpanFlags(java.lang.Object); method public int getSpanStart(java.lang.Object); - method public T[] getSpans(int, int, java.lang.Class<T>); + method public <T> T[] getSpans(int, int, java.lang.Class<T>); method public final int length(); method public int nextSpanTransition(int, int, java.lang.Class); method public final java.lang.String toString(); @@ -38488,7 +38490,7 @@ package android.text { method public abstract int getSpanEnd(java.lang.Object); method public abstract int getSpanFlags(java.lang.Object); method public abstract int getSpanStart(java.lang.Object); - method public abstract T[] getSpans(int, int, java.lang.Class<T>); + method public abstract <T> T[] getSpans(int, int, java.lang.Class<T>); method public abstract int nextSpanTransition(int, int, java.lang.Class); field public static final int SPAN_COMPOSING = 256; // 0x100 field public static final int SPAN_EXCLUSIVE_EXCLUSIVE = 33; // 0x21 @@ -39465,7 +39467,7 @@ package android.text.style { field public static final int WEEKDAY_WEDNESDAY = 4; // 0x4 } - public static class TtsSpan.Builder { + public static class TtsSpan.Builder<C extends android.text.style.TtsSpan.Builder<?>> { ctor public TtsSpan.Builder(java.lang.String); method public android.text.style.TtsSpan build(); method public C setIntArgument(java.lang.String, int); @@ -39561,7 +39563,7 @@ package android.text.style { method public android.text.style.TtsSpan.OrdinalBuilder setNumber(java.lang.String); } - public static class TtsSpan.SemioticClassBuilder extends android.text.style.TtsSpan.Builder { + public static class TtsSpan.SemioticClassBuilder<C extends android.text.style.TtsSpan.SemioticClassBuilder<?>> extends android.text.style.TtsSpan.Builder { ctor public TtsSpan.SemioticClassBuilder(java.lang.String); method public C setAnimacy(java.lang.String); method public C setCase(java.lang.String); @@ -39968,7 +39970,7 @@ package android.util { ctor public AndroidRuntimeException(java.lang.Exception); } - public final class ArrayMap implements java.util.Map { + public final class ArrayMap<K, V> implements java.util.Map { ctor public ArrayMap(); ctor public ArrayMap(int); ctor public ArrayMap(android.util.ArrayMap<K, V>); @@ -39996,7 +39998,7 @@ package android.util { method public java.util.Collection<V> values(); } - public final class ArraySet implements java.util.Collection java.util.Set { + public final class ArraySet<E> implements java.util.Collection java.util.Set { ctor public ArraySet(); ctor public ArraySet(int); ctor public ArraySet(android.util.ArraySet<E>); @@ -40017,7 +40019,7 @@ package android.util { method public boolean retainAll(java.util.Collection<?>); method public int size(); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public <T> T[] toArray(T[]); method public E valueAt(int); } @@ -40159,13 +40161,13 @@ package android.util { public deprecated class FloatMath { } - public abstract class FloatProperty extends android.util.Property { + public abstract class FloatProperty<T> extends android.util.Property { ctor public FloatProperty(java.lang.String); method public final void set(T, java.lang.Float); method public abstract void setValue(T, float); } - public abstract class IntProperty extends android.util.Property { + public abstract class IntProperty<T> extends android.util.Property { ctor public IntProperty(java.lang.String); method public final void set(T, java.lang.Integer); method public abstract void setValue(T, int); @@ -40265,7 +40267,7 @@ package android.util { method public void println(java.lang.String); } - public class LongSparseArray implements java.lang.Cloneable { + public class LongSparseArray<E> implements java.lang.Cloneable { ctor public LongSparseArray(); ctor public LongSparseArray(int); method public void append(long, E); @@ -40285,7 +40287,7 @@ package android.util { method public E valueAt(int); } - public class LruCache { + public class LruCache<K, V> { ctor public LruCache(int); method protected V create(K); method public final synchronized int createCount(); @@ -40373,9 +40375,9 @@ package android.util { ctor public NoSuchPropertyException(java.lang.String); } - public class Pair { + public class Pair<F, S> { ctor public Pair(F, S); - method public static android.util.Pair<A, B> create(A, B); + method public static <A, B> android.util.Pair<A, B> create(A, B); field public final F first; field public final S second; } @@ -40408,22 +40410,22 @@ package android.util { method public abstract void println(java.lang.String); } - public abstract class Property { + public abstract class Property<T, V> { ctor public Property(java.lang.Class<V>, java.lang.String); method public abstract V get(T); method public java.lang.String getName(); method public java.lang.Class<V> getType(); method public boolean isReadOnly(); - method public static android.util.Property<T, V> of(java.lang.Class<T>, java.lang.Class<V>, java.lang.String); + method public static <T, V> android.util.Property<T, V> of(java.lang.Class<T>, java.lang.Class<V>, java.lang.String); method public void set(T, V); } - public final class Range { + public final class Range<T extends java.lang.Comparable<? super T>> { ctor public Range(T, T); method public T clamp(T); method public boolean contains(T); method public boolean contains(android.util.Range<T>); - method public static android.util.Range<T> create(T, T); + method public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> create(T, T); method public android.util.Range<T> extend(android.util.Range<T>); method public android.util.Range<T> extend(T, T); method public android.util.Range<T> extend(T); @@ -40467,7 +40469,7 @@ package android.util { method public static android.util.SizeF parseSizeF(java.lang.String) throws java.lang.NumberFormatException; } - public class SparseArray implements java.lang.Cloneable { + public class SparseArray<E> implements java.lang.Cloneable { ctor public SparseArray(); ctor public SparseArray(int); method public void append(int, E); @@ -45171,7 +45173,7 @@ package android.webkit { method public static java.lang.String stripAnchor(java.lang.String); } - public abstract interface ValueCallback { + public abstract interface ValueCallback<T> { method public abstract void onReceiveValue(T); } @@ -45905,7 +45907,7 @@ package android.widget { field public static final int NO_SELECTION = -2147483648; // 0x80000000 } - public abstract class AdapterView extends android.view.ViewGroup { + public abstract class AdapterView<T extends android.widget.Adapter> extends android.view.ViewGroup { ctor public AdapterView(android.content.Context); ctor public AdapterView(android.content.Context, android.util.AttributeSet); ctor public AdapterView(android.content.Context, android.util.AttributeSet, int); @@ -46028,7 +46030,7 @@ package android.widget { ctor public AnalogClock(android.content.Context, android.util.AttributeSet, int, int); } - public class ArrayAdapter extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter { + public class ArrayAdapter<T> extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter { ctor public ArrayAdapter(android.content.Context, int); ctor public ArrayAdapter(android.content.Context, int, int); ctor public ArrayAdapter(android.content.Context, int, T[]); @@ -46089,7 +46091,7 @@ package android.widget { method protected void performFiltering(java.lang.CharSequence, int); method public void performValidation(); method protected void replaceText(java.lang.CharSequence); - method public void setAdapter(T); + method public <T extends android.widget.ListAdapter & android.widget.Filterable> void setAdapter(T); method public void setCompletionHint(java.lang.CharSequence); method public void setDropDownAnchor(int); method public void setDropDownBackgroundDrawable(android.graphics.drawable.Drawable); @@ -48374,7 +48376,7 @@ package android.widget { package com.android.internal.util { - public abstract interface Predicate { + public abstract interface Predicate<T> { method public abstract boolean apply(T); } @@ -50446,22 +50448,22 @@ package java.lang { enum_constant public static final java.lang.Character.UnicodeScript YI; } - public final class Class implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type { - method public java.lang.Class<? extends U> asSubclass(java.lang.Class<U>); + public final class Class<T> implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type { + method public <U> java.lang.Class<? extends U> asSubclass(java.lang.Class<U>); method public T cast(java.lang.Object); method public boolean desiredAssertionStatus(); method public static java.lang.Class<?> forName(java.lang.String) throws java.lang.ClassNotFoundException; method public static java.lang.Class<?> forName(java.lang.String, boolean, java.lang.ClassLoader) throws java.lang.ClassNotFoundException; - method public A getAnnotation(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A getAnnotation(java.lang.Class<A>); method public java.lang.annotation.Annotation[] getAnnotations(); - method public A[] getAnnotationsByType(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(java.lang.Class<A>); method public java.lang.String getCanonicalName(); method public java.lang.ClassLoader getClassLoader(); method public java.lang.Class<?>[] getClasses(); method public java.lang.Class<?> getComponentType(); method public java.lang.reflect.Constructor<T> getConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException; method public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException; - method public A getDeclaredAnnotation(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(java.lang.Class<A>); method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); method public java.lang.Class<?>[] getDeclaredClasses(); method public java.lang.reflect.Constructor<T> getDeclaredConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException; @@ -50573,7 +50575,7 @@ package java.lang { public abstract interface Cloneable { } - public abstract interface Comparable { + public abstract interface Comparable<T> { method public abstract int compareTo(T); } @@ -50627,7 +50629,7 @@ package java.lang { field public static final java.lang.Class<java.lang.Double> TYPE; } - public abstract class Enum implements java.lang.Comparable java.io.Serializable { + public abstract class Enum<E extends java.lang.Enum<E>> implements java.lang.Comparable java.io.Serializable { ctor protected Enum(java.lang.String, int); method protected final java.lang.Object clone() throws java.lang.CloneNotSupportedException; method public final int compareTo(E); @@ -50637,7 +50639,7 @@ package java.lang { method public final int hashCode(); method public final java.lang.String name(); method public final int ordinal(); - method public static T valueOf(java.lang.Class<T>, java.lang.String); + method public static <T extends java.lang.Enum<T>> T valueOf(java.lang.Class<T>, java.lang.String); } public class EnumConstantNotPresentException extends java.lang.RuntimeException { @@ -50756,7 +50758,7 @@ package java.lang { ctor public IndexOutOfBoundsException(java.lang.String); } - public class InheritableThreadLocal extends java.lang.ThreadLocal { + public class InheritableThreadLocal<T> extends java.lang.ThreadLocal { ctor public InheritableThreadLocal(); method protected T childValue(T); } @@ -50835,7 +50837,7 @@ package java.lang { ctor public InterruptedException(java.lang.String); } - public abstract interface Iterable { + public abstract interface Iterable<T> { 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(); @@ -51050,12 +51052,12 @@ package java.lang { } public class Package implements java.lang.reflect.AnnotatedElement { - method public A getAnnotation(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A getAnnotation(java.lang.Class<A>); method public java.lang.annotation.Annotation[] getAnnotations(); - method public A[] getAnnotationsByType(java.lang.Class<A>); - method public A getDeclaredAnnotation(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(java.lang.Class<A>); method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); - method public A[] getDeclaredAnnotationsByType(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A[] getDeclaredAnnotationsByType(java.lang.Class<A>); method public java.lang.String getImplementationTitle(); method public java.lang.String getImplementationVendor(); method public java.lang.String getImplementationVersion(); @@ -51654,13 +51656,13 @@ package java.lang { method public void uncaughtException(java.lang.Thread, java.lang.Throwable); } - public class ThreadLocal { + public class ThreadLocal<T> { ctor public ThreadLocal(); method public T get(); method protected T initialValue(); method public void remove(); method public void set(T); - method public static java.lang.ThreadLocal<S> withInitial(java.util.function.Supplier<? extends S>); + method public static <S> java.lang.ThreadLocal<S> withInitial(java.util.function.Supplier<? extends S>); } public class Throwable implements java.io.Serializable { @@ -51763,6 +51765,8 @@ package java.lang.annotation { enum_constant public static final java.lang.annotation.ElementType PACKAGE; enum_constant public static final java.lang.annotation.ElementType PARAMETER; enum_constant public static final java.lang.annotation.ElementType TYPE; + enum_constant public static final java.lang.annotation.ElementType TYPE_PARAMETER; + enum_constant public static final java.lang.annotation.ElementType TYPE_USE; } public class IncompleteAnnotationException extends java.lang.RuntimeException { @@ -51798,30 +51802,30 @@ package java.lang.annotation { package java.lang.ref { - public class PhantomReference extends java.lang.ref.Reference { + public class PhantomReference<T> extends java.lang.ref.Reference { ctor public PhantomReference(T, java.lang.ref.ReferenceQueue<? super T>); } - public abstract class Reference { + public abstract class Reference<T> { method public void clear(); method public boolean enqueue(); method public T get(); method public boolean isEnqueued(); } - public class ReferenceQueue { + public class ReferenceQueue<T> { ctor public ReferenceQueue(); method public java.lang.ref.Reference<? extends T> poll(); method public java.lang.ref.Reference<? extends T> remove(long) throws java.lang.IllegalArgumentException, java.lang.InterruptedException; method public java.lang.ref.Reference<? extends T> remove() throws java.lang.InterruptedException; } - public class SoftReference extends java.lang.ref.Reference { + public class SoftReference<T> extends java.lang.ref.Reference { ctor public SoftReference(T); ctor public SoftReference(T, java.lang.ref.ReferenceQueue<? super T>); } - public class WeakReference extends java.lang.ref.Reference { + public class WeakReference<T> extends java.lang.ref.Reference { ctor public WeakReference(T); ctor public WeakReference(T, java.lang.ref.ReferenceQueue<? super T>); } @@ -51832,7 +51836,7 @@ package java.lang.reflect { public class AccessibleObject implements java.lang.reflect.AnnotatedElement { ctor protected AccessibleObject(); - method public T getAnnotation(java.lang.Class<T>); + method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>); method public java.lang.annotation.Annotation[] getAnnotations(); method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); method public boolean isAccessible(); @@ -51841,12 +51845,12 @@ package java.lang.reflect { } public abstract interface AnnotatedElement { - method public abstract T getAnnotation(java.lang.Class<T>); + method public abstract <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>); method public abstract java.lang.annotation.Annotation[] getAnnotations(); - method public default T[] getAnnotationsByType(java.lang.Class<T>); - method public default java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class<T>); + method public default <T extends java.lang.annotation.Annotation> T[] getAnnotationsByType(java.lang.Class<T>); + method public default <T extends java.lang.annotation.Annotation> T getDeclaredAnnotation(java.lang.Class<T>); method public abstract java.lang.annotation.Annotation[] getDeclaredAnnotations(); - method public default T[] getDeclaredAnnotationsByType(java.lang.Class<T>); + method public default <T extends java.lang.annotation.Annotation> T[] getDeclaredAnnotationsByType(java.lang.Class<T>); method public default boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>); } @@ -51874,7 +51878,7 @@ package java.lang.reflect { method public static void setShort(java.lang.Object, int, short) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException; } - public final class Constructor extends java.lang.reflect.Executable { + public final class Constructor<T> extends java.lang.reflect.Executable { method public java.lang.Class<T> getDeclaringClass(); method public java.lang.Class<?>[] getExceptionTypes(); method public int getModifiers(); @@ -51896,7 +51900,9 @@ package java.lang.reflect { method public abstract java.lang.annotation.Annotation[][] getParameterAnnotations(); method public int getParameterCount(); method public abstract java.lang.Class<?>[] getParameterTypes(); + method public java.lang.reflect.Parameter[] getParameters(); method public abstract java.lang.reflect.TypeVariable<?>[] getTypeParameters(); + method public final boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>); method public boolean isSynthetic(); method public boolean isVarArgs(); method public abstract java.lang.String toGenericString(); @@ -52019,6 +52025,21 @@ package java.lang.reflect { field public static final int VOLATILE = 64; // 0x40 } + public final class Parameter implements java.lang.reflect.AnnotatedElement { + method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>); + method public java.lang.annotation.Annotation[] getAnnotations(); + method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); + method public java.lang.reflect.Executable getDeclaringExecutable(); + method public int getModifiers(); + method public java.lang.String getName(); + method public java.lang.reflect.Type getParameterizedType(); + method public java.lang.Class<?> getType(); + method public boolean isImplicit(); + method public boolean isNamePresent(); + method public boolean isSynthetic(); + method public boolean isVarArgs(); + } + public abstract interface ParameterizedType implements java.lang.reflect.Type { method public abstract java.lang.reflect.Type[] getActualTypeArguments(); method public abstract java.lang.reflect.Type getOwnerType(); @@ -52042,7 +52063,7 @@ package java.lang.reflect { public abstract interface Type { } - public abstract interface TypeVariable implements java.lang.reflect.Type { + public abstract interface TypeVariable<D extends java.lang.reflect.GenericDeclaration> implements java.lang.reflect.Type { method public abstract java.lang.reflect.Type[] getBounds(); method public abstract D getGenericDeclaration(); method public abstract java.lang.String getName(); @@ -52831,7 +52852,7 @@ package java.net { method public abstract java.net.SocketImpl createSocketImpl(); } - public abstract interface SocketOption { + public abstract interface SocketOption<T> { method public abstract java.lang.String name(); method public abstract java.lang.Class<T> type(); } @@ -53363,9 +53384,9 @@ package java.nio.channels { } public abstract interface AsynchronousByteChannel implements java.nio.channels.AsynchronousChannel { - method public abstract void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer); - method public abstract void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer); } @@ -53393,25 +53414,25 @@ package java.nio.channels { public abstract class AsynchronousFileChannel implements java.nio.channels.AsynchronousChannel { ctor protected AsynchronousFileChannel(); method public abstract void force(boolean) throws java.io.IOException; - method public abstract void lock(long, long, boolean, A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>); - method public final void lock(A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>); + method public abstract <A> void lock(long, long, boolean, A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>); + method public final <A> void lock(A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>); method public abstract java.util.concurrent.Future<java.nio.channels.FileLock> lock(long, long, boolean); method public final java.util.concurrent.Future<java.nio.channels.FileLock> lock(); method public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.util.Set<? extends java.nio.file.OpenOption>, java.util.concurrent.ExecutorService, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException; method public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException; - method public abstract void read(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void read(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer, long); method public abstract long size() throws java.io.IOException; method public abstract java.nio.channels.AsynchronousFileChannel truncate(long) throws java.io.IOException; method public abstract java.nio.channels.FileLock tryLock(long, long, boolean) throws java.io.IOException; method public final java.nio.channels.FileLock tryLock() throws java.io.IOException; - method public abstract void write(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void write(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer, long); } public abstract class AsynchronousServerSocketChannel implements java.nio.channels.AsynchronousChannel java.nio.channels.NetworkChannel { ctor protected AsynchronousServerSocketChannel(java.nio.channels.spi.AsynchronousChannelProvider); - method public abstract void accept(A, java.nio.channels.CompletionHandler<java.nio.channels.AsynchronousSocketChannel, ? super A>); + method public abstract <A> void accept(A, java.nio.channels.CompletionHandler<java.nio.channels.AsynchronousSocketChannel, ? super A>); method public abstract java.util.concurrent.Future<java.nio.channels.AsynchronousSocketChannel> accept(); method public final java.nio.channels.AsynchronousServerSocketChannel bind(java.net.SocketAddress) throws java.io.IOException; method public abstract java.nio.channels.AsynchronousServerSocketChannel bind(java.net.SocketAddress, int) throws java.io.IOException; @@ -53419,30 +53440,30 @@ package java.nio.channels { method public static java.nio.channels.AsynchronousServerSocketChannel open(java.nio.channels.AsynchronousChannelGroup) throws java.io.IOException; method public static java.nio.channels.AsynchronousServerSocketChannel open() throws java.io.IOException; method public final java.nio.channels.spi.AsynchronousChannelProvider provider(); - method public abstract java.nio.channels.AsynchronousServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <T> java.nio.channels.AsynchronousServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; } public abstract class AsynchronousSocketChannel implements java.nio.channels.AsynchronousByteChannel java.nio.channels.NetworkChannel { ctor protected AsynchronousSocketChannel(java.nio.channels.spi.AsynchronousChannelProvider); method public abstract java.nio.channels.AsynchronousSocketChannel bind(java.net.SocketAddress) throws java.io.IOException; - method public abstract void connect(java.net.SocketAddress, A, java.nio.channels.CompletionHandler<java.lang.Void, ? super A>); + method public abstract <A> void connect(java.net.SocketAddress, A, java.nio.channels.CompletionHandler<java.lang.Void, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Void> connect(java.net.SocketAddress); method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException; method public abstract java.net.SocketAddress getRemoteAddress() throws java.io.IOException; method public static java.nio.channels.AsynchronousSocketChannel open(java.nio.channels.AsynchronousChannelGroup) throws java.io.IOException; method public static java.nio.channels.AsynchronousSocketChannel open() throws java.io.IOException; method public final java.nio.channels.spi.AsynchronousChannelProvider provider(); - method public abstract void read(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); - method public final void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void read(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public final <A> void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer); - method public abstract void read(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>); - method public abstract java.nio.channels.AsynchronousSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <A> void read(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>); + method public abstract <T> java.nio.channels.AsynchronousSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; method public abstract java.nio.channels.AsynchronousSocketChannel shutdownInput() throws java.io.IOException; method public abstract java.nio.channels.AsynchronousSocketChannel shutdownOutput() throws java.io.IOException; - method public abstract void write(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); - method public final void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void write(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public final <A> void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer); - method public abstract void write(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>); + method public abstract <A> void write(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>); } public abstract interface ByteChannel implements java.nio.channels.ReadableByteChannel java.nio.channels.WritableByteChannel { @@ -53482,7 +53503,7 @@ package java.nio.channels { ctor public ClosedSelectorException(); } - public abstract interface CompletionHandler { + public abstract interface CompletionHandler<V, A> { method public abstract void completed(V, A); method public abstract void failed(java.lang.Throwable, A); } @@ -53506,7 +53527,7 @@ package java.nio.channels { method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException; method public abstract java.net.SocketAddress receive(java.nio.ByteBuffer) throws java.io.IOException; method public abstract int send(java.nio.ByteBuffer, java.net.SocketAddress) throws java.io.IOException; - method public abstract java.nio.channels.DatagramChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <T> java.nio.channels.DatagramChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; method public abstract java.net.DatagramSocket socket(); method public final int validOps(); method public abstract int write(java.nio.ByteBuffer) throws java.io.IOException; @@ -53611,8 +53632,8 @@ package java.nio.channels { public abstract interface NetworkChannel implements java.nio.channels.Channel { method public abstract java.nio.channels.NetworkChannel bind(java.net.SocketAddress) throws java.io.IOException; method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException; - method public abstract T getOption(java.net.SocketOption<T>) throws java.io.IOException; - method public abstract java.nio.channels.NetworkChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <T> T getOption(java.net.SocketOption<T>) throws java.io.IOException; + method public abstract <T> java.nio.channels.NetworkChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; method public abstract java.util.Set<java.net.SocketOption<?>> supportedOptions(); } @@ -53734,7 +53755,7 @@ package java.nio.channels { method public abstract java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress, int) throws java.io.IOException; method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException; method public static java.nio.channels.ServerSocketChannel open() throws java.io.IOException; - method public abstract java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <T> java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; method public abstract java.net.ServerSocket socket(); method public final int validOps(); } @@ -53757,7 +53778,7 @@ package java.nio.channels { method public abstract int read(java.nio.ByteBuffer) throws java.io.IOException; method public abstract long read(java.nio.ByteBuffer[], int, int) throws java.io.IOException; method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException; - method public abstract java.nio.channels.SocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <T> java.nio.channels.SocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; method public abstract java.nio.channels.SocketChannel shutdownInput() throws java.io.IOException; method public abstract java.nio.channels.SocketChannel shutdownOutput() throws java.io.IOException; method public abstract java.net.Socket socket(); @@ -54042,11 +54063,11 @@ package java.nio.file { ctor public DirectoryNotEmptyException(java.lang.String); } - public abstract interface DirectoryStream implements java.io.Closeable java.lang.Iterable { + public abstract interface DirectoryStream<T> implements java.io.Closeable java.lang.Iterable { method public abstract java.util.Iterator<T> iterator(); } - public static abstract interface DirectoryStream.Filter { + public static abstract interface DirectoryStream.Filter<T> { method public abstract boolean accept(T) throws java.io.IOException; } @@ -54058,7 +54079,7 @@ package java.nio.file { public abstract class FileStore { ctor protected FileStore(); method public abstract java.lang.Object getAttribute(java.lang.String) throws java.io.IOException; - method public abstract V getFileStoreAttributeView(java.lang.Class<V>); + method public abstract <V extends java.nio.file.attribute.FileStoreAttributeView> V getFileStoreAttributeView(java.lang.Class<V>); method public abstract long getTotalSpace() throws java.io.IOException; method public abstract long getUnallocatedSpace() throws java.io.IOException; method public abstract long getUsableSpace() throws java.io.IOException; @@ -54130,7 +54151,7 @@ package java.nio.file { enum_constant public static final java.nio.file.FileVisitResult TERMINATE; } - public abstract interface FileVisitor { + public abstract interface FileVisitor<T> { method public abstract java.nio.file.FileVisitResult postVisitDirectory(T, java.io.IOException) throws java.io.IOException; method public abstract java.nio.file.FileVisitResult preVisitDirectory(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException; method public abstract java.nio.file.FileVisitResult visitFile(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException; @@ -54155,7 +54176,7 @@ package java.nio.file { method public static boolean exists(java.nio.file.Path, java.nio.file.LinkOption...); method public static java.util.stream.Stream<java.nio.file.Path> find(java.nio.file.Path, int, java.util.function.BiPredicate<java.nio.file.Path, java.nio.file.attribute.BasicFileAttributes>, java.nio.file.FileVisitOption...) throws java.io.IOException; method public static java.lang.Object getAttribute(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException; - method public static V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...); + method public static <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...); method public static java.nio.file.FileStore getFileStore(java.nio.file.Path) throws java.io.IOException; method public static java.nio.file.attribute.FileTime getLastModifiedTime(java.nio.file.Path, java.nio.file.LinkOption...) throws java.io.IOException; method public static java.nio.file.attribute.UserPrincipal getOwner(java.nio.file.Path, java.nio.file.LinkOption...) throws java.io.IOException; @@ -54188,7 +54209,7 @@ package java.nio.file { method public static byte[] readAllBytes(java.nio.file.Path) throws java.io.IOException; method public static java.util.List<java.lang.String> readAllLines(java.nio.file.Path, java.nio.charset.Charset) throws java.io.IOException; method public static java.util.List<java.lang.String> readAllLines(java.nio.file.Path) throws java.io.IOException; - method public static A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException; + method public static <A extends java.nio.file.attribute.BasicFileAttributes> A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException; method public static java.util.Map<java.lang.String, java.lang.Object> readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException; method public static java.nio.file.Path readSymbolicLink(java.nio.file.Path) throws java.io.IOException; method public static java.nio.file.Path setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption...) throws java.io.IOException; @@ -54296,17 +54317,17 @@ package java.nio.file { ctor public ReadOnlyFileSystemException(); } - public abstract interface SecureDirectoryStream implements java.nio.file.DirectoryStream { + public abstract interface SecureDirectoryStream<T> implements java.nio.file.DirectoryStream { method public abstract void deleteDirectory(T) throws java.io.IOException; method public abstract void deleteFile(T) throws java.io.IOException; - method public abstract V getFileAttributeView(java.lang.Class<V>); - method public abstract V getFileAttributeView(T, java.lang.Class<V>, java.nio.file.LinkOption...); + method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.lang.Class<V>); + method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(T, java.lang.Class<V>, java.nio.file.LinkOption...); method public abstract void move(T, java.nio.file.SecureDirectoryStream<T>, T) throws java.io.IOException; method public abstract java.nio.channels.SeekableByteChannel newByteChannel(T, java.util.Set<? extends java.nio.file.OpenOption>, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException; method public abstract java.nio.file.SecureDirectoryStream<T> newDirectoryStream(T, java.nio.file.LinkOption...) throws java.io.IOException; } - public class SimpleFileVisitor implements java.nio.file.FileVisitor { + public class SimpleFileVisitor<T> implements java.nio.file.FileVisitor { ctor protected SimpleFileVisitor(); method public java.nio.file.FileVisitResult postVisitDirectory(T, java.io.IOException) throws java.io.IOException; method public java.nio.file.FileVisitResult preVisitDirectory(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException; @@ -54344,13 +54365,13 @@ package java.nio.file { field public static final java.nio.file.WatchEvent.Kind<java.lang.Object> OVERFLOW; } - public abstract interface WatchEvent { + public abstract interface WatchEvent<T> { method public abstract T context(); method public abstract int count(); method public abstract java.nio.file.WatchEvent.Kind<T> kind(); } - public static abstract interface WatchEvent.Kind { + public static abstract interface WatchEvent.Kind<T> { method public abstract java.lang.String name(); method public abstract java.lang.Class<T> type(); } @@ -54486,7 +54507,7 @@ package java.nio.file.attribute { method public abstract boolean isSystem(); } - public abstract interface FileAttribute { + public abstract interface FileAttribute<T> { method public abstract java.lang.String name(); method public abstract T value(); } @@ -54583,7 +54604,7 @@ package java.nio.file.spi { method public void createSymbolicLink(java.nio.file.Path, java.nio.file.Path, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException; method public abstract void delete(java.nio.file.Path) throws java.io.IOException; method public boolean deleteIfExists(java.nio.file.Path) throws java.io.IOException; - method public abstract V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...); + method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...); method public abstract java.nio.file.FileStore getFileStore(java.nio.file.Path) throws java.io.IOException; method public abstract java.nio.file.FileSystem getFileSystem(java.net.URI); method public abstract java.nio.file.Path getPath(java.net.URI); @@ -54600,7 +54621,7 @@ package java.nio.file.spi { method public java.nio.file.FileSystem newFileSystem(java.nio.file.Path, java.util.Map<java.lang.String, ?>) throws java.io.IOException; method public java.io.InputStream newInputStream(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException; method public java.io.OutputStream newOutputStream(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException; - method public abstract A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException; + method public abstract <A extends java.nio.file.attribute.BasicFileAttributes> A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException; method public abstract java.util.Map<java.lang.String, java.lang.Object> readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException; method public java.nio.file.Path readSymbolicLink(java.nio.file.Path) throws java.io.IOException; method public abstract void setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption...) throws java.io.IOException; @@ -54630,12 +54651,12 @@ package java.security { public final class AccessController { method public static void checkPermission(java.security.Permission) throws java.security.AccessControlException; - method public static T doPrivileged(java.security.PrivilegedAction<T>); - method public static T doPrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext); - method public static T doPrivileged(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; - method public static T doPrivileged(java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException; - method public static T doPrivilegedWithCombiner(java.security.PrivilegedAction<T>); - method public static T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; + method public static <T> T doPrivileged(java.security.PrivilegedAction<T>); + method public static <T> T doPrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext); + method public static <T> T doPrivileged(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; + method public static <T> T doPrivileged(java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException; + method public static <T> T doPrivilegedWithCombiner(java.security.PrivilegedAction<T>); + method public static <T> T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; method public static java.security.AccessControlContext getContext(); } @@ -54674,7 +54695,7 @@ package java.security { method public static java.security.AlgorithmParameters getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException; method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException; method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException; - method public final T getParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException; + method public final <T extends java.security.spec.AlgorithmParameterSpec> T getParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException; method public final java.security.Provider getProvider(); method public final void init(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException; method public final void init(byte[]) throws java.io.IOException; @@ -54686,7 +54707,7 @@ package java.security { ctor public AlgorithmParametersSpi(); method protected abstract byte[] engineGetEncoded() throws java.io.IOException; method protected abstract byte[] engineGetEncoded(java.lang.String) throws java.io.IOException; - method protected abstract T engineGetParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException; + method protected abstract <T extends java.security.spec.AlgorithmParameterSpec> T engineGetParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException; method protected abstract void engineInit(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException; method protected abstract void engineInit(byte[]) throws java.io.IOException; method protected abstract void engineInit(byte[], java.lang.String) throws java.io.IOException; @@ -54878,7 +54899,7 @@ package java.security { method public static java.security.KeyFactory getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException; method public static java.security.KeyFactory getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException; method public static java.security.KeyFactory getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException; - method public final T getKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException; + method public final <T extends java.security.spec.KeySpec> T getKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException; method public final java.security.Provider getProvider(); method public final java.security.Key translateKey(java.security.Key) throws java.security.InvalidKeyException; } @@ -54887,7 +54908,7 @@ package java.security { ctor public KeyFactorySpi(); method protected abstract java.security.PrivateKey engineGeneratePrivate(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException; method protected abstract java.security.PublicKey engineGeneratePublic(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException; - method protected abstract T engineGetKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException; + method protected abstract <T extends java.security.spec.KeySpec> T engineGetKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException; method protected abstract java.security.Key engineTranslateKey(java.security.Key) throws java.security.InvalidKeyException; } @@ -55175,7 +55196,7 @@ package java.security { field public static final long serialVersionUID = 6034044314589513430L; // 0x53bd3b559a12c6d6L } - public abstract interface PrivilegedAction { + public abstract interface PrivilegedAction<T> { method public abstract T run(); } @@ -55184,7 +55205,7 @@ package java.security { method public java.lang.Exception getException(); } - public abstract interface PrivilegedExceptionAction { + public abstract interface PrivilegedExceptionAction<T> { method public abstract T run() throws java.lang.Exception; } @@ -57378,11 +57399,11 @@ package java.sql { method public abstract void free() throws java.sql.SQLException; method public abstract java.io.InputStream getBinaryStream() throws java.sql.SQLException; method public abstract java.io.Reader getCharacterStream() throws java.sql.SQLException; - method public abstract T getSource(java.lang.Class<T>) throws java.sql.SQLException; + method public abstract <T extends javax.xml.transform.Source> T getSource(java.lang.Class<T>) throws java.sql.SQLException; method public abstract java.lang.String getString() throws java.sql.SQLException; method public abstract java.io.OutputStream setBinaryStream() throws java.sql.SQLException; method public abstract java.io.Writer setCharacterStream() throws java.sql.SQLException; - method public abstract T setResult(java.lang.Class<T>) throws java.sql.SQLException; + method public abstract <T extends javax.xml.transform.Result> T setResult(java.lang.Class<T>) throws java.sql.SQLException; method public abstract void setString(java.lang.String) throws java.sql.SQLException; } @@ -57506,7 +57527,7 @@ package java.sql { public abstract interface Wrapper { method public abstract boolean isWrapperFor(java.lang.Class<?>) throws java.sql.SQLException; - method public abstract T unwrap(java.lang.Class<T>) throws java.sql.SQLException; + method public abstract <T> T unwrap(java.lang.Class<T>) throws java.sql.SQLException; } } @@ -58039,7 +58060,7 @@ package java.text { package java.util { - public abstract class AbstractCollection implements java.util.Collection { + public abstract class AbstractCollection<E> implements java.util.Collection { ctor protected AbstractCollection(); method public boolean add(E); method public boolean addAll(java.util.Collection<? extends E>); @@ -58053,10 +58074,10 @@ package java.util { method public boolean retainAll(java.util.Collection<?>); method public abstract int size(); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public <T> T[] toArray(T[]); } - public abstract class AbstractList extends java.util.AbstractCollection implements java.util.List { + public abstract class AbstractList<E> extends java.util.AbstractCollection implements java.util.List { ctor protected AbstractList(); method public void add(int, E); method public boolean addAll(int, java.util.Collection<? extends E>); @@ -58073,7 +58094,7 @@ package java.util { field protected transient int modCount; } - public abstract class AbstractMap implements java.util.Map { + public abstract class AbstractMap<K, V> implements java.util.Map { ctor protected AbstractMap(); method public void clear(); method public boolean containsKey(java.lang.Object); @@ -58089,7 +58110,7 @@ package java.util { method public java.util.Collection<V> values(); } - public static class AbstractMap.SimpleEntry implements java.util.Map.Entry java.io.Serializable { + public static class AbstractMap.SimpleEntry<K, V> implements java.util.Map.Entry java.io.Serializable { ctor public AbstractMap.SimpleEntry(K, V); ctor public AbstractMap.SimpleEntry(java.util.Map.Entry<? extends K, ? extends V>); method public K getKey(); @@ -58097,7 +58118,7 @@ package java.util { method public V setValue(V); } - public static class AbstractMap.SimpleImmutableEntry implements java.util.Map.Entry java.io.Serializable { + public static class AbstractMap.SimpleImmutableEntry<K, V> implements java.util.Map.Entry java.io.Serializable { ctor public AbstractMap.SimpleImmutableEntry(K, V); ctor public AbstractMap.SimpleImmutableEntry(java.util.Map.Entry<? extends K, ? extends V>); method public K getKey(); @@ -58105,23 +58126,23 @@ package java.util { method public V setValue(V); } - public abstract class AbstractQueue extends java.util.AbstractCollection implements java.util.Queue { + public abstract class AbstractQueue<E> extends java.util.AbstractCollection implements java.util.Queue { ctor protected AbstractQueue(); method public E element(); method public E remove(); } - public abstract class AbstractSequentialList extends java.util.AbstractList { + public abstract class AbstractSequentialList<E> extends java.util.AbstractList { ctor protected AbstractSequentialList(); method public E get(int); method public abstract java.util.ListIterator<E> listIterator(int); } - public abstract class AbstractSet extends java.util.AbstractCollection implements java.util.Set { + public abstract class AbstractSet<E> extends java.util.AbstractCollection implements java.util.Set { ctor protected AbstractSet(); } - public class ArrayDeque extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable { + public class ArrayDeque<E> extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable { ctor public ArrayDeque(); ctor public ArrayDeque(int); ctor public ArrayDeque(java.util.Collection<? extends E>); @@ -58153,7 +58174,7 @@ package java.util { 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 { + public class ArrayList<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public ArrayList(int); ctor public ArrayList(); ctor public ArrayList(java.util.Collection<? extends E>); @@ -58170,7 +58191,7 @@ package java.util { } public class Arrays { - method public static java.util.List<T> asList(T...); + method public static <T> java.util.List<T> asList(T...); method public static int binarySearch(long[], long); method public static int binarySearch(long[], int, int, long); method public static int binarySearch(int[], int); @@ -58187,10 +58208,10 @@ package java.util { method public static int binarySearch(float[], int, int, float); method public static int binarySearch(java.lang.Object[], java.lang.Object); method public static int binarySearch(java.lang.Object[], int, int, java.lang.Object); - method public static int binarySearch(T[], T, java.util.Comparator<? super T>); - method public static int binarySearch(T[], int, int, T, java.util.Comparator<? super T>); - method public static T[] copyOf(T[], int); - method public static T[] copyOf(U[], int, java.lang.Class<? extends T[]>); + method public static <T> int binarySearch(T[], T, java.util.Comparator<? super T>); + method public static <T> int binarySearch(T[], int, int, T, java.util.Comparator<? super T>); + method public static <T> T[] copyOf(T[], int); + method public static <T, U> T[] copyOf(U[], int, java.lang.Class<? extends T[]>); method public static byte[] copyOf(byte[], int); method public static short[] copyOf(short[], int); method public static int[] copyOf(int[], int); @@ -58199,8 +58220,8 @@ package java.util { method public static float[] copyOf(float[], int); method public static double[] copyOf(double[], int); method public static boolean[] copyOf(boolean[], int); - method public static T[] copyOfRange(T[], int, int); - method public static T[] copyOfRange(U[], int, int, java.lang.Class<? extends T[]>); + method public static <T> T[] copyOfRange(T[], int, int); + method public static <T, U> T[] copyOfRange(U[], int, int, java.lang.Class<? extends T[]>); method public static byte[] copyOfRange(byte[], int, int); method public static short[] copyOfRange(short[], int, int); method public static int[] copyOfRange(int[], int, int); @@ -58248,15 +58269,15 @@ package java.util { method public static int hashCode(float[]); method public static int hashCode(double[]); method public static int hashCode(java.lang.Object[]); - method public static void parallelPrefix(T[], java.util.function.BinaryOperator<T>); - method public static void parallelPrefix(T[], int, int, java.util.function.BinaryOperator<T>); + method public static <T> void parallelPrefix(T[], java.util.function.BinaryOperator<T>); + method public static <T> void parallelPrefix(T[], int, int, java.util.function.BinaryOperator<T>); method public static void parallelPrefix(long[], java.util.function.LongBinaryOperator); method public static void parallelPrefix(long[], int, int, java.util.function.LongBinaryOperator); method public static void parallelPrefix(double[], java.util.function.DoubleBinaryOperator); method public static void parallelPrefix(double[], int, int, java.util.function.DoubleBinaryOperator); method public static void parallelPrefix(int[], java.util.function.IntBinaryOperator); method public static void parallelPrefix(int[], int, int, java.util.function.IntBinaryOperator); - method public static void parallelSetAll(T[], java.util.function.IntFunction<? extends T>); + method public static <T> void parallelSetAll(T[], java.util.function.IntFunction<? extends T>); method public static void parallelSetAll(int[], java.util.function.IntUnaryOperator); method public static void parallelSetAll(long[], java.util.function.IntToLongFunction); method public static void parallelSetAll(double[], java.util.function.IntToDoubleFunction); @@ -58274,11 +58295,11 @@ package java.util { method public static void parallelSort(float[], int, int); method public static void parallelSort(double[]); method public static void parallelSort(double[], int, int); - method public static void parallelSort(T[]); - method public static void parallelSort(T[], int, int); - method public static void parallelSort(T[], java.util.Comparator<? super T>); - method public static void parallelSort(T[], int, int, java.util.Comparator<? super T>); - method public static void setAll(T[], java.util.function.IntFunction<? extends T>); + method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[]); + method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[], int, int); + method public static <T> void parallelSort(T[], java.util.Comparator<? super T>); + method public static <T> void parallelSort(T[], int, int, java.util.Comparator<? super T>); + method public static <T> void setAll(T[], java.util.function.IntFunction<? extends T>); method public static void setAll(int[], java.util.function.IntUnaryOperator); method public static void setAll(long[], java.util.function.IntToLongFunction); method public static void setAll(double[], java.util.function.IntToDoubleFunction); @@ -58298,18 +58319,18 @@ package java.util { method public static void sort(double[], int, int); method public static void sort(java.lang.Object[]); 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 <T> void sort(T[], java.util.Comparator<? super T>); + method public static <T> void sort(T[], int, int, java.util.Comparator<? super T>); + method public static <T> java.util.Spliterator<T> spliterator(T[]); + method public static <T> 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.util.stream.Stream<T> stream(T[]); - method public static java.util.stream.Stream<T> stream(T[], int, int); + method public static <T> java.util.stream.Stream<T> stream(T[]); + method public static <T> java.util.stream.Stream<T> stream(T[], int, int); method public static java.util.stream.IntStream stream(int[]); method public static java.util.stream.IntStream stream(int[], int, int); method public static java.util.stream.LongStream stream(long[]); @@ -58493,7 +58514,7 @@ package java.util { field protected long time; } - public abstract interface Collection implements java.lang.Iterable { + public abstract interface Collection<E> implements java.lang.Iterable { method public abstract boolean add(E); method public abstract boolean addAll(java.util.Collection<? extends E>); method public abstract void clear(); @@ -58511,86 +58532,86 @@ package java.util { method public abstract int size(); method public default java.util.stream.Stream<E> stream(); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract <T> T[] toArray(T[]); } public class Collections { - method public static boolean addAll(java.util.Collection<? super T>, T...); - method public static java.util.Queue<T> asLifoQueue(java.util.Deque<T>); - method public static int binarySearch(java.util.List<? extends java.lang.Comparable<? super T>>, T); - method public static int binarySearch(java.util.List<? extends T>, T, java.util.Comparator<? super T>); - method public static java.util.Collection<E> checkedCollection(java.util.Collection<E>, java.lang.Class<E>); - method public static java.util.List<E> checkedList(java.util.List<E>, java.lang.Class<E>); - method public static java.util.Map<K, V> checkedMap(java.util.Map<K, V>, java.lang.Class<K>, java.lang.Class<V>); - method public static java.util.Set<E> checkedSet(java.util.Set<E>, java.lang.Class<E>); - method public static java.util.SortedMap<K, V> checkedSortedMap(java.util.SortedMap<K, V>, java.lang.Class<K>, java.lang.Class<V>); - method public static java.util.SortedSet<E> checkedSortedSet(java.util.SortedSet<E>, java.lang.Class<E>); - method public static void copy(java.util.List<? super T>, java.util.List<? extends T>); + method public static <T> boolean addAll(java.util.Collection<? super T>, T...); + method public static <T> java.util.Queue<T> asLifoQueue(java.util.Deque<T>); + method public static <T> int binarySearch(java.util.List<? extends java.lang.Comparable<? super T>>, T); + method public static <T> int binarySearch(java.util.List<? extends T>, T, java.util.Comparator<? super T>); + method public static <E> java.util.Collection<E> checkedCollection(java.util.Collection<E>, java.lang.Class<E>); + method public static <E> java.util.List<E> checkedList(java.util.List<E>, java.lang.Class<E>); + method public static <K, V> java.util.Map<K, V> checkedMap(java.util.Map<K, V>, java.lang.Class<K>, java.lang.Class<V>); + method public static <E> java.util.Set<E> checkedSet(java.util.Set<E>, java.lang.Class<E>); + method public static <K, V> java.util.SortedMap<K, V> checkedSortedMap(java.util.SortedMap<K, V>, java.lang.Class<K>, java.lang.Class<V>); + method public static <E> java.util.SortedSet<E> checkedSortedSet(java.util.SortedSet<E>, java.lang.Class<E>); + method public static <T> void copy(java.util.List<? super T>, java.util.List<? extends T>); method public static boolean disjoint(java.util.Collection<?>, java.util.Collection<?>); - method public static java.util.Enumeration<T> emptyEnumeration(); - method public static java.util.Iterator<T> emptyIterator(); - method public static final java.util.List<T> emptyList(); - method public static java.util.ListIterator<T> emptyListIterator(); - method public static final java.util.Map<K, V> emptyMap(); - method public static final java.util.Set<T> emptySet(); - method public static java.util.Enumeration<T> enumeration(java.util.Collection<T>); - method public static void fill(java.util.List<? super T>, T); + method public static <T> java.util.Enumeration<T> emptyEnumeration(); + method public static <T> java.util.Iterator<T> emptyIterator(); + method public static final <T> java.util.List<T> emptyList(); + method public static <T> java.util.ListIterator<T> emptyListIterator(); + method public static final <K, V> java.util.Map<K, V> emptyMap(); + method public static final <T> java.util.Set<T> emptySet(); + method public static <T> java.util.Enumeration<T> enumeration(java.util.Collection<T>); + method public static <T> void fill(java.util.List<? super T>, T); method public static int frequency(java.util.Collection<?>, java.lang.Object); method public static int indexOfSubList(java.util.List<?>, java.util.List<?>); method public static int lastIndexOfSubList(java.util.List<?>, java.util.List<?>); - method public static java.util.ArrayList<T> list(java.util.Enumeration<T>); - method public static T max(java.util.Collection<? extends T>); - method public static T max(java.util.Collection<? extends T>, java.util.Comparator<? super T>); - method public static T min(java.util.Collection<? extends T>); - method public static T min(java.util.Collection<? extends T>, java.util.Comparator<? super T>); - method public static java.util.List<T> nCopies(int, T); - method public static java.util.Set<E> newSetFromMap(java.util.Map<E, java.lang.Boolean>); - method public static boolean replaceAll(java.util.List<T>, T, T); + method public static <T> java.util.ArrayList<T> list(java.util.Enumeration<T>); + method public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T max(java.util.Collection<? extends T>); + method public static <T> T max(java.util.Collection<? extends T>, java.util.Comparator<? super T>); + method public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T min(java.util.Collection<? extends T>); + method public static <T> T min(java.util.Collection<? extends T>, java.util.Comparator<? super T>); + method public static <T> java.util.List<T> nCopies(int, T); + method public static <E> java.util.Set<E> newSetFromMap(java.util.Map<E, java.lang.Boolean>); + method public static <T> boolean replaceAll(java.util.List<T>, T, T); method public static void reverse(java.util.List<?>); - method public static java.util.Comparator<T> reverseOrder(); - method public static java.util.Comparator<T> reverseOrder(java.util.Comparator<T>); + method public static <T> java.util.Comparator<T> reverseOrder(); + method public static <T> java.util.Comparator<T> reverseOrder(java.util.Comparator<T>); method public static void rotate(java.util.List<?>, int); method public static void shuffle(java.util.List<?>); method public static void shuffle(java.util.List<?>, java.util.Random); - method public static java.util.Set<E> singleton(E); - method public static java.util.List<E> singletonList(E); - method public static java.util.Map<K, V> singletonMap(K, V); - method public static void sort(java.util.List<T>); - method public static void sort(java.util.List<T>, java.util.Comparator<? super T>); + method public static <E> java.util.Set<E> singleton(E); + method public static <E> java.util.List<E> singletonList(E); + method public static <K, V> java.util.Map<K, V> singletonMap(K, V); + method public static <T extends java.lang.Comparable<? super T>> void sort(java.util.List<T>); + method public static <T> void sort(java.util.List<T>, java.util.Comparator<? super T>); method public static void swap(java.util.List<?>, int, int); - method public static java.util.Collection<T> synchronizedCollection(java.util.Collection<T>); - method public static java.util.List<T> synchronizedList(java.util.List<T>); - method public static java.util.Map<K, V> synchronizedMap(java.util.Map<K, V>); - method public static java.util.Set<T> synchronizedSet(java.util.Set<T>); - method public static java.util.SortedMap<K, V> synchronizedSortedMap(java.util.SortedMap<K, V>); - method public static java.util.SortedSet<T> synchronizedSortedSet(java.util.SortedSet<T>); - method public static java.util.Collection<T> unmodifiableCollection(java.util.Collection<? extends T>); - method public static java.util.List<T> unmodifiableList(java.util.List<? extends T>); - method public static java.util.Map<K, V> unmodifiableMap(java.util.Map<? extends K, ? extends V>); - method public static java.util.Set<T> unmodifiableSet(java.util.Set<? extends T>); - method public static java.util.SortedMap<K, V> unmodifiableSortedMap(java.util.SortedMap<K, ? extends V>); - method public static java.util.SortedSet<T> unmodifiableSortedSet(java.util.SortedSet<T>); + method public static <T> java.util.Collection<T> synchronizedCollection(java.util.Collection<T>); + method public static <T> java.util.List<T> synchronizedList(java.util.List<T>); + method public static <K, V> java.util.Map<K, V> synchronizedMap(java.util.Map<K, V>); + method public static <T> java.util.Set<T> synchronizedSet(java.util.Set<T>); + method public static <K, V> java.util.SortedMap<K, V> synchronizedSortedMap(java.util.SortedMap<K, V>); + method public static <T> java.util.SortedSet<T> synchronizedSortedSet(java.util.SortedSet<T>); + method public static <T> java.util.Collection<T> unmodifiableCollection(java.util.Collection<? extends T>); + method public static <T> java.util.List<T> unmodifiableList(java.util.List<? extends T>); + method public static <K, V> java.util.Map<K, V> unmodifiableMap(java.util.Map<? extends K, ? extends V>); + method public static <T> java.util.Set<T> unmodifiableSet(java.util.Set<? extends T>); + method public static <K, V> java.util.SortedMap<K, V> unmodifiableSortedMap(java.util.SortedMap<K, ? extends V>); + method public static <T> java.util.SortedSet<T> unmodifiableSortedSet(java.util.SortedSet<T>); field public static final java.util.List EMPTY_LIST; field public static final java.util.Map EMPTY_MAP; field public static final java.util.Set EMPTY_SET; } - public abstract interface Comparator { + public abstract interface Comparator<T> { method public abstract int compare(T, T); - method public static java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>); - method public static java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>); - method public static java.util.Comparator<T> comparingDouble(java.util.function.ToDoubleFunction<? super T>); - method public static java.util.Comparator<T> comparingInt(java.util.function.ToIntFunction<? super T>); - method public static java.util.Comparator<T> comparingLong(java.util.function.ToLongFunction<? super T>); + method public static <T, U> java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>); + method public static <T, U extends java.lang.Comparable<? super U>> java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>); + method public static <T> java.util.Comparator<T> comparingDouble(java.util.function.ToDoubleFunction<? super T>); + method public static <T> java.util.Comparator<T> comparingInt(java.util.function.ToIntFunction<? super T>); + method public static <T> java.util.Comparator<T> comparingLong(java.util.function.ToLongFunction<? super T>); method public abstract boolean equals(java.lang.Object); - method public static java.util.Comparator<T> naturalOrder(); - method public static java.util.Comparator<T> nullsFirst(java.util.Comparator<? super T>); - method public static java.util.Comparator<T> nullsLast(java.util.Comparator<? super T>); - method public static java.util.Comparator<T> reverseOrder(); + method public static <T extends java.lang.Comparable<? super T>> java.util.Comparator<T> naturalOrder(); + method public static <T> java.util.Comparator<T> nullsFirst(java.util.Comparator<? super T>); + method public static <T> java.util.Comparator<T> nullsLast(java.util.Comparator<? super T>); + method public static <T extends java.lang.Comparable<? super T>> java.util.Comparator<T> reverseOrder(); method public default java.util.Comparator<T> reversed(); method public default java.util.Comparator<T> thenComparing(java.util.Comparator<? super T>); - method public default java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>); - method public default java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>); + method public default <U> java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>); + method public default <U extends java.lang.Comparable<? super U>> java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>); method public default java.util.Comparator<T> thenComparingDouble(java.util.function.ToDoubleFunction<? super T>); method public default java.util.Comparator<T> thenComparingInt(java.util.function.ToIntFunction<? super T>); method public default java.util.Comparator<T> thenComparingLong(java.util.function.ToLongFunction<? super T>); @@ -58649,7 +58670,7 @@ package java.util { method public deprecated java.lang.String toLocaleString(); } - public abstract interface Deque implements java.util.Queue { + public abstract interface Deque<E> implements java.util.Queue { method public abstract boolean add(E); method public abstract void addFirst(E); method public abstract void addLast(E); @@ -58679,7 +58700,7 @@ package java.util { method public abstract int size(); } - public abstract class Dictionary { + public abstract class Dictionary<K, V> { ctor public Dictionary(); method public abstract java.util.Enumeration<V> elements(); method public abstract V get(java.lang.Object); @@ -58710,7 +58731,7 @@ package java.util { ctor public EmptyStackException(); } - public class EnumMap extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable { + public class EnumMap<K extends java.lang.Enum<K>, V> extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable { ctor public EnumMap(java.lang.Class<K>); ctor public EnumMap(java.util.EnumMap<K, ? extends V>); ctor public EnumMap(java.util.Map<K, ? extends V>); @@ -58718,23 +58739,23 @@ package java.util { method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); } - public abstract class EnumSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable { - method public static java.util.EnumSet<E> allOf(java.lang.Class<E>); + public abstract class EnumSet<E extends java.lang.Enum<E>> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable { + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> allOf(java.lang.Class<E>); method public java.util.EnumSet<E> clone(); - method public static java.util.EnumSet<E> complementOf(java.util.EnumSet<E>); - method public static java.util.EnumSet<E> copyOf(java.util.EnumSet<E>); - method public static java.util.EnumSet<E> copyOf(java.util.Collection<E>); - method public static java.util.EnumSet<E> noneOf(java.lang.Class<E>); - method public static java.util.EnumSet<E> of(E); - method public static java.util.EnumSet<E> of(E, E); - method public static java.util.EnumSet<E> of(E, E, E); - method public static java.util.EnumSet<E> of(E, E, E, E); - method public static java.util.EnumSet<E> of(E, E, E, E, E); - method public static java.util.EnumSet<E> of(E, E...); - method public static java.util.EnumSet<E> range(E, E); - } - - public abstract interface Enumeration { + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> complementOf(java.util.EnumSet<E>); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> copyOf(java.util.EnumSet<E>); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> copyOf(java.util.Collection<E>); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> noneOf(java.lang.Class<E>); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E, E); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E, E, E); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E...); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> range(E, E); + } + + public abstract interface Enumeration<E> { method public abstract boolean hasMoreElements(); method public abstract E nextElement(); } @@ -58742,7 +58763,7 @@ package java.util { public abstract interface EventListener { } - public abstract class EventListenerProxy implements java.util.EventListener { + public abstract class EventListenerProxy<T extends java.util.EventListener> implements java.util.EventListener { ctor public EventListenerProxy(T); method public T getListener(); } @@ -58828,7 +58849,7 @@ package java.util { field public static final int BC = 0; // 0x0 } - public class HashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class HashMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public HashMap(int, float); ctor public HashMap(int); ctor public HashMap(); @@ -58848,7 +58869,7 @@ package java.util { method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>); } - public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set { + public class HashSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set { ctor public HashSet(); ctor public HashSet(java.util.Collection<? extends E>); ctor public HashSet(int, float); @@ -58859,7 +58880,7 @@ package java.util { method public java.util.Spliterator<E> spliterator(); } - public class Hashtable extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class Hashtable<K, V> extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public Hashtable(int, float); ctor public Hashtable(int); ctor public Hashtable(); @@ -58894,7 +58915,7 @@ package java.util { method public java.util.Collection<V> values(); } - public class IdentityHashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class IdentityHashMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public IdentityHashMap(); ctor public IdentityHashMap(int); ctor public IdentityHashMap(java.util.Map<? extends K, ? extends V>); @@ -58961,14 +58982,14 @@ package java.util { ctor public InvalidPropertiesFormatException(java.lang.String); } - public abstract interface Iterator { + public abstract interface Iterator<E> { method public default void forEachRemaining(java.util.function.Consumer<? super E>); method public abstract boolean hasNext(); method public abstract E next(); method public default void remove(); } - public class LinkedHashMap extends java.util.HashMap implements java.util.Map { + public class LinkedHashMap<K, V> extends java.util.HashMap implements java.util.Map { ctor public LinkedHashMap(int, float); ctor public LinkedHashMap(int); ctor public LinkedHashMap(); @@ -58977,14 +58998,14 @@ package java.util { method protected boolean removeEldestEntry(java.util.Map.Entry<K, V>); } - public class LinkedHashSet extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set { + public class LinkedHashSet<E> extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set { ctor public LinkedHashSet(int, float); ctor public LinkedHashSet(int); ctor public LinkedHashSet(); ctor public LinkedHashSet(java.util.Collection<? extends E>); } - public class LinkedList extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable { + public class LinkedList<E> extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable { ctor public LinkedList(); ctor public LinkedList(java.util.Collection<? extends E>); method public void addFirst(E); @@ -59015,7 +59036,7 @@ package java.util { method public java.util.Spliterator<E> spliterator(); } - public abstract interface List implements java.util.Collection { + public abstract interface List<E> implements java.util.Collection { method public abstract boolean add(E); method public abstract void add(int, E); method public abstract boolean addAll(java.util.Collection<? extends E>); @@ -59042,10 +59063,10 @@ package java.util { method public default void sort(java.util.Comparator<? super E>); method public abstract java.util.List<E> subList(int, int); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract <T> T[] toArray(T[]); } - public abstract interface ListIterator implements java.util.Iterator { + public abstract interface ListIterator<E> implements java.util.Iterator { method public abstract void add(E); method public abstract boolean hasNext(); method public abstract boolean hasPrevious(); @@ -59096,8 +59117,10 @@ package java.util { method public java.util.Set<java.lang.String> getUnicodeLocaleKeys(); method public java.lang.String getUnicodeLocaleType(java.lang.String); method public java.lang.String getVariant(); + method public boolean hasExtensions(); method public static synchronized void setDefault(java.util.Locale); method public static synchronized void setDefault(java.util.Locale.Category, java.util.Locale); + method public java.util.Locale stripExtensions(); method public java.lang.String toLanguageTag(); method public final java.lang.String toString(); field public static final java.util.Locale CANADA; @@ -59162,7 +59185,7 @@ package java.util { method public final long getSum(); } - public abstract interface Map { + public abstract interface Map<K, V> { method public abstract void clear(); method public default V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public default V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>); @@ -59190,11 +59213,11 @@ package java.util { method public abstract java.util.Collection<V> values(); } - 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 static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(); - method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(java.util.Comparator<? super V>); + public static abstract interface Map.Entry<K, V> { + method public static <K extends java.lang.Comparable<? super K>, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(); + method public static <K, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(java.util.Comparator<? super K>); + method public static <K, V extends java.lang.Comparable<? super V>> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(); + method public static <K, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(java.util.Comparator<? super V>); method public abstract boolean equals(java.lang.Object); method public abstract K getKey(); method public abstract V getValue(); @@ -59218,7 +59241,7 @@ package java.util { method public java.lang.String getKey(); } - public abstract interface NavigableMap implements java.util.SortedMap { + public abstract interface NavigableMap<K, V> implements java.util.SortedMap { method public abstract java.util.Map.Entry<K, V> ceilingEntry(K); method public abstract K ceilingKey(K); method public abstract java.util.NavigableSet<K> descendingKeySet(); @@ -59242,7 +59265,7 @@ package java.util { method public abstract java.util.SortedMap<K, V> tailMap(K); } - public abstract interface NavigableSet implements java.util.SortedSet { + public abstract interface NavigableSet<E> implements java.util.SortedSet { method public abstract E ceiling(E); method public abstract java.util.Iterator<E> descendingIterator(); method public abstract java.util.NavigableSet<E> descendingSet(); @@ -59266,16 +59289,16 @@ package java.util { } public final class Objects { - method public static int compare(T, T, java.util.Comparator<? super T>); + method public static <T> int compare(T, T, java.util.Comparator<? super T>); method public static boolean deepEquals(java.lang.Object, java.lang.Object); method public static boolean equals(java.lang.Object, java.lang.Object); method public static int hash(java.lang.Object...); method public static int hashCode(java.lang.Object); method public static boolean isNull(java.lang.Object); method public static boolean nonNull(java.lang.Object); - method public static T requireNonNull(T); - method public static T requireNonNull(T, java.lang.String); - method public static T requireNonNull(T, java.util.function.Supplier<java.lang.String>); + method public static <T> T requireNonNull(T); + method public static <T> T requireNonNull(T, java.lang.String); + method public static <T> T requireNonNull(T, java.util.function.Supplier<java.lang.String>); method public static java.lang.String toString(java.lang.Object); method public static java.lang.String toString(java.lang.Object, java.lang.String); } @@ -59297,19 +59320,19 @@ package java.util { method public abstract void update(java.util.Observable, java.lang.Object); } - public final class Optional { - method public static java.util.Optional<T> empty(); + public final class Optional<T> { + method public static <T> java.util.Optional<T> empty(); method public java.util.Optional<T> filter(java.util.function.Predicate<? super T>); - method public java.util.Optional<U> flatMap(java.util.function.Function<? super T, java.util.Optional<U>>); + method public <U> java.util.Optional<U> flatMap(java.util.function.Function<? super T, java.util.Optional<U>>); method public T get(); method public void ifPresent(java.util.function.Consumer<? super T>); method public boolean isPresent(); - method public java.util.Optional<U> map(java.util.function.Function<? super T, ? extends U>); - method public static java.util.Optional<T> of(T); - method public static java.util.Optional<T> ofNullable(T); + method public <U> java.util.Optional<U> map(java.util.function.Function<? super T, ? extends U>); + method public static <T> java.util.Optional<T> of(T); + method public static <T> java.util.Optional<T> ofNullable(T); method public T orElse(T); method public T orElseGet(java.util.function.Supplier<? extends T>); - method public T orElseThrow(java.util.function.Supplier<? extends X>) throws java.lang.Throwable; + method public <X extends java.lang.Throwable> T orElseThrow(java.util.function.Supplier<? extends X>) throws java.lang.Throwable; } public final class OptionalDouble { @@ -59320,7 +59343,7 @@ package java.util { method public static java.util.OptionalDouble of(double); method public double orElse(double); method public double orElseGet(java.util.function.DoubleSupplier); - method public double orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; + method public <X extends java.lang.Throwable> double orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; } public final class OptionalInt { @@ -59331,7 +59354,7 @@ package java.util { method public static java.util.OptionalInt of(int); method public int orElse(int); method public int orElseGet(java.util.function.IntSupplier); - method public int orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; + method public <X extends java.lang.Throwable> int orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; } public final class OptionalLong { @@ -59342,10 +59365,10 @@ package java.util { method public static java.util.OptionalLong of(long); method public long orElse(long); method public long orElseGet(java.util.function.LongSupplier); - method public long orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; + method public <X extends java.lang.Throwable> long orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; } - public abstract interface PrimitiveIterator implements java.util.Iterator { + public abstract interface PrimitiveIterator<T, T_CONS> implements java.util.Iterator { method public abstract void forEachRemaining(T_CONS); } @@ -59370,7 +59393,7 @@ package java.util { method public abstract long nextLong(); } - public class PriorityQueue extends java.util.AbstractQueue implements java.io.Serializable { + public class PriorityQueue<E> extends java.util.AbstractQueue implements java.io.Serializable { ctor public PriorityQueue(); ctor public PriorityQueue(int); ctor public PriorityQueue(java.util.Comparator<? super E>); @@ -59419,7 +59442,7 @@ package java.util { method public java.lang.Object handleGetObject(java.lang.String); } - public abstract interface Queue implements java.util.Collection { + public abstract interface Queue<E> implements java.util.Collection { method public abstract boolean add(E); method public abstract E element(); method public abstract boolean offer(E); @@ -59463,6 +59486,7 @@ package java.util { method public static final void clearCache(); method public static final void clearCache(java.lang.ClassLoader); method public boolean containsKey(java.lang.String); + method public java.lang.String getBaseBundleName(); method public static final java.util.ResourceBundle getBundle(java.lang.String); method public static final java.util.ResourceBundle getBundle(java.lang.String, java.util.ResourceBundle.Control); method public static final java.util.ResourceBundle getBundle(java.lang.String, java.util.Locale); @@ -59571,15 +59595,15 @@ package java.util { ctor public ServiceConfigurationError(java.lang.String, java.lang.Throwable); } - public final class ServiceLoader implements java.lang.Iterable { + public final class ServiceLoader<S> implements java.lang.Iterable { method public java.util.Iterator<S> iterator(); - method public static java.util.ServiceLoader<S> load(java.lang.Class<S>, java.lang.ClassLoader); - method public static java.util.ServiceLoader<S> load(java.lang.Class<S>); - method public static java.util.ServiceLoader<S> loadInstalled(java.lang.Class<S>); + method public static <S> java.util.ServiceLoader<S> load(java.lang.Class<S>, java.lang.ClassLoader); + method public static <S> java.util.ServiceLoader<S> load(java.lang.Class<S>); + method public static <S> java.util.ServiceLoader<S> loadInstalled(java.lang.Class<S>); method public void reload(); } - public abstract interface Set implements java.util.Collection { + public abstract interface Set<E> implements java.util.Collection { method public abstract boolean add(E); method public abstract boolean addAll(java.util.Collection<? extends E>); method public abstract void clear(); @@ -59594,7 +59618,7 @@ package java.util { method public abstract boolean retainAll(java.util.Collection<?>); method public abstract int size(); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract <T> T[] toArray(T[]); } public class SimpleTimeZone extends java.util.TimeZone { @@ -59620,7 +59644,7 @@ package java.util { field public static final int WALL_TIME = 0; // 0x0 } - public abstract interface SortedMap implements java.util.Map { + public abstract interface SortedMap<K, V> implements java.util.Map { method public abstract java.util.Comparator<? super K> comparator(); method public abstract java.util.Set<java.util.Map.Entry<K, V>> entrySet(); method public abstract K firstKey(); @@ -59632,7 +59656,7 @@ package java.util { method public abstract java.util.Collection<V> values(); } - public abstract interface SortedSet implements java.util.Set { + public abstract interface SortedSet<E> implements java.util.Set { method public abstract java.util.Comparator<? super E> comparator(); method public abstract E first(); method public abstract java.util.SortedSet<E> headSet(E); @@ -59641,7 +59665,7 @@ package java.util { method public abstract java.util.SortedSet<E> tailSet(E); } - public abstract interface Spliterator { + public abstract interface Spliterator<T> { method public abstract int characteristics(); method public abstract long estimateSize(); method public default void forEachRemaining(java.util.function.Consumer<? super T>); @@ -59684,7 +59708,7 @@ package java.util { method public abstract java.util.Spliterator.OfLong trySplit(); } - public static abstract interface Spliterator.OfPrimitive implements java.util.Spliterator { + public static abstract interface Spliterator.OfPrimitive<T, T_CONS, T_SPLITR extends java.util.Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>> implements java.util.Spliterator { method public default void forEachRemaining(T_CONS); method public abstract boolean tryAdvance(T_CONS); method public abstract T_SPLITR trySplit(); @@ -59694,25 +59718,25 @@ package java.util { 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 <T> java.util.Spliterator<T> emptySpliterator(); + method public static <T> 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 <T> java.util.Spliterator<T> spliterator(java.lang.Object[], int); + method public static <T> 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 <T> java.util.Spliterator<T> spliterator(java.util.Collection<? extends T>, int); + method public static <T> 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 <T> 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); @@ -59739,7 +59763,7 @@ package java.util { method public java.util.Spliterator.OfLong trySplit(); } - public static abstract class Spliterators.AbstractSpliterator implements java.util.Spliterator { + public static abstract class Spliterators.AbstractSpliterator<T> implements java.util.Spliterator { ctor protected Spliterators.AbstractSpliterator(long, int); method public int characteristics(); method public long estimateSize(); @@ -59774,7 +59798,7 @@ package java.util { method public java.util.SplittableRandom split(); } - public class Stack extends java.util.Vector { + public class Stack<E> extends java.util.Vector { ctor public Stack(); method public boolean empty(); method public synchronized E peek(); @@ -59858,7 +59882,7 @@ package java.util { ctor public TooManyListenersException(java.lang.String); } - public class TreeMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable { + public class TreeMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable { ctor public TreeMap(); ctor public TreeMap(java.util.Comparator<? super K>); ctor public TreeMap(java.util.Map<? extends K, ? extends V>); @@ -59895,7 +59919,7 @@ package java.util { method public java.util.SortedMap<K, V> tailMap(K); } - public class TreeSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { + public class TreeSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { ctor public TreeSet(); ctor public TreeSet(java.util.Comparator<? super E>); ctor public TreeSet(java.util.Collection<? extends E>); @@ -59948,7 +59972,7 @@ package java.util { method public java.lang.String getFlags(); } - public class Vector extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { + public class Vector<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public Vector(int, int); ctor public Vector(int); ctor public Vector(); @@ -59983,7 +60007,7 @@ package java.util { field protected java.lang.Object[] elementData; } - public class WeakHashMap extends java.util.AbstractMap implements java.util.Map { + public class WeakHashMap<K, V> extends java.util.AbstractMap implements java.util.Map { ctor public WeakHashMap(int, float); ctor public WeakHashMap(int); ctor public WeakHashMap(); @@ -59999,18 +60023,18 @@ package java.util.concurrent { public abstract class AbstractExecutorService implements java.util.concurrent.ExecutorService { ctor public AbstractExecutorService(); - method public java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException; - method public java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; - method public T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; - method protected java.util.concurrent.RunnableFuture<T> newTaskFor(java.lang.Runnable, T); - method protected java.util.concurrent.RunnableFuture<T> newTaskFor(java.util.concurrent.Callable<T>); + method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException; + method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; + method public <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; + method protected <T> java.util.concurrent.RunnableFuture<T> newTaskFor(java.lang.Runnable, T); + method protected <T> java.util.concurrent.RunnableFuture<T> newTaskFor(java.util.concurrent.Callable<T>); method public java.util.concurrent.Future<?> submit(java.lang.Runnable); - method public java.util.concurrent.Future<T> submit(java.lang.Runnable, T); - method public java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>); + method public <T> java.util.concurrent.Future<T> submit(java.lang.Runnable, T); + method public <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>); } - public class ArrayBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class ArrayBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public ArrayBlockingQueue(int); ctor public ArrayBlockingQueue(int, boolean); ctor public ArrayBlockingQueue(int, boolean, java.util.Collection<? extends E>); @@ -60029,7 +60053,7 @@ package java.util.concurrent { method public E take() throws java.lang.InterruptedException; } - public abstract interface BlockingDeque implements java.util.concurrent.BlockingQueue java.util.Deque { + public abstract interface BlockingDeque<E> implements java.util.concurrent.BlockingQueue java.util.Deque { method public abstract boolean add(E); method public abstract void addFirst(E); method public abstract void addLast(E); @@ -60061,7 +60085,7 @@ package java.util.concurrent { method public abstract E takeLast() throws java.lang.InterruptedException; } - public abstract interface BlockingQueue implements java.util.Queue { + public abstract interface BlockingQueue<E> implements java.util.Queue { method public abstract boolean add(E); method public abstract boolean contains(java.lang.Object); method public abstract int drainTo(java.util.Collection<? super E>); @@ -60080,7 +60104,7 @@ package java.util.concurrent { ctor public BrokenBarrierException(java.lang.String); } - public abstract interface Callable { + public abstract interface Callable<V> { method public abstract V call() throws java.lang.Exception; } @@ -60089,28 +60113,28 @@ package java.util.concurrent { ctor public CancellationException(java.lang.String); } - public class CompletableFuture implements java.util.concurrent.CompletionStage java.util.concurrent.Future { + public class CompletableFuture<T> implements java.util.concurrent.CompletionStage java.util.concurrent.Future { ctor public CompletableFuture(); method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor); method public static java.util.concurrent.CompletableFuture<java.lang.Void> allOf(java.util.concurrent.CompletableFuture<?>...); method public static java.util.concurrent.CompletableFuture<java.lang.Object> anyOf(java.util.concurrent.CompletableFuture<?>...); - method public java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); - method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); - method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); + method public <U> java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public <U> java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public <U> java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); method public boolean cancel(boolean); method public boolean complete(T); method public boolean completeExceptionally(java.lang.Throwable); - method public static java.util.concurrent.CompletableFuture<U> completedFuture(U); + method public static <U> java.util.concurrent.CompletableFuture<U> completedFuture(U); method public java.util.concurrent.CompletableFuture<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>); method public T get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; method public T get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; method public T getNow(T); method public int getNumberOfDependents(); - method public java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); - method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); - method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); + method public <U> java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public <U> java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public <U> java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); method public boolean isCancelled(); method public boolean isCompletedExceptionally(); method public boolean isDone(); @@ -60125,23 +60149,23 @@ package java.util.concurrent { method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable); method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable, java.util.concurrent.Executor); - method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>); - method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>, java.util.concurrent.Executor); + method public static <U> java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>); + method public static <U> java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>, java.util.concurrent.Executor); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); - method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); - method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T, ? extends U>); - method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); - method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); - method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); - method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); - method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); - method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); + method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); + method public <U> java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T, ? extends U>); + method public <U> java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); + method public <U> java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); + method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); + method public <U> java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public <U> java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public <U> java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRun(java.lang.Runnable); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); @@ -60161,7 +60185,7 @@ package java.util.concurrent { ctor public CompletionException(java.lang.Throwable); } - public abstract interface CompletionService { + public abstract interface CompletionService<V> { method public abstract java.util.concurrent.Future<V> poll(); method public abstract java.util.concurrent.Future<V> poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; method public abstract java.util.concurrent.Future<V> submit(java.util.concurrent.Callable<V>); @@ -60169,17 +60193,17 @@ package java.util.concurrent { method public abstract java.util.concurrent.Future<V> take() throws java.lang.InterruptedException; } - public abstract interface CompletionStage { + public abstract interface CompletionStage<T> { method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); - method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); - method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); + method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>); - method public abstract java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); - method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); - method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); + method public abstract <U> java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBoth(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); @@ -60189,18 +60213,18 @@ package java.util.concurrent { method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); - method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); - method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T, ? extends U>); - method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); - method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); - method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); - method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); - method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); - method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); + method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T, ? extends U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); + method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRun(java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); @@ -60210,7 +60234,7 @@ package java.util.concurrent { method public abstract java.util.concurrent.CompletionStage<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>, java.util.concurrent.Executor); } - public class ConcurrentHashMap extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable { + public class ConcurrentHashMap<K, V> extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable { ctor public ConcurrentHashMap(); ctor public ConcurrentHashMap(int); ctor public ConcurrentHashMap(java.util.Map<? extends K, ? extends V>); @@ -60224,29 +60248,29 @@ package java.util.concurrent { method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); method public void forEach(long, java.util.function.BiConsumer<? super K, ? super V>); - method public void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>); + method public <U> void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>); method public void forEachEntry(long, java.util.function.Consumer<? super java.util.Map.Entry<K, V>>); - method public void forEachEntry(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.Consumer<? super U>); + method public <U> void forEachEntry(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.Consumer<? super U>); method public void forEachKey(long, java.util.function.Consumer<? super K>); - method public void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>); + method public <U> void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>); method public void forEachValue(long, java.util.function.Consumer<? super V>); - method public void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>); + method public <U> void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>); method public V getOrDefault(java.lang.Object, V); method public java.util.concurrent.ConcurrentHashMap.KeySetView<K, V> keySet(V); method public java.util.Enumeration<K> keys(); method public long mappingCount(); method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>); - method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(); - method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int); + method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(); + method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int); method public V putIfAbsent(K, V); - method public U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public <U> U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); method public java.util.Map.Entry<K, V> reduceEntries(long, java.util.function.BiFunction<java.util.Map.Entry<K, V>, java.util.Map.Entry<K, V>, ? extends java.util.Map.Entry<K, V>>); - method public U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public <U> U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); method public double reduceEntriesToDouble(long, java.util.function.ToDoubleFunction<java.util.Map.Entry<K, V>>, double, java.util.function.DoubleBinaryOperator); method public int reduceEntriesToInt(long, java.util.function.ToIntFunction<java.util.Map.Entry<K, V>>, int, java.util.function.IntBinaryOperator); method public long reduceEntriesToLong(long, java.util.function.ToLongFunction<java.util.Map.Entry<K, V>>, long, java.util.function.LongBinaryOperator); method public K reduceKeys(long, java.util.function.BiFunction<? super K, ? super K, ? extends K>); - method public U reduceKeys(long, java.util.function.Function<? super K, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public <U> U reduceKeys(long, java.util.function.Function<? super K, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); method public double reduceKeysToDouble(long, java.util.function.ToDoubleFunction<? super K>, double, java.util.function.DoubleBinaryOperator); method public int reduceKeysToInt(long, java.util.function.ToIntFunction<? super K>, int, java.util.function.IntBinaryOperator); method public long reduceKeysToLong(long, java.util.function.ToLongFunction<? super K>, long, java.util.function.LongBinaryOperator); @@ -60254,7 +60278,7 @@ package java.util.concurrent { method public int reduceToInt(long, java.util.function.ToIntBiFunction<? super K, ? super V>, int, java.util.function.IntBinaryOperator); method public long reduceToLong(long, java.util.function.ToLongBiFunction<? super K, ? super V>, long, java.util.function.LongBinaryOperator); method public V reduceValues(long, java.util.function.BiFunction<? super V, ? super V, ? extends V>); - method public U reduceValues(long, java.util.function.Function<? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public <U> U reduceValues(long, java.util.function.Function<? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); method public double reduceValuesToDouble(long, java.util.function.ToDoubleFunction<? super V>, double, java.util.function.DoubleBinaryOperator); method public int reduceValuesToInt(long, java.util.function.ToIntFunction<? super V>, int, java.util.function.IntBinaryOperator); method public long reduceValuesToLong(long, java.util.function.ToLongFunction<? super V>, long, java.util.function.LongBinaryOperator); @@ -60262,13 +60286,13 @@ package java.util.concurrent { method public boolean replace(K, V, V); method public V replace(K, V); method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>); - method public U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>); - method public U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>); - method public U searchKeys(long, java.util.function.Function<? super K, ? extends U>); - method public U searchValues(long, java.util.function.Function<? super V, ? extends U>); + method public <U> U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>); + method public <U> U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>); + method public <U> U searchKeys(long, java.util.function.Function<? super K, ? extends U>); + method public <U> U searchValues(long, java.util.function.Function<? super V, ? extends U>); } - static abstract class ConcurrentHashMap.CollectionView implements java.util.Collection java.io.Serializable { + static abstract class ConcurrentHashMap.CollectionView<K, V, E> implements java.util.Collection java.io.Serializable { method public final void clear(); method public abstract boolean contains(java.lang.Object); method public final boolean containsAll(java.util.Collection<?>); @@ -60280,11 +60304,11 @@ package java.util.concurrent { method public final boolean retainAll(java.util.Collection<?>); method public final int size(); method public final java.lang.Object[] toArray(); - method public final T[] toArray(T[]); + method public final <T> T[] toArray(T[]); method public final java.lang.String toString(); } - public static class ConcurrentHashMap.KeySetView extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set { + public static class ConcurrentHashMap.KeySetView<K, V> extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set { method public boolean add(K); method public boolean addAll(java.util.Collection<? extends K>); method public boolean contains(java.lang.Object); @@ -60295,7 +60319,7 @@ package java.util.concurrent { method public java.util.Spliterator<K> spliterator(); } - public class ConcurrentLinkedDeque extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable { + public class ConcurrentLinkedDeque<E> extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable { ctor public ConcurrentLinkedDeque(); ctor public ConcurrentLinkedDeque(java.util.Collection<? extends E>); method public void addFirst(E); @@ -60325,7 +60349,7 @@ package java.util.concurrent { method public java.util.Spliterator<E> spliterator(); } - public class ConcurrentLinkedQueue extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable { + public class ConcurrentLinkedQueue<E> extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable { ctor public ConcurrentLinkedQueue(); ctor public ConcurrentLinkedQueue(java.util.Collection<? extends E>); method public java.util.Iterator<E> iterator(); @@ -60336,14 +60360,14 @@ package java.util.concurrent { method public java.util.Spliterator<E> spliterator(); } - public abstract interface ConcurrentMap implements java.util.Map { + public abstract interface ConcurrentMap<K, V> implements java.util.Map { method public abstract V putIfAbsent(K, V); method public abstract boolean remove(java.lang.Object, java.lang.Object); method public abstract boolean replace(K, V, V); method public abstract V replace(K, V); } - public abstract interface ConcurrentNavigableMap implements java.util.concurrent.ConcurrentMap java.util.NavigableMap { + public abstract interface ConcurrentNavigableMap<K, V> implements java.util.concurrent.ConcurrentMap java.util.NavigableMap { method public abstract java.util.NavigableSet<K> descendingKeySet(); method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> descendingMap(); method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K, boolean); @@ -60356,7 +60380,7 @@ package java.util.concurrent { method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K); } - public class ConcurrentSkipListMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable { + public class ConcurrentSkipListMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable { ctor public ConcurrentSkipListMap(); ctor public ConcurrentSkipListMap(java.util.Comparator<? super K>); ctor public ConcurrentSkipListMap(java.util.Map<? extends K, ? extends V>); @@ -60400,7 +60424,7 @@ package java.util.concurrent { method public java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K); } - public class ConcurrentSkipListSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { + public class ConcurrentSkipListSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { ctor public ConcurrentSkipListSet(); ctor public ConcurrentSkipListSet(java.util.Comparator<? super E>); ctor public ConcurrentSkipListSet(java.util.Collection<? extends E>); @@ -60428,7 +60452,7 @@ package java.util.concurrent { method public java.util.NavigableSet<E> tailSet(E); } - public class CopyOnWriteArrayList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { + public class CopyOnWriteArrayList<E> implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public CopyOnWriteArrayList(); ctor public CopyOnWriteArrayList(java.util.Collection<? extends E>); ctor public CopyOnWriteArrayList(E[]); @@ -60460,10 +60484,10 @@ package java.util.concurrent { method public int size(); method public java.util.List<E> subList(int, int); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public <T> T[] toArray(T[]); } - public class CopyOnWriteArraySet extends java.util.AbstractSet implements java.io.Serializable { + public class CopyOnWriteArraySet<E> extends java.util.AbstractSet implements java.io.Serializable { ctor public CopyOnWriteArraySet(); ctor public CopyOnWriteArraySet(java.util.Collection<? extends E>); method public void forEach(java.util.function.Consumer<? super E>); @@ -60481,7 +60505,7 @@ package java.util.concurrent { method public long getCount(); } - public abstract class CountedCompleter extends java.util.concurrent.ForkJoinTask { + public abstract class CountedCompleter<T> extends java.util.concurrent.ForkJoinTask { ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>, int); ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>); ctor protected CountedCompleter(); @@ -60518,7 +60542,7 @@ package java.util.concurrent { method public void reset(); } - public class DelayQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue { + public class DelayQueue<E extends java.util.concurrent.Delayed> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue { ctor public DelayQueue(); ctor public DelayQueue(java.util.Collection<? extends E>); method public int drainTo(java.util.Collection<? super E>); @@ -60539,7 +60563,7 @@ package java.util.concurrent { method public abstract long getDelay(java.util.concurrent.TimeUnit); } - public class Exchanger { + public class Exchanger<V> { ctor public Exchanger(); method public V exchange(V) throws java.lang.InterruptedException; method public V exchange(V, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException, java.util.concurrent.TimeoutException; @@ -60556,7 +60580,7 @@ package java.util.concurrent { method public abstract void execute(java.lang.Runnable); } - public class ExecutorCompletionService implements java.util.concurrent.CompletionService { + public class ExecutorCompletionService<V> implements java.util.concurrent.CompletionService { ctor public ExecutorCompletionService(java.util.concurrent.Executor); ctor public ExecutorCompletionService(java.util.concurrent.Executor, java.util.concurrent.BlockingQueue<java.util.concurrent.Future<V>>); method public java.util.concurrent.Future<V> poll(); @@ -60568,21 +60592,21 @@ package java.util.concurrent { public abstract interface ExecutorService implements java.util.concurrent.Executor { method public abstract boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public abstract java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException; - method public abstract java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public abstract T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; - method public abstract T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; + method public abstract <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException; + method public abstract <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public abstract <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; + method public abstract <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; method public abstract boolean isShutdown(); method public abstract boolean isTerminated(); method public abstract void shutdown(); method public abstract java.util.List<java.lang.Runnable> shutdownNow(); - method public abstract java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>); - method public abstract java.util.concurrent.Future<T> submit(java.lang.Runnable, T); + method public abstract <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>); + method public abstract <T> java.util.concurrent.Future<T> submit(java.lang.Runnable, T); method public abstract java.util.concurrent.Future<?> submit(java.lang.Runnable); } public class Executors { - method public static java.util.concurrent.Callable<T> callable(java.lang.Runnable, T); + method public static <T> java.util.concurrent.Callable<T> callable(java.lang.Runnable, T); method public static java.util.concurrent.Callable<java.lang.Object> callable(java.lang.Runnable); method public static java.util.concurrent.Callable<java.lang.Object> callable(java.security.PrivilegedAction<?>); method public static java.util.concurrent.Callable<java.lang.Object> callable(java.security.PrivilegedExceptionAction<?>); @@ -60599,8 +60623,8 @@ package java.util.concurrent { method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor(java.util.concurrent.ThreadFactory); method public static java.util.concurrent.ExecutorService newWorkStealingPool(int); method public static java.util.concurrent.ExecutorService newWorkStealingPool(); - method public static java.util.concurrent.Callable<T> privilegedCallable(java.util.concurrent.Callable<T>); - method public static java.util.concurrent.Callable<T> privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable<T>); + method public static <T> java.util.concurrent.Callable<T> privilegedCallable(java.util.concurrent.Callable<T>); + method public static <T> java.util.concurrent.Callable<T> privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable<T>); method public static java.util.concurrent.ThreadFactory privilegedThreadFactory(); method public static java.util.concurrent.ExecutorService unconfigurableExecutorService(java.util.concurrent.ExecutorService); method public static java.util.concurrent.ScheduledExecutorService unconfigurableScheduledExecutorService(java.util.concurrent.ScheduledExecutorService); @@ -60628,7 +60652,7 @@ package java.util.concurrent { method public long getStealCount(); method public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler(); method public boolean hasQueuedSubmissions(); - method public T invoke(java.util.concurrent.ForkJoinTask<T>); + method public <T> T invoke(java.util.concurrent.ForkJoinTask<T>); method public boolean isQuiescent(); method public boolean isShutdown(); method public boolean isTerminated(); @@ -60637,7 +60661,7 @@ package java.util.concurrent { method protected java.util.concurrent.ForkJoinTask<?> pollSubmission(); method public void shutdown(); method public java.util.List<java.lang.Runnable> shutdownNow(); - method public java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.ForkJoinTask<T>); + method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.ForkJoinTask<T>); field public static final java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory; } @@ -60650,11 +60674,11 @@ package java.util.concurrent { method public abstract boolean isReleasable(); } - public abstract class ForkJoinTask implements java.util.concurrent.Future java.io.Serializable { + public abstract class ForkJoinTask<V> implements java.util.concurrent.Future java.io.Serializable { ctor public ForkJoinTask(); method public static java.util.concurrent.ForkJoinTask<?> adapt(java.lang.Runnable); - method public static java.util.concurrent.ForkJoinTask<T> adapt(java.lang.Runnable, T); - method public static java.util.concurrent.ForkJoinTask<T> adapt(java.util.concurrent.Callable<? extends T>); + method public static <T> java.util.concurrent.ForkJoinTask<T> adapt(java.lang.Runnable, T); + method public static <T> java.util.concurrent.ForkJoinTask<T> adapt(java.util.concurrent.Callable<? extends T>); method public boolean cancel(boolean); method public final boolean compareAndSetForkJoinTaskTag(short, short); method public void complete(V); @@ -60674,7 +60698,7 @@ package java.util.concurrent { method public final V invoke(); method public static void invokeAll(java.util.concurrent.ForkJoinTask<?>, java.util.concurrent.ForkJoinTask<?>); method public static void invokeAll(java.util.concurrent.ForkJoinTask<?>...); - method public static java.util.Collection<T> invokeAll(java.util.Collection<T>); + method public static <T extends java.util.concurrent.ForkJoinTask<?>> java.util.Collection<T> invokeAll(java.util.Collection<T>); method public final boolean isCancelled(); method public final boolean isCompletedAbnormally(); method public final boolean isCompletedNormally(); @@ -60700,7 +60724,7 @@ package java.util.concurrent { method protected void onTermination(java.lang.Throwable); } - public abstract interface Future { + public abstract interface Future<V> { method public abstract boolean cancel(boolean); method public abstract V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; method public abstract V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; @@ -60708,7 +60732,7 @@ package java.util.concurrent { method public abstract boolean isDone(); } - public class FutureTask implements java.util.concurrent.RunnableFuture { + public class FutureTask<V> implements java.util.concurrent.RunnableFuture { ctor public FutureTask(java.util.concurrent.Callable<V>); ctor public FutureTask(java.lang.Runnable, V); method public boolean cancel(boolean); @@ -60723,7 +60747,7 @@ package java.util.concurrent { method protected void setException(java.lang.Throwable); } - public class LinkedBlockingDeque extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable { + public class LinkedBlockingDeque<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable { ctor public LinkedBlockingDeque(); ctor public LinkedBlockingDeque(int); ctor public LinkedBlockingDeque(java.util.Collection<? extends E>); @@ -60767,7 +60791,7 @@ package java.util.concurrent { method public E takeLast() throws java.lang.InterruptedException; } - public class LinkedBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class LinkedBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public LinkedBlockingQueue(); ctor public LinkedBlockingQueue(int); ctor public LinkedBlockingQueue(java.util.Collection<? extends E>); @@ -60786,7 +60810,7 @@ package java.util.concurrent { method public E take() throws java.lang.InterruptedException; } - public class LinkedTransferQueue extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue { + public class LinkedTransferQueue<E> extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue { ctor public LinkedTransferQueue(); ctor public LinkedTransferQueue(java.util.Collection<? extends E>); method public int drainTo(java.util.Collection<? super E>); @@ -60833,7 +60857,7 @@ package java.util.concurrent { method public int register(); } - public class PriorityBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class PriorityBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public PriorityBlockingQueue(); ctor public PriorityBlockingQueue(int); ctor public PriorityBlockingQueue(int, java.util.Comparator<? super E>); @@ -60862,7 +60886,7 @@ package java.util.concurrent { method protected final void setRawResult(java.lang.Void); } - public abstract class RecursiveTask extends java.util.concurrent.ForkJoinTask { + public abstract class RecursiveTask<V> extends java.util.concurrent.ForkJoinTask { ctor public RecursiveTask(); method protected abstract V compute(); method protected final boolean exec(); @@ -60881,22 +60905,22 @@ package java.util.concurrent { method public abstract void rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor); } - public abstract interface RunnableFuture implements java.util.concurrent.Future java.lang.Runnable { + public abstract interface RunnableFuture<V> implements java.util.concurrent.Future java.lang.Runnable { method public abstract void run(); } - public abstract interface RunnableScheduledFuture implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture { + public abstract interface RunnableScheduledFuture<V> implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture { method public abstract boolean isPeriodic(); } public abstract interface ScheduledExecutorService implements java.util.concurrent.ExecutorService { method public abstract java.util.concurrent.ScheduledFuture<?> schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit); - method public abstract java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit); + method public abstract <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit); method public abstract java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public abstract java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); } - public abstract interface ScheduledFuture implements java.util.concurrent.Delayed java.util.concurrent.Future { + public abstract interface ScheduledFuture<V> implements java.util.concurrent.Delayed java.util.concurrent.Future { } public class ScheduledThreadPoolExecutor extends java.util.concurrent.ThreadPoolExecutor implements java.util.concurrent.ScheduledExecutorService { @@ -60904,13 +60928,13 @@ package java.util.concurrent { ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory); ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.RejectedExecutionHandler); ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory, java.util.concurrent.RejectedExecutionHandler); - method protected java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture<V>); - method protected java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.util.concurrent.Callable<V>, java.util.concurrent.RunnableScheduledFuture<V>); + method protected <V> java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture<V>); + method protected <V> java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.util.concurrent.Callable<V>, java.util.concurrent.RunnableScheduledFuture<V>); method public boolean getContinueExistingPeriodicTasksAfterShutdownPolicy(); method public boolean getExecuteExistingDelayedTasksAfterShutdownPolicy(); method public boolean getRemoveOnCancelPolicy(); method public java.util.concurrent.ScheduledFuture<?> schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit); - method public java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit); + method public <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit); method public java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean); @@ -60940,7 +60964,7 @@ package java.util.concurrent { method public boolean tryAcquire(int, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; } - public class SynchronousQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class SynchronousQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public SynchronousQueue(); ctor public SynchronousQueue(boolean); method public int drainTo(java.util.Collection<? super E>); @@ -61058,7 +61082,7 @@ package java.util.concurrent { ctor public TimeoutException(java.lang.String); } - public abstract interface TransferQueue implements java.util.concurrent.BlockingQueue { + public abstract interface TransferQueue<E> implements java.util.concurrent.BlockingQueue { method public abstract int getWaitingConsumerCount(); method public abstract boolean hasWaitingConsumer(); method public abstract void transfer(E) throws java.lang.InterruptedException; @@ -61128,7 +61152,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, int, int); } - public abstract class AtomicIntegerFieldUpdater { + public abstract class AtomicIntegerFieldUpdater<T> { ctor protected AtomicIntegerFieldUpdater(); method public final int accumulateAndGet(T, int, java.util.function.IntBinaryOperator); method public int addAndGet(T, int); @@ -61143,7 +61167,7 @@ package java.util.concurrent.atomic { method public final int getAndUpdate(T, java.util.function.IntUnaryOperator); method public int incrementAndGet(T); method public abstract void lazySet(T, int); - method public static java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); + method public static <U> java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); method public abstract void set(T, int); method public final int updateAndGet(T, java.util.function.IntUnaryOperator); method public abstract boolean weakCompareAndSet(T, int, int); @@ -61196,7 +61220,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, long, long); } - public abstract class AtomicLongFieldUpdater { + public abstract class AtomicLongFieldUpdater<T> { ctor protected AtomicLongFieldUpdater(); method public final long accumulateAndGet(T, long, java.util.function.LongBinaryOperator); method public long addAndGet(T, long); @@ -61211,13 +61235,13 @@ package java.util.concurrent.atomic { method public final long getAndUpdate(T, java.util.function.LongUnaryOperator); method public long incrementAndGet(T); method public abstract void lazySet(T, long); - method public static java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); + method public static <U> java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); method public abstract void set(T, long); method public final long updateAndGet(T, java.util.function.LongUnaryOperator); method public abstract boolean weakCompareAndSet(T, long, long); } - public class AtomicMarkableReference { + public class AtomicMarkableReference<V> { ctor public AtomicMarkableReference(V, boolean); method public boolean attemptMark(V, boolean); method public boolean compareAndSet(V, V, boolean, boolean); @@ -61228,7 +61252,7 @@ package java.util.concurrent.atomic { method public boolean weakCompareAndSet(V, V, boolean, boolean); } - public class AtomicReference implements java.io.Serializable { + public class AtomicReference<V> implements java.io.Serializable { ctor public AtomicReference(V); ctor public AtomicReference(); method public final V accumulateAndGet(V, java.util.function.BinaryOperator<V>); @@ -61243,7 +61267,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(V, V); } - public class AtomicReferenceArray implements java.io.Serializable { + public class AtomicReferenceArray<E> implements java.io.Serializable { ctor public AtomicReferenceArray(int); ctor public AtomicReferenceArray(E[]); method public final E accumulateAndGet(int, E, java.util.function.BinaryOperator<E>); @@ -61259,7 +61283,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, E, E); } - public abstract class AtomicReferenceFieldUpdater { + public abstract class AtomicReferenceFieldUpdater<T, V> { ctor protected AtomicReferenceFieldUpdater(); method public final V accumulateAndGet(T, V, java.util.function.BinaryOperator<V>); method public abstract boolean compareAndSet(T, V, V); @@ -61268,13 +61292,13 @@ package java.util.concurrent.atomic { method public V getAndSet(T, V); method public final V getAndUpdate(T, java.util.function.UnaryOperator<V>); method public abstract void lazySet(T, V); - method public static java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U, W> newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String); + method public static <U, W> java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U, W> newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String); method public abstract void set(T, V); method public final V updateAndGet(T, java.util.function.UnaryOperator<V>); method public abstract boolean weakCompareAndSet(T, V, V); } - public class AtomicStampedReference { + public class AtomicStampedReference<V> { ctor public AtomicStampedReference(V, int); method public boolean attemptStamp(V, int); method public boolean compareAndSet(V, V, int, int); @@ -61577,33 +61601,33 @@ package java.util.concurrent.locks { package java.util.function { - public abstract interface BiConsumer { + public abstract interface BiConsumer<T, U> { method public abstract void accept(T, U); method public default java.util.function.BiConsumer<T, U> andThen(java.util.function.BiConsumer<? super T, ? super U>); } - public abstract interface BiFunction { - method public default java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>); + public abstract interface BiFunction<T, U, R> { + method public default <V> java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>); method public abstract R apply(T, U); } - public abstract interface BiPredicate { + public abstract interface BiPredicate<T, U> { method public default java.util.function.BiPredicate<T, U> and(java.util.function.BiPredicate<? super T, ? super U>); method public default java.util.function.BiPredicate<T, U> negate(); method public default java.util.function.BiPredicate<T, U> or(java.util.function.BiPredicate<? super T, ? super U>); method public abstract boolean test(T, U); } - public abstract interface BinaryOperator implements java.util.function.BiFunction { - method public static java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>); - method public static java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>); + public abstract interface BinaryOperator<T> implements java.util.function.BiFunction { + method public static <T> java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>); + method public static <T> java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>); } public abstract interface BooleanSupplier { method public abstract boolean getAsBoolean(); } - public abstract interface Consumer { + public abstract interface Consumer<T> { method public abstract void accept(T); method public default java.util.function.Consumer<T> andThen(java.util.function.Consumer<? super T>); } @@ -61617,7 +61641,7 @@ package java.util.function { method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer); } - public abstract interface DoubleFunction { + public abstract interface DoubleFunction<R> { method public abstract R apply(double); } @@ -61647,11 +61671,11 @@ package java.util.function { method public static java.util.function.DoubleUnaryOperator identity(); } - public abstract interface Function { - method public default java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>); + public abstract interface Function<T, R> { + method public default <V> java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>); method public abstract R apply(T); - method public default java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>); - method public static java.util.function.Function<T, T> identity(); + method public default <V> java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>); + method public static <T> java.util.function.Function<T, T> identity(); } public abstract interface IntBinaryOperator { @@ -61663,7 +61687,7 @@ package java.util.function { method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer); } - public abstract interface IntFunction { + public abstract interface IntFunction<R> { method public abstract R apply(int); } @@ -61702,7 +61726,7 @@ package java.util.function { method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer); } - public abstract interface LongFunction { + public abstract interface LongFunction<R> { method public abstract R apply(long); } @@ -61732,56 +61756,56 @@ package java.util.function { method public static java.util.function.LongUnaryOperator identity(); } - public abstract interface ObjDoubleConsumer { + public abstract interface ObjDoubleConsumer<T> { method public abstract void accept(T, double); } - public abstract interface ObjIntConsumer { + public abstract interface ObjIntConsumer<T> { method public abstract void accept(T, int); } - public abstract interface ObjLongConsumer { + public abstract interface ObjLongConsumer<T> { method public abstract void accept(T, long); } - public abstract interface Predicate { + public abstract interface Predicate<T> { method public default java.util.function.Predicate<T> and(java.util.function.Predicate<? super T>); - method public static java.util.function.Predicate<T> isEqual(java.lang.Object); + method public static <T> java.util.function.Predicate<T> isEqual(java.lang.Object); method public default java.util.function.Predicate<T> negate(); method public default java.util.function.Predicate<T> or(java.util.function.Predicate<? super T>); method public abstract boolean test(T); } - public abstract interface Supplier { + public abstract interface Supplier<T> { method public abstract T get(); } - public abstract interface ToDoubleBiFunction { + public abstract interface ToDoubleBiFunction<T, U> { method public abstract double applyAsDouble(T, U); } - public abstract interface ToDoubleFunction { + public abstract interface ToDoubleFunction<T> { method public abstract double applyAsDouble(T); } - public abstract interface ToIntBiFunction { + public abstract interface ToIntBiFunction<T, U> { method public abstract int applyAsInt(T, U); } - public abstract interface ToIntFunction { + public abstract interface ToIntFunction<T> { method public abstract int applyAsInt(T); } - public abstract interface ToLongBiFunction { + public abstract interface ToLongBiFunction<T, U> { method public abstract long applyAsLong(T, U); } - public abstract interface ToLongFunction { + public abstract interface ToLongFunction<T> { method public abstract long applyAsLong(T); } - public abstract interface UnaryOperator implements java.util.function.Function { - method public static java.util.function.UnaryOperator<T> identity(); + public abstract interface UnaryOperator<T> implements java.util.function.Function { + method public static <T> java.util.function.UnaryOperator<T> identity(); } } @@ -62369,7 +62393,7 @@ package java.util.regex { package java.util.stream { - public abstract interface BaseStream implements java.lang.AutoCloseable { + public abstract interface BaseStream<T, S extends java.util.stream.BaseStream<T, S>> implements java.lang.AutoCloseable { method public abstract void close(); method public abstract boolean isParallel(); method public abstract java.util.Iterator<T> iterator(); @@ -62380,13 +62404,13 @@ package java.util.stream { method public abstract S unordered(); } - public abstract interface Collector { + public abstract interface Collector<T, A, R> { method public abstract java.util.function.BiConsumer<A, T> accumulator(); method public abstract java.util.Set<java.util.stream.Collector.Characteristics> characteristics(); method public abstract java.util.function.BinaryOperator<A> combiner(); method public abstract java.util.function.Function<A, R> finisher(); - method public static java.util.stream.Collector<T, R, R> of(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, T>, java.util.function.BinaryOperator<R>, java.util.stream.Collector.Characteristics...); - method public static java.util.stream.Collector<T, A, R> of(java.util.function.Supplier<A>, java.util.function.BiConsumer<A, T>, java.util.function.BinaryOperator<A>, java.util.function.Function<A, R>, java.util.stream.Collector.Characteristics...); + method public static <T, R> java.util.stream.Collector<T, R, R> of(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, T>, java.util.function.BinaryOperator<R>, java.util.stream.Collector.Characteristics...); + method public static <T, A, R> java.util.stream.Collector<T, A, R> of(java.util.function.Supplier<A>, java.util.function.BiConsumer<A, T>, java.util.function.BinaryOperator<A>, java.util.function.Function<A, R>, java.util.stream.Collector.Characteristics...); method public abstract java.util.function.Supplier<A> supplier(); } @@ -62399,43 +62423,43 @@ package java.util.stream { } public final class Collectors { - method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingDouble(java.util.function.ToDoubleFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingInt(java.util.function.ToIntFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingLong(java.util.function.ToLongFunction<? super T>); - method public static java.util.stream.Collector<T, A, RR> collectingAndThen(java.util.stream.Collector<T, A, R>, java.util.function.Function<R, RR>); - method public static java.util.stream.Collector<T, ?, java.lang.Long> counting(); - method public static java.util.stream.Collector<T, ?, java.util.Map<K, java.util.List<T>>> groupingBy(java.util.function.Function<? super T, ? extends K>); - method public static java.util.stream.Collector<T, ?, java.util.Map<K, D>> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>); - method public static java.util.stream.Collector<T, ?, M> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>); - method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, java.util.List<T>>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>); - method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, D>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>); - method public static java.util.stream.Collector<T, ?, M> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingDouble(java.util.function.ToDoubleFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingInt(java.util.function.ToIntFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingLong(java.util.function.ToLongFunction<? super T>); + method public static <T, A, R, RR> java.util.stream.Collector<T, A, RR> collectingAndThen(java.util.stream.Collector<T, A, R>, java.util.function.Function<R, RR>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Long> counting(); + method public static <T, K> java.util.stream.Collector<T, ?, java.util.Map<K, java.util.List<T>>> groupingBy(java.util.function.Function<? super T, ? extends K>); + method public static <T, K, A, D> java.util.stream.Collector<T, ?, java.util.Map<K, D>> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>); + method public static <T, K, D, A, M extends java.util.Map<K, D>> java.util.stream.Collector<T, ?, M> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>); + method public static <T, K> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, java.util.List<T>>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>); + method public static <T, K, A, D> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, D>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>); + method public static <T, K, A, D, M extends java.util.concurrent.ConcurrentMap<K, D>> java.util.stream.Collector<T, ?, M> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>); method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(); method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(java.lang.CharSequence); method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(java.lang.CharSequence, java.lang.CharSequence, java.lang.CharSequence); - method public static java.util.stream.Collector<T, ?, R> mapping(java.util.function.Function<? super T, ? extends U>, java.util.stream.Collector<? super U, A, R>); - method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> maxBy(java.util.Comparator<? super T>); - method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> minBy(java.util.Comparator<? super T>); - method public static java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, java.util.List<T>>> partitioningBy(java.util.function.Predicate<? super T>); - method public static java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, D>> partitioningBy(java.util.function.Predicate<? super T>, java.util.stream.Collector<? super T, A, D>); - method public static java.util.stream.Collector<T, ?, T> reducing(T, java.util.function.BinaryOperator<T>); - method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> reducing(java.util.function.BinaryOperator<T>); - method public static java.util.stream.Collector<T, ?, U> reducing(U, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); - method public static java.util.stream.Collector<T, ?, java.util.DoubleSummaryStatistics> summarizingDouble(java.util.function.ToDoubleFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.util.IntSummaryStatistics> summarizingInt(java.util.function.ToIntFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.util.LongSummaryStatistics> summarizingLong(java.util.function.ToLongFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.lang.Double> summingDouble(java.util.function.ToDoubleFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.lang.Integer> summingInt(java.util.function.ToIntFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.lang.Long> summingLong(java.util.function.ToLongFunction<? super T>); - method public static java.util.stream.Collector<T, ?, C> toCollection(java.util.function.Supplier<C>); - method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>); - method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); - method public static java.util.stream.Collector<T, ?, M> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>); - method public static java.util.stream.Collector<T, ?, java.util.List<T>> toList(); - method public static java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>); - method public static java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); - method public static java.util.stream.Collector<T, ?, M> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>); - method public static java.util.stream.Collector<T, ?, java.util.Set<T>> toSet(); + method public static <T, U, A, R> java.util.stream.Collector<T, ?, R> mapping(java.util.function.Function<? super T, ? extends U>, java.util.stream.Collector<? super U, A, R>); + method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> maxBy(java.util.Comparator<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> minBy(java.util.Comparator<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, java.util.List<T>>> partitioningBy(java.util.function.Predicate<? super T>); + method public static <T, D, A> java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, D>> partitioningBy(java.util.function.Predicate<? super T>, java.util.stream.Collector<? super T, A, D>); + method public static <T> java.util.stream.Collector<T, ?, T> reducing(T, java.util.function.BinaryOperator<T>); + method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> reducing(java.util.function.BinaryOperator<T>); + method public static <T, U> java.util.stream.Collector<T, ?, U> reducing(U, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); + method public static <T> java.util.stream.Collector<T, ?, java.util.DoubleSummaryStatistics> summarizingDouble(java.util.function.ToDoubleFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.util.IntSummaryStatistics> summarizingInt(java.util.function.ToIntFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.util.LongSummaryStatistics> summarizingLong(java.util.function.ToLongFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> summingDouble(java.util.function.ToDoubleFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Integer> summingInt(java.util.function.ToIntFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Long> summingLong(java.util.function.ToLongFunction<? super T>); + method public static <T, C extends java.util.Collection<T>> java.util.stream.Collector<T, ?, C> toCollection(java.util.function.Supplier<C>); + method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>); + method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); + method public static <T, K, U, M extends java.util.concurrent.ConcurrentMap<K, U>> java.util.stream.Collector<T, ?, M> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>); + method public static <T> java.util.stream.Collector<T, ?, java.util.List<T>> toList(); + method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>); + method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); + method public static <T, K, U, M extends java.util.Map<K, U>> java.util.stream.Collector<T, ?, M> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>); + method public static <T> java.util.stream.Collector<T, ?, java.util.Set<T>> toSet(); } public abstract interface DoubleStream implements java.util.stream.BaseStream { @@ -62444,7 +62468,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream<java.lang.Double> boxed(); method public static java.util.stream.DoubleStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjDoubleConsumer<R>, java.util.function.BiConsumer<R, R>); + method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjDoubleConsumer<R>, java.util.function.BiConsumer<R, R>); method public static java.util.stream.DoubleStream concat(java.util.stream.DoubleStream, java.util.stream.DoubleStream); method public abstract long count(); method public abstract java.util.stream.DoubleStream distinct(); @@ -62462,7 +62486,7 @@ package java.util.stream { method public abstract java.util.stream.DoubleStream map(java.util.function.DoubleUnaryOperator); method public abstract java.util.stream.IntStream mapToInt(java.util.function.DoubleToIntFunction); method public abstract java.util.stream.LongStream mapToLong(java.util.function.DoubleToLongFunction); - method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.DoubleFunction<? extends U>); + method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.DoubleFunction<? extends U>); method public abstract java.util.OptionalDouble max(); method public abstract java.util.OptionalDouble min(); method public abstract boolean noneMatch(java.util.function.DoublePredicate); @@ -62495,7 +62519,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream<java.lang.Integer> boxed(); method public static java.util.stream.IntStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjIntConsumer<R>, java.util.function.BiConsumer<R, R>); + method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjIntConsumer<R>, java.util.function.BiConsumer<R, R>); method public static java.util.stream.IntStream concat(java.util.stream.IntStream, java.util.stream.IntStream); method public abstract long count(); method public abstract java.util.stream.IntStream distinct(); @@ -62513,7 +62537,7 @@ package java.util.stream { method public abstract java.util.stream.IntStream map(java.util.function.IntUnaryOperator); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.IntToDoubleFunction); method public abstract java.util.stream.LongStream mapToLong(java.util.function.IntToLongFunction); - method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.IntFunction<? extends U>); + method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.IntFunction<? extends U>); method public abstract java.util.OptionalInt max(); method public abstract java.util.OptionalInt min(); method public abstract boolean noneMatch(java.util.function.IntPredicate); @@ -62547,7 +62571,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream<java.lang.Long> boxed(); method public static java.util.stream.LongStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjLongConsumer<R>, java.util.function.BiConsumer<R, R>); + method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjLongConsumer<R>, java.util.function.BiConsumer<R, R>); method public static java.util.stream.LongStream concat(java.util.stream.LongStream, java.util.stream.LongStream); method public abstract long count(); method public abstract java.util.stream.LongStream distinct(); @@ -62565,7 +62589,7 @@ package java.util.stream { method public abstract java.util.stream.LongStream map(java.util.function.LongUnaryOperator); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.LongToDoubleFunction); method public abstract java.util.stream.IntStream mapToInt(java.util.function.LongToIntFunction); - method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.LongFunction<? extends U>); + method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.LongFunction<? extends U>); method public abstract java.util.OptionalLong max(); method public abstract java.util.OptionalLong min(); method public abstract boolean noneMatch(java.util.function.LongPredicate); @@ -62592,49 +62616,49 @@ package java.util.stream { method public abstract java.util.stream.LongStream build(); } - public abstract interface Stream implements java.util.stream.BaseStream { + public abstract interface Stream<T> implements java.util.stream.BaseStream { method public abstract boolean allMatch(java.util.function.Predicate<? super T>); method public abstract boolean anyMatch(java.util.function.Predicate<? super T>); - method public static java.util.stream.Stream.Builder<T> builder(); - method public abstract R collect(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, ? super T>, java.util.function.BiConsumer<R, R>); - method public abstract R collect(java.util.stream.Collector<? super T, A, R>); - method public static java.util.stream.Stream<T> concat(java.util.stream.Stream<? extends T>, java.util.stream.Stream<? extends T>); + method public static <T> java.util.stream.Stream.Builder<T> builder(); + method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, ? super T>, java.util.function.BiConsumer<R, R>); + method public abstract <R, A> R collect(java.util.stream.Collector<? super T, A, R>); + method public static <T> java.util.stream.Stream<T> concat(java.util.stream.Stream<? extends T>, java.util.stream.Stream<? extends T>); method public abstract long count(); method public abstract java.util.stream.Stream<T> distinct(); - method public static java.util.stream.Stream<T> empty(); + method public static <T> java.util.stream.Stream<T> empty(); method public abstract java.util.stream.Stream<T> filter(java.util.function.Predicate<? super T>); method public abstract java.util.Optional<T> findAny(); method public abstract java.util.Optional<T> findFirst(); - method public abstract java.util.stream.Stream<R> flatMap(java.util.function.Function<? super T, ? extends java.util.stream.Stream<? extends R>>); + method public abstract <R> java.util.stream.Stream<R> flatMap(java.util.function.Function<? super T, ? extends java.util.stream.Stream<? extends R>>); method public abstract java.util.stream.DoubleStream flatMapToDouble(java.util.function.Function<? super T, ? extends java.util.stream.DoubleStream>); method public abstract java.util.stream.IntStream flatMapToInt(java.util.function.Function<? super T, ? extends java.util.stream.IntStream>); method public abstract java.util.stream.LongStream flatMapToLong(java.util.function.Function<? super T, ? extends java.util.stream.LongStream>); method public abstract void forEach(java.util.function.Consumer<? super T>); method public abstract void forEachOrdered(java.util.function.Consumer<? super T>); - method public static java.util.stream.Stream<T> generate(java.util.function.Supplier<T>); - method public static java.util.stream.Stream<T> iterate(T, java.util.function.UnaryOperator<T>); + method public static <T> java.util.stream.Stream<T> generate(java.util.function.Supplier<T>); + method public static <T> java.util.stream.Stream<T> iterate(T, java.util.function.UnaryOperator<T>); method public abstract java.util.stream.Stream<T> limit(long); - method public abstract java.util.stream.Stream<R> map(java.util.function.Function<? super T, ? extends R>); + method public abstract <R> java.util.stream.Stream<R> map(java.util.function.Function<? super T, ? extends R>); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.ToDoubleFunction<? super T>); method public abstract java.util.stream.IntStream mapToInt(java.util.function.ToIntFunction<? super T>); method public abstract java.util.stream.LongStream mapToLong(java.util.function.ToLongFunction<? super T>); method public abstract java.util.Optional<T> max(java.util.Comparator<? super T>); method public abstract java.util.Optional<T> min(java.util.Comparator<? super T>); method public abstract boolean noneMatch(java.util.function.Predicate<? super T>); - method public static java.util.stream.Stream<T> of(T); - method public static java.util.stream.Stream<T> of(T...); + method public static <T> java.util.stream.Stream<T> of(T); + method public static <T> java.util.stream.Stream<T> of(T...); method public abstract java.util.stream.Stream<T> peek(java.util.function.Consumer<? super T>); method public abstract T reduce(T, java.util.function.BinaryOperator<T>); method public abstract java.util.Optional<T> reduce(java.util.function.BinaryOperator<T>); - method public abstract U reduce(U, java.util.function.BiFunction<U, ? super T, U>, java.util.function.BinaryOperator<U>); + method public abstract <U> U reduce(U, java.util.function.BiFunction<U, ? super T, U>, java.util.function.BinaryOperator<U>); method public abstract java.util.stream.Stream<T> skip(long); method public abstract java.util.stream.Stream<T> sorted(); method public abstract java.util.stream.Stream<T> sorted(java.util.Comparator<? super T>); method public abstract java.lang.Object[] toArray(); - method public abstract A[] toArray(java.util.function.IntFunction<A[]>); + method public abstract <A> A[] toArray(java.util.function.IntFunction<A[]>); } - public static abstract interface Stream.Builder implements java.util.function.Consumer { + public static abstract interface Stream.Builder<T> implements java.util.function.Consumer { method public abstract void accept(T); method public default java.util.stream.Stream.Builder<T> add(T); method public abstract java.util.stream.Stream<T> build(); @@ -62647,8 +62671,8 @@ package java.util.stream { method public static java.util.stream.IntStream intStream(java.util.function.Supplier<? extends java.util.Spliterator.OfInt>, int, boolean); method public static java.util.stream.LongStream longStream(java.util.Spliterator.OfLong, boolean); method public static java.util.stream.LongStream longStream(java.util.function.Supplier<? extends java.util.Spliterator.OfLong>, int, boolean); - method public static java.util.stream.Stream<T> stream(java.util.Spliterator<T>, boolean); - method public static java.util.stream.Stream<T> stream(java.util.function.Supplier<? extends java.util.Spliterator<T>>, int, boolean); + method public static <T> java.util.stream.Stream<T> stream(java.util.Spliterator<T>, boolean); + method public static <T> java.util.stream.Stream<T> stream(java.util.function.Supplier<? extends java.util.Spliterator<T>>, int, boolean); } } @@ -64821,16 +64845,16 @@ package javax.security.auth { public final class Subject implements java.io.Serializable { ctor public Subject(); ctor public Subject(boolean, java.util.Set<? extends java.security.Principal>, java.util.Set<?>, java.util.Set<?>); - method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedAction<T>); - method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; - method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction<T>, java.security.AccessControlContext); - method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException; + method public static <T> T doAs(javax.security.auth.Subject, java.security.PrivilegedAction<T>); + method public static <T> T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; + method public static <T> T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction<T>, java.security.AccessControlContext); + method public static <T> T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException; method public java.util.Set<java.security.Principal> getPrincipals(); - method public java.util.Set<T> getPrincipals(java.lang.Class<T>); + method public <T extends java.security.Principal> java.util.Set<T> getPrincipals(java.lang.Class<T>); method public java.util.Set<java.lang.Object> getPrivateCredentials(); - method public java.util.Set<T> getPrivateCredentials(java.lang.Class<T>); + method public <T> java.util.Set<T> getPrivateCredentials(java.lang.Class<T>); method public java.util.Set<java.lang.Object> getPublicCredentials(); - method public java.util.Set<T> getPublicCredentials(java.lang.Class<T>); + method public <T> java.util.Set<T> getPublicCredentials(java.lang.Class<T>); method public static javax.security.auth.Subject getSubject(java.security.AccessControlContext); method public boolean isReadOnly(); method public void setReadOnly(); diff --git a/api/system-current.txt b/api/system-current.txt index a4477f3e0dda..68c7b486022e 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3022,11 +3022,11 @@ package android.accounts { field public static final java.lang.String LOGIN_ACCOUNTS_CHANGED_ACTION = "android.accounts.LOGIN_ACCOUNTS_CHANGED"; } - public abstract interface AccountManagerCallback { + public abstract interface AccountManagerCallback<V> { method public abstract void run(android.accounts.AccountManagerFuture<V>); } - public abstract interface AccountManagerFuture { + public abstract interface AccountManagerFuture<V> { method public abstract boolean cancel(boolean); method public abstract V getResult() throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException; method public abstract V getResult(long, java.util.concurrent.TimeUnit) throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException; @@ -3172,7 +3172,7 @@ package android.animation { method public java.lang.Object evaluate(float, java.lang.Object, java.lang.Object); } - public abstract class BidirectionalTypeConverter extends android.animation.TypeConverter { + public abstract class BidirectionalTypeConverter<T, V> extends android.animation.TypeConverter { ctor public BidirectionalTypeConverter(java.lang.Class<T>, java.lang.Class<V>); method public abstract T convertBack(V); method public android.animation.BidirectionalTypeConverter<V, T> invert(); @@ -3264,26 +3264,26 @@ package android.animation { method public java.lang.String getPropertyName(); method public java.lang.Object getTarget(); method public static android.animation.ObjectAnimator ofArgb(java.lang.Object, java.lang.String, int...); - method public static android.animation.ObjectAnimator ofArgb(T, android.util.Property<T, java.lang.Integer>, int...); + method public static <T> android.animation.ObjectAnimator ofArgb(T, android.util.Property<T, java.lang.Integer>, int...); method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, float...); method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, float...); - method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, android.util.Property<T, java.lang.Float>, android.graphics.Path); + method public static <T> android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, float...); + method public static <T> android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, android.util.Property<T, java.lang.Float>, android.graphics.Path); method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, int...); method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, int...); - method public static android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, android.util.Property<T, java.lang.Integer>, android.graphics.Path); + method public static <T> android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, int...); + method public static <T> android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, android.util.Property<T, java.lang.Integer>, android.graphics.Path); method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, float[][]); method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, T...); + method public static <T> android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, T...); method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, int[][]); method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, T...); + method public static <T> android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, T...); method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeEvaluator, java.lang.Object...); method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeConverter<android.graphics.PointF, ?>, android.graphics.Path); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeEvaluator<V>, V...); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, P>, android.animation.TypeConverter<V, P>, android.animation.TypeEvaluator<V>, V...); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path); + method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeEvaluator<V>, V...); + method public static <T, V, P> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, P>, android.animation.TypeConverter<V, P>, android.animation.TypeEvaluator<V>, V...); + method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path); method public static android.animation.ObjectAnimator ofPropertyValuesHolder(java.lang.Object, android.animation.PropertyValuesHolder...); method public void setAutoCancel(boolean); method public void setProperty(android.util.Property); @@ -3307,17 +3307,17 @@ package android.animation { method public static android.animation.PropertyValuesHolder ofKeyframe(android.util.Property, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, float[][]); method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<V, float[]>, android.animation.TypeEvaluator<V>, V...); - method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...); + method public static <V> android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<V, float[]>, android.animation.TypeEvaluator<V>, V...); + method public static <T> android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, int[][]); method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<V, int[]>, android.animation.TypeEvaluator<V>, V...); - method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...); + method public static <V> android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<V, int[]>, android.animation.TypeEvaluator<V>, V...); + method public static <T> android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeEvaluator, java.lang.Object...); method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeConverter<android.graphics.PointF, ?>, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator<V>, V...); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<T, V>, android.animation.TypeEvaluator<T>, T...); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path); + method public static <V> android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator<V>, V...); + method public static <T, V> android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<T, V>, android.animation.TypeEvaluator<T>, T...); + method public static <V> android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path); method public void setConverter(android.animation.TypeConverter); method public void setEvaluator(android.animation.TypeEvaluator); method public void setFloatValues(float...); @@ -3354,12 +3354,12 @@ package android.animation { method public abstract float getInterpolation(float); } - public abstract class TypeConverter { + public abstract class TypeConverter<T, V> { ctor public TypeConverter(java.lang.Class<T>, java.lang.Class<V>); method public abstract V convert(T); } - public abstract interface TypeEvaluator { + public abstract interface TypeEvaluator<T> { method public abstract T evaluate(float, T, T); } @@ -4707,7 +4707,7 @@ package android.app { method public android.os.Parcelable saveAllState(); } - public abstract class FragmentHostCallback extends android.app.FragmentContainer { + public abstract class FragmentHostCallback<E> extends android.app.FragmentContainer { ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int); method public void onAttachFragment(android.app.Fragment); method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); @@ -4974,12 +4974,12 @@ package android.app { method public abstract void destroyLoader(int); method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); method public static void enableDebugLogging(boolean); - method public abstract android.content.Loader<D> getLoader(int); - method public abstract android.content.Loader<D> initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>); - method public abstract android.content.Loader<D> restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>); + method public abstract <D> android.content.Loader<D> getLoader(int); + method public abstract <D> android.content.Loader<D> initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>); + method public abstract <D> android.content.Loader<D> restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>); } - public static abstract interface LoaderManager.LoaderCallbacks { + public static abstract interface LoaderManager.LoaderCallbacks<D> { method public abstract android.content.Loader<D> onCreateLoader(int, android.os.Bundle); method public abstract void onLoadFinished(android.content.Loader<D>, D); method public abstract void onLoaderReset(android.content.Loader<D>); @@ -6675,6 +6675,7 @@ package android.app.job { method public abstract java.util.List<android.app.job.JobInfo> getAllPendingJobs(); method public abstract android.app.job.JobInfo getPendingJob(int); method public abstract int schedule(android.app.job.JobInfo); + method public abstract int scheduleAsPackage(android.app.job.JobInfo, java.lang.String, int, java.lang.String); field public static final int RESULT_FAILURE = 0; // 0x0 field public static final int RESULT_SUCCESS = 1; // 0x1 } @@ -7925,7 +7926,7 @@ package android.content { ctor public AsyncQueryHandler.WorkerHandler(android.os.Looper); } - public abstract class AsyncTaskLoader extends android.content.Loader { + public abstract class AsyncTaskLoader<D> extends android.content.Loader { ctor public AsyncTaskLoader(android.content.Context); method public void cancelLoadInBackground(); method public boolean isLoadInBackgroundCanceled(); @@ -8107,7 +8108,7 @@ package android.content { method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException; method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException; method protected final android.os.ParcelFileDescriptor openFileHelper(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException; - method public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter<T>) throws java.io.FileNotFoundException; + method public <T> android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter<T>) throws java.io.FileNotFoundException; method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException; method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException; method public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String); @@ -8120,7 +8121,7 @@ package android.content { method public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]); } - public static abstract interface ContentProvider.PipeDataWriter { + public static abstract interface ContentProvider.PipeDataWriter<T> { method public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, T); } @@ -8393,7 +8394,7 @@ package android.content { method public final java.lang.String getString(int); method public final java.lang.String getString(int, java.lang.Object...); method public abstract java.lang.Object getSystemService(java.lang.String); - method public final T getSystemService(java.lang.Class<T>); + method public final <T> T getSystemService(java.lang.Class<T>); method public abstract java.lang.String getSystemServiceName(java.lang.Class<?>); method public final java.lang.CharSequence getText(int); method public abstract android.content.res.Resources.Theme getTheme(); @@ -8761,8 +8762,8 @@ package android.content { method public long getLongExtra(java.lang.String, long); method public java.lang.String getPackage(); method public android.os.Parcelable[] getParcelableArrayExtra(java.lang.String); - method public java.util.ArrayList<T> getParcelableArrayListExtra(java.lang.String); - method public T getParcelableExtra(java.lang.String); + method public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayListExtra(java.lang.String); + method public <T extends android.os.Parcelable> T getParcelableExtra(java.lang.String); method public java.lang.String getScheme(); method public android.content.Intent getSelector(); method public java.io.Serializable getSerializableExtra(java.lang.String); @@ -9249,7 +9250,7 @@ package android.content { ctor public IntentSender.SendIntentException(java.lang.Exception); } - public class Loader { + public class Loader<D> { ctor public Loader(android.content.Context); method public void abandon(); method public boolean cancelLoad(); @@ -9286,11 +9287,11 @@ package android.content { ctor public Loader.ForceLoadContentObserver(); } - public static abstract interface Loader.OnLoadCanceledListener { + public static abstract interface Loader.OnLoadCanceledListener<D> { method public abstract void onLoadCanceled(android.content.Loader<D>); } - public static abstract interface Loader.OnLoadCompleteListener { + public static abstract interface Loader.OnLoadCompleteListener<D> { method public abstract void onLoadComplete(android.content.Loader<D>, D); } @@ -11178,7 +11179,7 @@ package android.database { method public boolean isNull(int); } - public abstract class Observable { + public abstract class Observable<T> { ctor public Observable(); method public void registerObserver(T); method public void unregisterAll(); @@ -13068,7 +13069,7 @@ package android.graphics.drawable { public class AnimatedStateListDrawable extends android.graphics.drawable.StateListDrawable { ctor public AnimatedStateListDrawable(); method public void addState(int[], android.graphics.drawable.Drawable, int); - method public void addTransition(int, int, T, boolean); + method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean); } public class AnimatedVectorDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable2 { @@ -14200,7 +14201,7 @@ package android.hardware.camera2 { } public final class CameraCharacteristics extends android.hardware.camera2.CameraMetadata { - method public T get(android.hardware.camera2.CameraCharacteristics.Key<T>); + method public <T> T get(android.hardware.camera2.CameraCharacteristics.Key<T>); method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableCaptureRequestKeys(); method public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getAvailableCaptureResultKeys(); field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES; @@ -14285,7 +14286,7 @@ package android.hardware.camera2 { field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> TONEMAP_MAX_CURVE_POINTS; } - public static final class CameraCharacteristics.Key { + public static final class CameraCharacteristics.Key<T> { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); @@ -14350,7 +14351,7 @@ package android.hardware.camera2 { method public void onTorchModeUnavailable(java.lang.String); } - public abstract class CameraMetadata { + public abstract class CameraMetadata<TKey> { method public java.util.List<TKey> getKeys(); field public static final int COLOR_CORRECTION_ABERRATION_MODE_FAST = 1; // 0x1 field public static final int COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY = 2; // 0x2 @@ -14558,7 +14559,7 @@ package android.hardware.camera2 { public final class CaptureRequest extends android.hardware.camera2.CameraMetadata implements android.os.Parcelable { method public int describeContents(); - method public T get(android.hardware.camera2.CaptureRequest.Key<T>); + method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>); method public java.lang.Object getTag(); method public boolean isReprocess(); method public void writeToParcel(android.os.Parcel, int); @@ -14621,20 +14622,20 @@ package android.hardware.camera2 { public static final class CaptureRequest.Builder { method public void addTarget(android.view.Surface); method public android.hardware.camera2.CaptureRequest build(); - method public T get(android.hardware.camera2.CaptureRequest.Key<T>); + method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>); method public void removeTarget(android.view.Surface); - method public void set(android.hardware.camera2.CaptureRequest.Key<T>, T); + method public <T> void set(android.hardware.camera2.CaptureRequest.Key<T>, T); method public void setTag(java.lang.Object); } - public static final class CaptureRequest.Key { + public static final class CaptureRequest.Key<T> { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); } public class CaptureResult extends android.hardware.camera2.CameraMetadata { - method public T get(android.hardware.camera2.CaptureResult.Key<T>); + method public <T> T get(android.hardware.camera2.CaptureResult.Key<T>); method public long getFrameNumber(); method public android.hardware.camera2.CaptureRequest getRequest(); method public int getSequenceId(); @@ -14715,7 +14716,7 @@ package android.hardware.camera2 { field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_PRESET_CURVE; } - public static final class CaptureResult.Key { + public static final class CaptureResult.Key<T> { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); @@ -14847,14 +14848,14 @@ package android.hardware.camera2.params { method public android.util.Size[] getInputSizes(int); method public final int[] getOutputFormats(); method public long getOutputMinFrameDuration(int, android.util.Size); - method public long getOutputMinFrameDuration(java.lang.Class<T>, android.util.Size); - method public android.util.Size[] getOutputSizes(java.lang.Class<T>); + method public <T> long getOutputMinFrameDuration(java.lang.Class<T>, android.util.Size); + method public <T> android.util.Size[] getOutputSizes(java.lang.Class<T>); method public android.util.Size[] getOutputSizes(int); method public long getOutputStallDuration(int, android.util.Size); - method public long getOutputStallDuration(java.lang.Class<T>, android.util.Size); + method public <T> long getOutputStallDuration(java.lang.Class<T>, android.util.Size); method public final int[] getValidOutputFormatsForInput(int); method public boolean isOutputSupportedFor(int); - method public static boolean isOutputSupportedFor(java.lang.Class<T>); + method public static <T> boolean isOutputSupportedFor(java.lang.Class<T>); method public boolean isOutputSupportedFor(android.view.Surface); } @@ -17302,7 +17303,7 @@ package android.icu.math { package android.icu.text { - public final class AlphabeticIndex implements java.lang.Iterable { + public final class AlphabeticIndex<V> implements java.lang.Iterable { ctor public AlphabeticIndex(android.icu.util.ULocale); ctor public AlphabeticIndex(java.util.Locale); ctor public AlphabeticIndex(android.icu.text.RuleBasedCollator); @@ -17328,7 +17329,7 @@ package android.icu.text { method public android.icu.text.AlphabeticIndex<V> setUnderflowLabel(java.lang.String); } - public static class AlphabeticIndex.Bucket implements java.lang.Iterable { + public static class AlphabeticIndex.Bucket<V> implements java.lang.Iterable { method public java.lang.String getLabel(); method public android.icu.text.AlphabeticIndex.Bucket.LabelType getLabelType(); method public java.util.Iterator<android.icu.text.AlphabeticIndex.Record<V>> iterator(); @@ -17344,14 +17345,14 @@ package android.icu.text { enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType UNDERFLOW; } - public static final class AlphabeticIndex.ImmutableIndex implements java.lang.Iterable { + public static final class AlphabeticIndex.ImmutableIndex<V> implements java.lang.Iterable { method public android.icu.text.AlphabeticIndex.Bucket<V> getBucket(int); method public int getBucketCount(); method public int getBucketIndex(java.lang.CharSequence); method public java.util.Iterator<android.icu.text.AlphabeticIndex.Bucket<V>> iterator(); } - public static class AlphabeticIndex.Record { + public static class AlphabeticIndex.Record<V> { method public V getData(); method public java.lang.CharSequence getName(); } @@ -18864,8 +18865,8 @@ package android.icu.text { method public final android.icu.text.UnicodeSet addAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet addAll(android.icu.text.UnicodeSet); method public android.icu.text.UnicodeSet addAll(java.lang.Iterable<?>); - method public android.icu.text.UnicodeSet addAll(T...); - method public T addAllTo(T); + method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet addAll(T...); + method public <T extends java.util.Collection<java.lang.String>> T addAllTo(T); method public void addMatchSetTo(android.icu.text.UnicodeSet); method public android.icu.text.UnicodeSet applyIntPropertyValue(int, int); method public final android.icu.text.UnicodeSet applyPattern(java.lang.String); @@ -18893,15 +18894,15 @@ package android.icu.text { method public final boolean contains(java.lang.CharSequence); method public boolean containsAll(android.icu.text.UnicodeSet); method public boolean containsAll(java.lang.String); - method public boolean containsAll(java.lang.Iterable<T>); + method public <T extends java.lang.CharSequence> boolean containsAll(java.lang.Iterable<T>); method public boolean containsNone(int, int); method public boolean containsNone(android.icu.text.UnicodeSet); method public boolean containsNone(java.lang.CharSequence); - method public boolean containsNone(java.lang.Iterable<T>); + method public <T extends java.lang.CharSequence> boolean containsNone(java.lang.Iterable<T>); method public final boolean containsSome(int, int); method public final boolean containsSome(android.icu.text.UnicodeSet); method public final boolean containsSome(java.lang.CharSequence); - method public final boolean containsSome(java.lang.Iterable<T>); + method public final <T extends java.lang.CharSequence> boolean containsSome(java.lang.Iterable<T>); method public android.icu.text.UnicodeSet freeze(); method public static android.icu.text.UnicodeSet from(java.lang.CharSequence); method public static android.icu.text.UnicodeSet fromAll(java.lang.CharSequence); @@ -18919,14 +18920,14 @@ package android.icu.text { method public final android.icu.text.UnicodeSet remove(java.lang.CharSequence); method public final android.icu.text.UnicodeSet removeAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet removeAll(android.icu.text.UnicodeSet); - method public android.icu.text.UnicodeSet removeAll(java.lang.Iterable<T>); + method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet removeAll(java.lang.Iterable<T>); method public final android.icu.text.UnicodeSet removeAllStrings(); method public android.icu.text.UnicodeSet retain(int, int); method public final android.icu.text.UnicodeSet retain(int); method public final android.icu.text.UnicodeSet retain(java.lang.CharSequence); method public final android.icu.text.UnicodeSet retainAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet retainAll(android.icu.text.UnicodeSet); - method public android.icu.text.UnicodeSet retainAll(java.lang.Iterable<T>); + method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet retainAll(java.lang.Iterable<T>); method public android.icu.text.UnicodeSet set(int, int); method public android.icu.text.UnicodeSet set(android.icu.text.UnicodeSet); method public int size(); @@ -19336,7 +19337,7 @@ package android.icu.util { method public long getToDate(); } - public abstract interface Freezable implements java.lang.Cloneable { + public abstract interface Freezable<T> implements java.lang.Cloneable { method public abstract T cloneAsThawed(); method public abstract T freeze(); method public abstract boolean isFrozen(); @@ -19618,7 +19619,7 @@ package android.icu.util { field public static final android.icu.util.TimeUnit YEAR; } - public class Output { + public class Output<T> { ctor public Output(); ctor public Output(T); field public T value; @@ -30508,7 +30509,7 @@ package android.opengl { package android.os { - public abstract class AsyncTask { + public abstract class AsyncTask<Params, Progress, Result> { ctor public AsyncTask(); method public final boolean cancel(boolean); method protected abstract Result doInBackground(Params...); @@ -30735,16 +30736,16 @@ package android.os { method public float getFloat(java.lang.String, float); method public float[] getFloatArray(java.lang.String); method public java.util.ArrayList<java.lang.Integer> getIntegerArrayList(java.lang.String); - method public T getParcelable(java.lang.String); + method public <T extends android.os.Parcelable> T getParcelable(java.lang.String); method public android.os.Parcelable[] getParcelableArray(java.lang.String); - method public java.util.ArrayList<T> getParcelableArrayList(java.lang.String); + method public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayList(java.lang.String); method public java.io.Serializable getSerializable(java.lang.String); method public short getShort(java.lang.String); method public short getShort(java.lang.String, short); method public short[] getShortArray(java.lang.String); method public android.util.Size getSize(java.lang.String); method public android.util.SizeF getSizeF(java.lang.String); - method public android.util.SparseArray<T> getSparseParcelableArray(java.lang.String); + method public <T extends android.os.Parcelable> android.util.SparseArray<T> getSparseParcelableArray(java.lang.String); method public java.util.ArrayList<java.lang.String> getStringArrayList(java.lang.String); method public boolean hasFileDescriptors(); method public void putAll(android.os.Bundle); @@ -31249,8 +31250,8 @@ package android.os { method public final long[] createLongArray(); method public final java.lang.String[] createStringArray(); method public final java.util.ArrayList<java.lang.String> createStringArrayList(); - method public final T[] createTypedArray(android.os.Parcelable.Creator<T>); - method public final java.util.ArrayList<T> createTypedArrayList(android.os.Parcelable.Creator<T>); + method public final <T> T[] createTypedArray(android.os.Parcelable.Creator<T>); + method public final <T> java.util.ArrayList<T> createTypedArrayList(android.os.Parcelable.Creator<T>); method public final int dataAvail(); method public final int dataCapacity(); method public final int dataPosition(); @@ -31283,7 +31284,7 @@ package android.os { method public final long readLong(); method public final void readLongArray(long[]); method public final void readMap(java.util.Map, java.lang.ClassLoader); - method public final T readParcelable(java.lang.ClassLoader); + method public final <T extends android.os.Parcelable> T readParcelable(java.lang.ClassLoader); method public final android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader); method public final android.os.PersistableBundle readPersistableBundle(); method public final android.os.PersistableBundle readPersistableBundle(java.lang.ClassLoader); @@ -31296,9 +31297,9 @@ package android.os { method public final void readStringArray(java.lang.String[]); method public final void readStringList(java.util.List<java.lang.String>); method public final android.os.IBinder readStrongBinder(); - method public final void readTypedArray(T[], android.os.Parcelable.Creator<T>); - method public final void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>); - method public final T readTypedObject(android.os.Parcelable.Creator<T>); + method public final <T> void readTypedArray(T[], android.os.Parcelable.Creator<T>); + method public final <T> void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>); + method public final <T> T readTypedObject(android.os.Parcelable.Creator<T>); method public final java.lang.Object readValue(java.lang.ClassLoader); method public final void recycle(); method public final void setDataCapacity(int); @@ -31329,7 +31330,7 @@ package android.os { method public final void writeMap(java.util.Map); method public final void writeNoException(); method public final void writeParcelable(android.os.Parcelable, int); - method public final void writeParcelableArray(T[], int); + method public final <T extends android.os.Parcelable> void writeParcelableArray(T[], int); method public final void writePersistableBundle(android.os.PersistableBundle); method public final void writeSerializable(java.io.Serializable); method public final void writeSize(android.util.Size); @@ -31341,9 +31342,9 @@ package android.os { method public final void writeStringList(java.util.List<java.lang.String>); method public final void writeStrongBinder(android.os.IBinder); method public final void writeStrongInterface(android.os.IInterface); - method public final void writeTypedArray(T[], int); - method public final void writeTypedList(java.util.List<T>); - method public final void writeTypedObject(T, int); + method public final <T extends android.os.Parcelable> void writeTypedArray(T[], int); + method public final <T extends android.os.Parcelable> void writeTypedList(java.util.List<T>); + method public final <T extends android.os.Parcelable> void writeTypedObject(T, int); method public final void writeValue(java.lang.Object); field public static final android.os.Parcelable.Creator<java.lang.String> STRING_CREATOR; } @@ -31421,11 +31422,11 @@ package android.os { field public static final int PARCELABLE_WRITE_RETURN_VALUE = 1; // 0x1 } - public static abstract interface Parcelable.ClassLoaderCreator implements android.os.Parcelable.Creator { + public static abstract interface Parcelable.ClassLoaderCreator<T> implements android.os.Parcelable.Creator { method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader); } - public static abstract interface Parcelable.Creator { + public static abstract interface Parcelable.Creator<T> { method public abstract T createFromParcel(android.os.Parcel); method public abstract T[] newArray(int); } @@ -31566,7 +31567,7 @@ package android.os { method public abstract void onResult(android.os.Bundle); } - public class RemoteCallbackList { + public class RemoteCallbackList<E extends android.os.IInterface> { ctor public RemoteCallbackList(); method public int beginBroadcast(); method public void finishBroadcast(); @@ -31636,6 +31637,7 @@ package android.os { method public android.os.StrictMode.ThreadPolicy.Builder detectDiskWrites(); method public android.os.StrictMode.ThreadPolicy.Builder detectNetwork(); method public android.os.StrictMode.ThreadPolicy.Builder detectResourceMismatches(); + method public android.os.StrictMode.ThreadPolicy.Builder detectUnbufferedIo(); method public android.os.StrictMode.ThreadPolicy.Builder penaltyDeath(); method public android.os.StrictMode.ThreadPolicy.Builder penaltyDeathOnNetwork(); method public android.os.StrictMode.ThreadPolicy.Builder penaltyDialog(); @@ -31648,6 +31650,7 @@ package android.os { method public android.os.StrictMode.ThreadPolicy.Builder permitDiskWrites(); method public android.os.StrictMode.ThreadPolicy.Builder permitNetwork(); method public android.os.StrictMode.ThreadPolicy.Builder permitResourceMismatches(); + method public android.os.StrictMode.ThreadPolicy.Builder permitUnbufferedIo(); } public static final class StrictMode.VmPolicy { @@ -37116,7 +37119,7 @@ package android.service.carrier { field public static final java.lang.String SERVICE_INTERFACE = "android.service.carrier.CarrierMessagingService"; } - public static abstract interface CarrierMessagingService.ResultCallback { + public static abstract interface CarrierMessagingService.ResultCallback<T> { method public abstract void onReceiveResult(T) throws android.os.RemoteException; } @@ -37267,7 +37270,7 @@ package android.service.media { field public static final java.lang.String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED"; } - public class MediaBrowserService.Result { + public class MediaBrowserService.Result<T> { method public void detach(); method public void sendResult(T); } @@ -40417,14 +40420,14 @@ package android.telephony.gsm { package android.test { - public abstract deprecated class ActivityInstrumentationTestCase extends android.test.ActivityTestCase { + public abstract deprecated class ActivityInstrumentationTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase { ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class<T>); ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class<T>, boolean); method public T getActivity(); method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception; } - public abstract deprecated class ActivityInstrumentationTestCase2 extends android.test.ActivityTestCase { + public abstract deprecated class ActivityInstrumentationTestCase2<T extends android.app.Activity> extends android.test.ActivityTestCase { ctor public deprecated ActivityInstrumentationTestCase2(java.lang.String, java.lang.Class<T>); ctor public ActivityInstrumentationTestCase2(java.lang.Class<T>); method public T getActivity(); @@ -40439,7 +40442,7 @@ package android.test { method protected void setActivity(android.app.Activity); } - public abstract deprecated class ActivityUnitTestCase extends android.test.ActivityTestCase { + public abstract deprecated class ActivityUnitTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase { ctor public ActivityUnitTestCase(java.lang.Class<T>); method public T getActivity(); method public int getFinishedActivityRequest(); @@ -40485,7 +40488,7 @@ package android.test { method public void testStarted(java.lang.String); } - public abstract deprecated class ApplicationTestCase extends android.test.AndroidTestCase { + public abstract deprecated class ApplicationTestCase<T extends android.app.Application> extends android.test.AndroidTestCase { ctor public ApplicationTestCase(java.lang.Class<T>); method protected final void createApplication(); method public T getApplication(); @@ -40511,8 +40514,8 @@ package android.test { method public android.app.Instrumentation getInstrumentation(); method public deprecated void injectInsrumentation(android.app.Instrumentation); method public void injectInstrumentation(android.app.Instrumentation); - method public final T launchActivity(java.lang.String, java.lang.Class<T>, android.os.Bundle); - method public final T launchActivityWithIntent(java.lang.String, java.lang.Class<T>, android.content.Intent); + method public final <T extends android.app.Activity> T launchActivity(java.lang.String, java.lang.Class<T>, android.os.Bundle); + method public final <T extends android.app.Activity> T launchActivityWithIntent(java.lang.String, java.lang.Class<T>, android.content.Intent); method public void runTestOnUiThread(java.lang.Runnable) throws java.lang.Throwable; method public void sendKeys(java.lang.String); method public void sendKeys(int...); @@ -40552,7 +40555,7 @@ package android.test { public class LoaderTestCase extends android.test.AndroidTestCase { ctor public LoaderTestCase(); - method public T getLoaderResultSynchronously(android.content.Loader<T>); + method public <T> T getLoaderResultSynchronously(android.content.Loader<T>); } public final deprecated class MoreAsserts { @@ -40607,20 +40610,20 @@ package android.test { method public abstract void startTiming(boolean); } - public abstract deprecated class ProviderTestCase extends android.test.InstrumentationTestCase { + public abstract deprecated class ProviderTestCase<T extends android.content.ContentProvider> extends android.test.InstrumentationTestCase { ctor public ProviderTestCase(java.lang.Class<T>, java.lang.String); method public android.test.mock.MockContentResolver getMockContentResolver(); method public android.test.IsolatedContext getMockContext(); method public T getProvider(); - method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } - public abstract class ProviderTestCase2 extends android.test.AndroidTestCase { + public abstract class ProviderTestCase2<T extends android.content.ContentProvider> extends android.test.AndroidTestCase { ctor public ProviderTestCase2(java.lang.Class<T>, java.lang.String); method public android.test.mock.MockContentResolver getMockContentResolver(); method public android.test.IsolatedContext getMockContext(); method public T getProvider(); - method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } public deprecated class RenamingDelegatingContext extends android.content.ContextWrapper { @@ -40628,11 +40631,11 @@ package android.test { ctor public RenamingDelegatingContext(android.content.Context, android.content.Context, java.lang.String); method public java.lang.String getDatabasePrefix(); method public void makeExistingFilesAndDbsAccessible(); - method public static T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; - method public static T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } - public abstract deprecated class ServiceTestCase extends android.test.AndroidTestCase { + public abstract deprecated class ServiceTestCase<T extends android.app.Service> extends android.test.AndroidTestCase { ctor public ServiceTestCase(java.lang.Class<T>); method protected android.os.IBinder bindService(android.content.Intent); method public android.app.Application getApplication(); @@ -40645,7 +40648,7 @@ package android.test { method public void testServiceTestCaseSetUpProperly() throws java.lang.Exception; } - public abstract deprecated class SingleLaunchActivityTestCase extends android.test.InstrumentationTestCase { + public abstract deprecated class SingleLaunchActivityTestCase<T extends android.app.Activity> extends android.test.InstrumentationTestCase { ctor public SingleLaunchActivityTestCase(java.lang.String, java.lang.Class<T>); method public T getActivity(); method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception; @@ -41012,7 +41015,7 @@ package android.test.suitebuilder { ctor public TestMethod(java.lang.String, java.lang.Class<? extends junit.framework.TestCase>); ctor public TestMethod(junit.framework.TestCase); method public junit.framework.TestCase createTest() throws java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException; - method public T getAnnotation(java.lang.Class<T>); + method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>); method public java.lang.Class<? extends junit.framework.TestCase> getEnclosingClass(); method public java.lang.String getEnclosingClassname(); method public java.lang.String getName(); @@ -41455,7 +41458,7 @@ package android.text { method public int getSpanEnd(java.lang.Object); method public int getSpanFlags(java.lang.Object); method public int getSpanStart(java.lang.Object); - method public T[] getSpans(int, int, java.lang.Class<T>); + method public <T> T[] getSpans(int, int, java.lang.Class<T>); method public deprecated int getTextRunCursor(int, int, int, int, int, android.graphics.Paint); method public int getTextWatcherDepth(); method public android.text.SpannableStringBuilder insert(int, java.lang.CharSequence, int, int); @@ -41477,7 +41480,7 @@ package android.text { method public int getSpanEnd(java.lang.Object); method public int getSpanFlags(java.lang.Object); method public int getSpanStart(java.lang.Object); - method public T[] getSpans(int, int, java.lang.Class<T>); + method public <T> T[] getSpans(int, int, java.lang.Class<T>); method public final int length(); method public int nextSpanTransition(int, int, java.lang.Class); method public final java.lang.String toString(); @@ -41487,7 +41490,7 @@ package android.text { method public abstract int getSpanEnd(java.lang.Object); method public abstract int getSpanFlags(java.lang.Object); method public abstract int getSpanStart(java.lang.Object); - method public abstract T[] getSpans(int, int, java.lang.Class<T>); + method public abstract <T> T[] getSpans(int, int, java.lang.Class<T>); method public abstract int nextSpanTransition(int, int, java.lang.Class); field public static final int SPAN_COMPOSING = 256; // 0x100 field public static final int SPAN_EXCLUSIVE_EXCLUSIVE = 33; // 0x21 @@ -42464,7 +42467,7 @@ package android.text.style { field public static final int WEEKDAY_WEDNESDAY = 4; // 0x4 } - public static class TtsSpan.Builder { + public static class TtsSpan.Builder<C extends android.text.style.TtsSpan.Builder<?>> { ctor public TtsSpan.Builder(java.lang.String); method public android.text.style.TtsSpan build(); method public C setIntArgument(java.lang.String, int); @@ -42560,7 +42563,7 @@ package android.text.style { method public android.text.style.TtsSpan.OrdinalBuilder setNumber(java.lang.String); } - public static class TtsSpan.SemioticClassBuilder extends android.text.style.TtsSpan.Builder { + public static class TtsSpan.SemioticClassBuilder<C extends android.text.style.TtsSpan.SemioticClassBuilder<?>> extends android.text.style.TtsSpan.Builder { ctor public TtsSpan.SemioticClassBuilder(java.lang.String); method public C setAnimacy(java.lang.String); method public C setCase(java.lang.String); @@ -42967,7 +42970,7 @@ package android.util { ctor public AndroidRuntimeException(java.lang.Exception); } - public final class ArrayMap implements java.util.Map { + public final class ArrayMap<K, V> implements java.util.Map { ctor public ArrayMap(); ctor public ArrayMap(int); ctor public ArrayMap(android.util.ArrayMap<K, V>); @@ -42995,7 +42998,7 @@ package android.util { method public java.util.Collection<V> values(); } - public final class ArraySet implements java.util.Collection java.util.Set { + public final class ArraySet<E> implements java.util.Collection java.util.Set { ctor public ArraySet(); ctor public ArraySet(int); ctor public ArraySet(android.util.ArraySet<E>); @@ -43016,7 +43019,7 @@ package android.util { method public boolean retainAll(java.util.Collection<?>); method public int size(); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public <T> T[] toArray(T[]); method public E valueAt(int); } @@ -43158,13 +43161,13 @@ package android.util { public deprecated class FloatMath { } - public abstract class FloatProperty extends android.util.Property { + public abstract class FloatProperty<T> extends android.util.Property { ctor public FloatProperty(java.lang.String); method public final void set(T, java.lang.Float); method public abstract void setValue(T, float); } - public abstract class IntProperty extends android.util.Property { + public abstract class IntProperty<T> extends android.util.Property { ctor public IntProperty(java.lang.String); method public final void set(T, java.lang.Integer); method public abstract void setValue(T, int); @@ -43264,7 +43267,7 @@ package android.util { method public void println(java.lang.String); } - public class LongSparseArray implements java.lang.Cloneable { + public class LongSparseArray<E> implements java.lang.Cloneable { ctor public LongSparseArray(); ctor public LongSparseArray(int); method public void append(long, E); @@ -43284,7 +43287,7 @@ package android.util { method public E valueAt(int); } - public class LruCache { + public class LruCache<K, V> { ctor public LruCache(int); method protected V create(K); method public final synchronized int createCount(); @@ -43372,9 +43375,9 @@ package android.util { ctor public NoSuchPropertyException(java.lang.String); } - public class Pair { + public class Pair<F, S> { ctor public Pair(F, S); - method public static android.util.Pair<A, B> create(A, B); + method public static <A, B> android.util.Pair<A, B> create(A, B); field public final F first; field public final S second; } @@ -43407,22 +43410,22 @@ package android.util { method public abstract void println(java.lang.String); } - public abstract class Property { + public abstract class Property<T, V> { ctor public Property(java.lang.Class<V>, java.lang.String); method public abstract V get(T); method public java.lang.String getName(); method public java.lang.Class<V> getType(); method public boolean isReadOnly(); - method public static android.util.Property<T, V> of(java.lang.Class<T>, java.lang.Class<V>, java.lang.String); + method public static <T, V> android.util.Property<T, V> of(java.lang.Class<T>, java.lang.Class<V>, java.lang.String); method public void set(T, V); } - public final class Range { + public final class Range<T extends java.lang.Comparable<? super T>> { ctor public Range(T, T); method public T clamp(T); method public boolean contains(T); method public boolean contains(android.util.Range<T>); - method public static android.util.Range<T> create(T, T); + method public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> create(T, T); method public android.util.Range<T> extend(android.util.Range<T>); method public android.util.Range<T> extend(T, T); method public android.util.Range<T> extend(T); @@ -43466,7 +43469,7 @@ package android.util { method public static android.util.SizeF parseSizeF(java.lang.String) throws java.lang.NumberFormatException; } - public class SparseArray implements java.lang.Cloneable { + public class SparseArray<E> implements java.lang.Cloneable { ctor public SparseArray(); ctor public SparseArray(int); method public void append(int, E); @@ -48246,7 +48249,7 @@ package android.webkit { method public static java.lang.String stripAnchor(java.lang.String); } - public abstract interface ValueCallback { + public abstract interface ValueCallback<T> { method public abstract void onReceiveValue(T); } @@ -49261,7 +49264,7 @@ package android.widget { field public static final int NO_SELECTION = -2147483648; // 0x80000000 } - public abstract class AdapterView extends android.view.ViewGroup { + public abstract class AdapterView<T extends android.widget.Adapter> extends android.view.ViewGroup { ctor public AdapterView(android.content.Context); ctor public AdapterView(android.content.Context, android.util.AttributeSet); ctor public AdapterView(android.content.Context, android.util.AttributeSet, int); @@ -49384,7 +49387,7 @@ package android.widget { ctor public AnalogClock(android.content.Context, android.util.AttributeSet, int, int); } - public class ArrayAdapter extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter { + public class ArrayAdapter<T> extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter { ctor public ArrayAdapter(android.content.Context, int); ctor public ArrayAdapter(android.content.Context, int, int); ctor public ArrayAdapter(android.content.Context, int, T[]); @@ -49445,7 +49448,7 @@ package android.widget { method protected void performFiltering(java.lang.CharSequence, int); method public void performValidation(); method protected void replaceText(java.lang.CharSequence); - method public void setAdapter(T); + method public <T extends android.widget.ListAdapter & android.widget.Filterable> void setAdapter(T); method public void setCompletionHint(java.lang.CharSequence); method public void setDropDownAnchor(int); method public void setDropDownBackgroundDrawable(android.graphics.drawable.Drawable); @@ -51730,7 +51733,7 @@ package android.widget { package com.android.internal.util { - public abstract interface Predicate { + public abstract interface Predicate<T> { method public abstract boolean apply(T); } @@ -53802,22 +53805,22 @@ package java.lang { enum_constant public static final java.lang.Character.UnicodeScript YI; } - public final class Class implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type { - method public java.lang.Class<? extends U> asSubclass(java.lang.Class<U>); + public final class Class<T> implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type { + method public <U> java.lang.Class<? extends U> asSubclass(java.lang.Class<U>); method public T cast(java.lang.Object); method public boolean desiredAssertionStatus(); method public static java.lang.Class<?> forName(java.lang.String) throws java.lang.ClassNotFoundException; method public static java.lang.Class<?> forName(java.lang.String, boolean, java.lang.ClassLoader) throws java.lang.ClassNotFoundException; - method public A getAnnotation(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A getAnnotation(java.lang.Class<A>); method public java.lang.annotation.Annotation[] getAnnotations(); - method public A[] getAnnotationsByType(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(java.lang.Class<A>); method public java.lang.String getCanonicalName(); method public java.lang.ClassLoader getClassLoader(); method public java.lang.Class<?>[] getClasses(); method public java.lang.Class<?> getComponentType(); method public java.lang.reflect.Constructor<T> getConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException; method public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException; - method public A getDeclaredAnnotation(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(java.lang.Class<A>); method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); method public java.lang.Class<?>[] getDeclaredClasses(); method public java.lang.reflect.Constructor<T> getDeclaredConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException; @@ -53929,7 +53932,7 @@ package java.lang { public abstract interface Cloneable { } - public abstract interface Comparable { + public abstract interface Comparable<T> { method public abstract int compareTo(T); } @@ -53983,7 +53986,7 @@ package java.lang { field public static final java.lang.Class<java.lang.Double> TYPE; } - public abstract class Enum implements java.lang.Comparable java.io.Serializable { + public abstract class Enum<E extends java.lang.Enum<E>> implements java.lang.Comparable java.io.Serializable { ctor protected Enum(java.lang.String, int); method protected final java.lang.Object clone() throws java.lang.CloneNotSupportedException; method public final int compareTo(E); @@ -53993,7 +53996,7 @@ package java.lang { method public final int hashCode(); method public final java.lang.String name(); method public final int ordinal(); - method public static T valueOf(java.lang.Class<T>, java.lang.String); + method public static <T extends java.lang.Enum<T>> T valueOf(java.lang.Class<T>, java.lang.String); } public class EnumConstantNotPresentException extends java.lang.RuntimeException { @@ -54112,7 +54115,7 @@ package java.lang { ctor public IndexOutOfBoundsException(java.lang.String); } - public class InheritableThreadLocal extends java.lang.ThreadLocal { + public class InheritableThreadLocal<T> extends java.lang.ThreadLocal { ctor public InheritableThreadLocal(); method protected T childValue(T); } @@ -54191,7 +54194,7 @@ package java.lang { ctor public InterruptedException(java.lang.String); } - public abstract interface Iterable { + public abstract interface Iterable<T> { 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(); @@ -54406,12 +54409,12 @@ package java.lang { } public class Package implements java.lang.reflect.AnnotatedElement { - method public A getAnnotation(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A getAnnotation(java.lang.Class<A>); method public java.lang.annotation.Annotation[] getAnnotations(); - method public A[] getAnnotationsByType(java.lang.Class<A>); - method public A getDeclaredAnnotation(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(java.lang.Class<A>); method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); - method public A[] getDeclaredAnnotationsByType(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A[] getDeclaredAnnotationsByType(java.lang.Class<A>); method public java.lang.String getImplementationTitle(); method public java.lang.String getImplementationVendor(); method public java.lang.String getImplementationVersion(); @@ -55010,13 +55013,13 @@ package java.lang { method public void uncaughtException(java.lang.Thread, java.lang.Throwable); } - public class ThreadLocal { + public class ThreadLocal<T> { ctor public ThreadLocal(); method public T get(); method protected T initialValue(); method public void remove(); method public void set(T); - method public static java.lang.ThreadLocal<S> withInitial(java.util.function.Supplier<? extends S>); + method public static <S> java.lang.ThreadLocal<S> withInitial(java.util.function.Supplier<? extends S>); } public class Throwable implements java.io.Serializable { @@ -55119,6 +55122,8 @@ package java.lang.annotation { enum_constant public static final java.lang.annotation.ElementType PACKAGE; enum_constant public static final java.lang.annotation.ElementType PARAMETER; enum_constant public static final java.lang.annotation.ElementType TYPE; + enum_constant public static final java.lang.annotation.ElementType TYPE_PARAMETER; + enum_constant public static final java.lang.annotation.ElementType TYPE_USE; } public class IncompleteAnnotationException extends java.lang.RuntimeException { @@ -55154,30 +55159,30 @@ package java.lang.annotation { package java.lang.ref { - public class PhantomReference extends java.lang.ref.Reference { + public class PhantomReference<T> extends java.lang.ref.Reference { ctor public PhantomReference(T, java.lang.ref.ReferenceQueue<? super T>); } - public abstract class Reference { + public abstract class Reference<T> { method public void clear(); method public boolean enqueue(); method public T get(); method public boolean isEnqueued(); } - public class ReferenceQueue { + public class ReferenceQueue<T> { ctor public ReferenceQueue(); method public java.lang.ref.Reference<? extends T> poll(); method public java.lang.ref.Reference<? extends T> remove(long) throws java.lang.IllegalArgumentException, java.lang.InterruptedException; method public java.lang.ref.Reference<? extends T> remove() throws java.lang.InterruptedException; } - public class SoftReference extends java.lang.ref.Reference { + public class SoftReference<T> extends java.lang.ref.Reference { ctor public SoftReference(T); ctor public SoftReference(T, java.lang.ref.ReferenceQueue<? super T>); } - public class WeakReference extends java.lang.ref.Reference { + public class WeakReference<T> extends java.lang.ref.Reference { ctor public WeakReference(T); ctor public WeakReference(T, java.lang.ref.ReferenceQueue<? super T>); } @@ -55188,7 +55193,7 @@ package java.lang.reflect { public class AccessibleObject implements java.lang.reflect.AnnotatedElement { ctor protected AccessibleObject(); - method public T getAnnotation(java.lang.Class<T>); + method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>); method public java.lang.annotation.Annotation[] getAnnotations(); method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); method public boolean isAccessible(); @@ -55197,12 +55202,12 @@ package java.lang.reflect { } public abstract interface AnnotatedElement { - method public abstract T getAnnotation(java.lang.Class<T>); + method public abstract <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>); method public abstract java.lang.annotation.Annotation[] getAnnotations(); - method public default T[] getAnnotationsByType(java.lang.Class<T>); - method public default java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class<T>); + method public default <T extends java.lang.annotation.Annotation> T[] getAnnotationsByType(java.lang.Class<T>); + method public default <T extends java.lang.annotation.Annotation> T getDeclaredAnnotation(java.lang.Class<T>); method public abstract java.lang.annotation.Annotation[] getDeclaredAnnotations(); - method public default T[] getDeclaredAnnotationsByType(java.lang.Class<T>); + method public default <T extends java.lang.annotation.Annotation> T[] getDeclaredAnnotationsByType(java.lang.Class<T>); method public default boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>); } @@ -55230,7 +55235,7 @@ package java.lang.reflect { method public static void setShort(java.lang.Object, int, short) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException; } - public final class Constructor extends java.lang.reflect.Executable { + public final class Constructor<T> extends java.lang.reflect.Executable { method public java.lang.Class<T> getDeclaringClass(); method public java.lang.Class<?>[] getExceptionTypes(); method public int getModifiers(); @@ -55252,7 +55257,9 @@ package java.lang.reflect { method public abstract java.lang.annotation.Annotation[][] getParameterAnnotations(); method public int getParameterCount(); method public abstract java.lang.Class<?>[] getParameterTypes(); + method public java.lang.reflect.Parameter[] getParameters(); method public abstract java.lang.reflect.TypeVariable<?>[] getTypeParameters(); + method public final boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>); method public boolean isSynthetic(); method public boolean isVarArgs(); method public abstract java.lang.String toGenericString(); @@ -55375,6 +55382,21 @@ package java.lang.reflect { field public static final int VOLATILE = 64; // 0x40 } + public final class Parameter implements java.lang.reflect.AnnotatedElement { + method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>); + method public java.lang.annotation.Annotation[] getAnnotations(); + method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); + method public java.lang.reflect.Executable getDeclaringExecutable(); + method public int getModifiers(); + method public java.lang.String getName(); + method public java.lang.reflect.Type getParameterizedType(); + method public java.lang.Class<?> getType(); + method public boolean isImplicit(); + method public boolean isNamePresent(); + method public boolean isSynthetic(); + method public boolean isVarArgs(); + } + public abstract interface ParameterizedType implements java.lang.reflect.Type { method public abstract java.lang.reflect.Type[] getActualTypeArguments(); method public abstract java.lang.reflect.Type getOwnerType(); @@ -55398,7 +55420,7 @@ package java.lang.reflect { public abstract interface Type { } - public abstract interface TypeVariable implements java.lang.reflect.Type { + public abstract interface TypeVariable<D extends java.lang.reflect.GenericDeclaration> implements java.lang.reflect.Type { method public abstract java.lang.reflect.Type[] getBounds(); method public abstract D getGenericDeclaration(); method public abstract java.lang.String getName(); @@ -56187,7 +56209,7 @@ package java.net { method public abstract java.net.SocketImpl createSocketImpl(); } - public abstract interface SocketOption { + public abstract interface SocketOption<T> { method public abstract java.lang.String name(); method public abstract java.lang.Class<T> type(); } @@ -56719,9 +56741,9 @@ package java.nio.channels { } public abstract interface AsynchronousByteChannel implements java.nio.channels.AsynchronousChannel { - method public abstract void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer); - method public abstract void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer); } @@ -56749,25 +56771,25 @@ package java.nio.channels { public abstract class AsynchronousFileChannel implements java.nio.channels.AsynchronousChannel { ctor protected AsynchronousFileChannel(); method public abstract void force(boolean) throws java.io.IOException; - method public abstract void lock(long, long, boolean, A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>); - method public final void lock(A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>); + method public abstract <A> void lock(long, long, boolean, A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>); + method public final <A> void lock(A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>); method public abstract java.util.concurrent.Future<java.nio.channels.FileLock> lock(long, long, boolean); method public final java.util.concurrent.Future<java.nio.channels.FileLock> lock(); method public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.util.Set<? extends java.nio.file.OpenOption>, java.util.concurrent.ExecutorService, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException; method public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException; - method public abstract void read(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void read(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer, long); method public abstract long size() throws java.io.IOException; method public abstract java.nio.channels.AsynchronousFileChannel truncate(long) throws java.io.IOException; method public abstract java.nio.channels.FileLock tryLock(long, long, boolean) throws java.io.IOException; method public final java.nio.channels.FileLock tryLock() throws java.io.IOException; - method public abstract void write(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void write(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer, long); } public abstract class AsynchronousServerSocketChannel implements java.nio.channels.AsynchronousChannel java.nio.channels.NetworkChannel { ctor protected AsynchronousServerSocketChannel(java.nio.channels.spi.AsynchronousChannelProvider); - method public abstract void accept(A, java.nio.channels.CompletionHandler<java.nio.channels.AsynchronousSocketChannel, ? super A>); + method public abstract <A> void accept(A, java.nio.channels.CompletionHandler<java.nio.channels.AsynchronousSocketChannel, ? super A>); method public abstract java.util.concurrent.Future<java.nio.channels.AsynchronousSocketChannel> accept(); method public final java.nio.channels.AsynchronousServerSocketChannel bind(java.net.SocketAddress) throws java.io.IOException; method public abstract java.nio.channels.AsynchronousServerSocketChannel bind(java.net.SocketAddress, int) throws java.io.IOException; @@ -56775,30 +56797,30 @@ package java.nio.channels { method public static java.nio.channels.AsynchronousServerSocketChannel open(java.nio.channels.AsynchronousChannelGroup) throws java.io.IOException; method public static java.nio.channels.AsynchronousServerSocketChannel open() throws java.io.IOException; method public final java.nio.channels.spi.AsynchronousChannelProvider provider(); - method public abstract java.nio.channels.AsynchronousServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <T> java.nio.channels.AsynchronousServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; } public abstract class AsynchronousSocketChannel implements java.nio.channels.AsynchronousByteChannel java.nio.channels.NetworkChannel { ctor protected AsynchronousSocketChannel(java.nio.channels.spi.AsynchronousChannelProvider); method public abstract java.nio.channels.AsynchronousSocketChannel bind(java.net.SocketAddress) throws java.io.IOException; - method public abstract void connect(java.net.SocketAddress, A, java.nio.channels.CompletionHandler<java.lang.Void, ? super A>); + method public abstract <A> void connect(java.net.SocketAddress, A, java.nio.channels.CompletionHandler<java.lang.Void, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Void> connect(java.net.SocketAddress); method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException; method public abstract java.net.SocketAddress getRemoteAddress() throws java.io.IOException; method public static java.nio.channels.AsynchronousSocketChannel open(java.nio.channels.AsynchronousChannelGroup) throws java.io.IOException; method public static java.nio.channels.AsynchronousSocketChannel open() throws java.io.IOException; method public final java.nio.channels.spi.AsynchronousChannelProvider provider(); - method public abstract void read(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); - method public final void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void read(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public final <A> void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer); - method public abstract void read(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>); - method public abstract java.nio.channels.AsynchronousSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <A> void read(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>); + method public abstract <T> java.nio.channels.AsynchronousSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; method public abstract java.nio.channels.AsynchronousSocketChannel shutdownInput() throws java.io.IOException; method public abstract java.nio.channels.AsynchronousSocketChannel shutdownOutput() throws java.io.IOException; - method public abstract void write(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); - method public final void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void write(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public final <A> void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer); - method public abstract void write(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>); + method public abstract <A> void write(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>); } public abstract interface ByteChannel implements java.nio.channels.ReadableByteChannel java.nio.channels.WritableByteChannel { @@ -56838,7 +56860,7 @@ package java.nio.channels { ctor public ClosedSelectorException(); } - public abstract interface CompletionHandler { + public abstract interface CompletionHandler<V, A> { method public abstract void completed(V, A); method public abstract void failed(java.lang.Throwable, A); } @@ -56862,7 +56884,7 @@ package java.nio.channels { method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException; method public abstract java.net.SocketAddress receive(java.nio.ByteBuffer) throws java.io.IOException; method public abstract int send(java.nio.ByteBuffer, java.net.SocketAddress) throws java.io.IOException; - method public abstract java.nio.channels.DatagramChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <T> java.nio.channels.DatagramChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; method public abstract java.net.DatagramSocket socket(); method public final int validOps(); method public abstract int write(java.nio.ByteBuffer) throws java.io.IOException; @@ -56967,8 +56989,8 @@ package java.nio.channels { public abstract interface NetworkChannel implements java.nio.channels.Channel { method public abstract java.nio.channels.NetworkChannel bind(java.net.SocketAddress) throws java.io.IOException; method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException; - method public abstract T getOption(java.net.SocketOption<T>) throws java.io.IOException; - method public abstract java.nio.channels.NetworkChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <T> T getOption(java.net.SocketOption<T>) throws java.io.IOException; + method public abstract <T> java.nio.channels.NetworkChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; method public abstract java.util.Set<java.net.SocketOption<?>> supportedOptions(); } @@ -57090,7 +57112,7 @@ package java.nio.channels { method public abstract java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress, int) throws java.io.IOException; method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException; method public static java.nio.channels.ServerSocketChannel open() throws java.io.IOException; - method public abstract java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <T> java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; method public abstract java.net.ServerSocket socket(); method public final int validOps(); } @@ -57113,7 +57135,7 @@ package java.nio.channels { method public abstract int read(java.nio.ByteBuffer) throws java.io.IOException; method public abstract long read(java.nio.ByteBuffer[], int, int) throws java.io.IOException; method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException; - method public abstract java.nio.channels.SocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <T> java.nio.channels.SocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; method public abstract java.nio.channels.SocketChannel shutdownInput() throws java.io.IOException; method public abstract java.nio.channels.SocketChannel shutdownOutput() throws java.io.IOException; method public abstract java.net.Socket socket(); @@ -57398,11 +57420,11 @@ package java.nio.file { ctor public DirectoryNotEmptyException(java.lang.String); } - public abstract interface DirectoryStream implements java.io.Closeable java.lang.Iterable { + public abstract interface DirectoryStream<T> implements java.io.Closeable java.lang.Iterable { method public abstract java.util.Iterator<T> iterator(); } - public static abstract interface DirectoryStream.Filter { + public static abstract interface DirectoryStream.Filter<T> { method public abstract boolean accept(T) throws java.io.IOException; } @@ -57414,7 +57436,7 @@ package java.nio.file { public abstract class FileStore { ctor protected FileStore(); method public abstract java.lang.Object getAttribute(java.lang.String) throws java.io.IOException; - method public abstract V getFileStoreAttributeView(java.lang.Class<V>); + method public abstract <V extends java.nio.file.attribute.FileStoreAttributeView> V getFileStoreAttributeView(java.lang.Class<V>); method public abstract long getTotalSpace() throws java.io.IOException; method public abstract long getUnallocatedSpace() throws java.io.IOException; method public abstract long getUsableSpace() throws java.io.IOException; @@ -57486,7 +57508,7 @@ package java.nio.file { enum_constant public static final java.nio.file.FileVisitResult TERMINATE; } - public abstract interface FileVisitor { + public abstract interface FileVisitor<T> { method public abstract java.nio.file.FileVisitResult postVisitDirectory(T, java.io.IOException) throws java.io.IOException; method public abstract java.nio.file.FileVisitResult preVisitDirectory(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException; method public abstract java.nio.file.FileVisitResult visitFile(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException; @@ -57511,7 +57533,7 @@ package java.nio.file { method public static boolean exists(java.nio.file.Path, java.nio.file.LinkOption...); method public static java.util.stream.Stream<java.nio.file.Path> find(java.nio.file.Path, int, java.util.function.BiPredicate<java.nio.file.Path, java.nio.file.attribute.BasicFileAttributes>, java.nio.file.FileVisitOption...) throws java.io.IOException; method public static java.lang.Object getAttribute(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException; - method public static V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...); + method public static <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...); method public static java.nio.file.FileStore getFileStore(java.nio.file.Path) throws java.io.IOException; method public static java.nio.file.attribute.FileTime getLastModifiedTime(java.nio.file.Path, java.nio.file.LinkOption...) throws java.io.IOException; method public static java.nio.file.attribute.UserPrincipal getOwner(java.nio.file.Path, java.nio.file.LinkOption...) throws java.io.IOException; @@ -57544,7 +57566,7 @@ package java.nio.file { method public static byte[] readAllBytes(java.nio.file.Path) throws java.io.IOException; method public static java.util.List<java.lang.String> readAllLines(java.nio.file.Path, java.nio.charset.Charset) throws java.io.IOException; method public static java.util.List<java.lang.String> readAllLines(java.nio.file.Path) throws java.io.IOException; - method public static A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException; + method public static <A extends java.nio.file.attribute.BasicFileAttributes> A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException; method public static java.util.Map<java.lang.String, java.lang.Object> readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException; method public static java.nio.file.Path readSymbolicLink(java.nio.file.Path) throws java.io.IOException; method public static java.nio.file.Path setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption...) throws java.io.IOException; @@ -57652,17 +57674,17 @@ package java.nio.file { ctor public ReadOnlyFileSystemException(); } - public abstract interface SecureDirectoryStream implements java.nio.file.DirectoryStream { + public abstract interface SecureDirectoryStream<T> implements java.nio.file.DirectoryStream { method public abstract void deleteDirectory(T) throws java.io.IOException; method public abstract void deleteFile(T) throws java.io.IOException; - method public abstract V getFileAttributeView(java.lang.Class<V>); - method public abstract V getFileAttributeView(T, java.lang.Class<V>, java.nio.file.LinkOption...); + method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.lang.Class<V>); + method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(T, java.lang.Class<V>, java.nio.file.LinkOption...); method public abstract void move(T, java.nio.file.SecureDirectoryStream<T>, T) throws java.io.IOException; method public abstract java.nio.channels.SeekableByteChannel newByteChannel(T, java.util.Set<? extends java.nio.file.OpenOption>, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException; method public abstract java.nio.file.SecureDirectoryStream<T> newDirectoryStream(T, java.nio.file.LinkOption...) throws java.io.IOException; } - public class SimpleFileVisitor implements java.nio.file.FileVisitor { + public class SimpleFileVisitor<T> implements java.nio.file.FileVisitor { ctor protected SimpleFileVisitor(); method public java.nio.file.FileVisitResult postVisitDirectory(T, java.io.IOException) throws java.io.IOException; method public java.nio.file.FileVisitResult preVisitDirectory(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException; @@ -57700,13 +57722,13 @@ package java.nio.file { field public static final java.nio.file.WatchEvent.Kind<java.lang.Object> OVERFLOW; } - public abstract interface WatchEvent { + public abstract interface WatchEvent<T> { method public abstract T context(); method public abstract int count(); method public abstract java.nio.file.WatchEvent.Kind<T> kind(); } - public static abstract interface WatchEvent.Kind { + public static abstract interface WatchEvent.Kind<T> { method public abstract java.lang.String name(); method public abstract java.lang.Class<T> type(); } @@ -57842,7 +57864,7 @@ package java.nio.file.attribute { method public abstract boolean isSystem(); } - public abstract interface FileAttribute { + public abstract interface FileAttribute<T> { method public abstract java.lang.String name(); method public abstract T value(); } @@ -57939,7 +57961,7 @@ package java.nio.file.spi { method public void createSymbolicLink(java.nio.file.Path, java.nio.file.Path, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException; method public abstract void delete(java.nio.file.Path) throws java.io.IOException; method public boolean deleteIfExists(java.nio.file.Path) throws java.io.IOException; - method public abstract V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...); + method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...); method public abstract java.nio.file.FileStore getFileStore(java.nio.file.Path) throws java.io.IOException; method public abstract java.nio.file.FileSystem getFileSystem(java.net.URI); method public abstract java.nio.file.Path getPath(java.net.URI); @@ -57956,7 +57978,7 @@ package java.nio.file.spi { method public java.nio.file.FileSystem newFileSystem(java.nio.file.Path, java.util.Map<java.lang.String, ?>) throws java.io.IOException; method public java.io.InputStream newInputStream(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException; method public java.io.OutputStream newOutputStream(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException; - method public abstract A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException; + method public abstract <A extends java.nio.file.attribute.BasicFileAttributes> A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException; method public abstract java.util.Map<java.lang.String, java.lang.Object> readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException; method public java.nio.file.Path readSymbolicLink(java.nio.file.Path) throws java.io.IOException; method public abstract void setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption...) throws java.io.IOException; @@ -57986,12 +58008,12 @@ package java.security { public final class AccessController { method public static void checkPermission(java.security.Permission) throws java.security.AccessControlException; - method public static T doPrivileged(java.security.PrivilegedAction<T>); - method public static T doPrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext); - method public static T doPrivileged(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; - method public static T doPrivileged(java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException; - method public static T doPrivilegedWithCombiner(java.security.PrivilegedAction<T>); - method public static T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; + method public static <T> T doPrivileged(java.security.PrivilegedAction<T>); + method public static <T> T doPrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext); + method public static <T> T doPrivileged(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; + method public static <T> T doPrivileged(java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException; + method public static <T> T doPrivilegedWithCombiner(java.security.PrivilegedAction<T>); + method public static <T> T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; method public static java.security.AccessControlContext getContext(); } @@ -58030,7 +58052,7 @@ package java.security { method public static java.security.AlgorithmParameters getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException; method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException; method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException; - method public final T getParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException; + method public final <T extends java.security.spec.AlgorithmParameterSpec> T getParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException; method public final java.security.Provider getProvider(); method public final void init(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException; method public final void init(byte[]) throws java.io.IOException; @@ -58042,7 +58064,7 @@ package java.security { ctor public AlgorithmParametersSpi(); method protected abstract byte[] engineGetEncoded() throws java.io.IOException; method protected abstract byte[] engineGetEncoded(java.lang.String) throws java.io.IOException; - method protected abstract T engineGetParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException; + method protected abstract <T extends java.security.spec.AlgorithmParameterSpec> T engineGetParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException; method protected abstract void engineInit(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException; method protected abstract void engineInit(byte[]) throws java.io.IOException; method protected abstract void engineInit(byte[], java.lang.String) throws java.io.IOException; @@ -58234,7 +58256,7 @@ package java.security { method public static java.security.KeyFactory getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException; method public static java.security.KeyFactory getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException; method public static java.security.KeyFactory getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException; - method public final T getKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException; + method public final <T extends java.security.spec.KeySpec> T getKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException; method public final java.security.Provider getProvider(); method public final java.security.Key translateKey(java.security.Key) throws java.security.InvalidKeyException; } @@ -58243,7 +58265,7 @@ package java.security { ctor public KeyFactorySpi(); method protected abstract java.security.PrivateKey engineGeneratePrivate(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException; method protected abstract java.security.PublicKey engineGeneratePublic(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException; - method protected abstract T engineGetKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException; + method protected abstract <T extends java.security.spec.KeySpec> T engineGetKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException; method protected abstract java.security.Key engineTranslateKey(java.security.Key) throws java.security.InvalidKeyException; } @@ -58531,7 +58553,7 @@ package java.security { field public static final long serialVersionUID = 6034044314589513430L; // 0x53bd3b559a12c6d6L } - public abstract interface PrivilegedAction { + public abstract interface PrivilegedAction<T> { method public abstract T run(); } @@ -58540,7 +58562,7 @@ package java.security { method public java.lang.Exception getException(); } - public abstract interface PrivilegedExceptionAction { + public abstract interface PrivilegedExceptionAction<T> { method public abstract T run() throws java.lang.Exception; } @@ -60734,11 +60756,11 @@ package java.sql { method public abstract void free() throws java.sql.SQLException; method public abstract java.io.InputStream getBinaryStream() throws java.sql.SQLException; method public abstract java.io.Reader getCharacterStream() throws java.sql.SQLException; - method public abstract T getSource(java.lang.Class<T>) throws java.sql.SQLException; + method public abstract <T extends javax.xml.transform.Source> T getSource(java.lang.Class<T>) throws java.sql.SQLException; method public abstract java.lang.String getString() throws java.sql.SQLException; method public abstract java.io.OutputStream setBinaryStream() throws java.sql.SQLException; method public abstract java.io.Writer setCharacterStream() throws java.sql.SQLException; - method public abstract T setResult(java.lang.Class<T>) throws java.sql.SQLException; + method public abstract <T extends javax.xml.transform.Result> T setResult(java.lang.Class<T>) throws java.sql.SQLException; method public abstract void setString(java.lang.String) throws java.sql.SQLException; } @@ -60862,7 +60884,7 @@ package java.sql { public abstract interface Wrapper { method public abstract boolean isWrapperFor(java.lang.Class<?>) throws java.sql.SQLException; - method public abstract T unwrap(java.lang.Class<T>) throws java.sql.SQLException; + method public abstract <T> T unwrap(java.lang.Class<T>) throws java.sql.SQLException; } } @@ -61395,7 +61417,7 @@ package java.text { package java.util { - public abstract class AbstractCollection implements java.util.Collection { + public abstract class AbstractCollection<E> implements java.util.Collection { ctor protected AbstractCollection(); method public boolean add(E); method public boolean addAll(java.util.Collection<? extends E>); @@ -61409,10 +61431,10 @@ package java.util { method public boolean retainAll(java.util.Collection<?>); method public abstract int size(); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public <T> T[] toArray(T[]); } - public abstract class AbstractList extends java.util.AbstractCollection implements java.util.List { + public abstract class AbstractList<E> extends java.util.AbstractCollection implements java.util.List { ctor protected AbstractList(); method public void add(int, E); method public boolean addAll(int, java.util.Collection<? extends E>); @@ -61429,7 +61451,7 @@ package java.util { field protected transient int modCount; } - public abstract class AbstractMap implements java.util.Map { + public abstract class AbstractMap<K, V> implements java.util.Map { ctor protected AbstractMap(); method public void clear(); method public boolean containsKey(java.lang.Object); @@ -61445,7 +61467,7 @@ package java.util { method public java.util.Collection<V> values(); } - public static class AbstractMap.SimpleEntry implements java.util.Map.Entry java.io.Serializable { + public static class AbstractMap.SimpleEntry<K, V> implements java.util.Map.Entry java.io.Serializable { ctor public AbstractMap.SimpleEntry(K, V); ctor public AbstractMap.SimpleEntry(java.util.Map.Entry<? extends K, ? extends V>); method public K getKey(); @@ -61453,7 +61475,7 @@ package java.util { method public V setValue(V); } - public static class AbstractMap.SimpleImmutableEntry implements java.util.Map.Entry java.io.Serializable { + public static class AbstractMap.SimpleImmutableEntry<K, V> implements java.util.Map.Entry java.io.Serializable { ctor public AbstractMap.SimpleImmutableEntry(K, V); ctor public AbstractMap.SimpleImmutableEntry(java.util.Map.Entry<? extends K, ? extends V>); method public K getKey(); @@ -61461,23 +61483,23 @@ package java.util { method public V setValue(V); } - public abstract class AbstractQueue extends java.util.AbstractCollection implements java.util.Queue { + public abstract class AbstractQueue<E> extends java.util.AbstractCollection implements java.util.Queue { ctor protected AbstractQueue(); method public E element(); method public E remove(); } - public abstract class AbstractSequentialList extends java.util.AbstractList { + public abstract class AbstractSequentialList<E> extends java.util.AbstractList { ctor protected AbstractSequentialList(); method public E get(int); method public abstract java.util.ListIterator<E> listIterator(int); } - public abstract class AbstractSet extends java.util.AbstractCollection implements java.util.Set { + public abstract class AbstractSet<E> extends java.util.AbstractCollection implements java.util.Set { ctor protected AbstractSet(); } - public class ArrayDeque extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable { + public class ArrayDeque<E> extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable { ctor public ArrayDeque(); ctor public ArrayDeque(int); ctor public ArrayDeque(java.util.Collection<? extends E>); @@ -61509,7 +61531,7 @@ package java.util { 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 { + public class ArrayList<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public ArrayList(int); ctor public ArrayList(); ctor public ArrayList(java.util.Collection<? extends E>); @@ -61526,7 +61548,7 @@ package java.util { } public class Arrays { - method public static java.util.List<T> asList(T...); + method public static <T> java.util.List<T> asList(T...); method public static int binarySearch(long[], long); method public static int binarySearch(long[], int, int, long); method public static int binarySearch(int[], int); @@ -61543,10 +61565,10 @@ package java.util { method public static int binarySearch(float[], int, int, float); method public static int binarySearch(java.lang.Object[], java.lang.Object); method public static int binarySearch(java.lang.Object[], int, int, java.lang.Object); - method public static int binarySearch(T[], T, java.util.Comparator<? super T>); - method public static int binarySearch(T[], int, int, T, java.util.Comparator<? super T>); - method public static T[] copyOf(T[], int); - method public static T[] copyOf(U[], int, java.lang.Class<? extends T[]>); + method public static <T> int binarySearch(T[], T, java.util.Comparator<? super T>); + method public static <T> int binarySearch(T[], int, int, T, java.util.Comparator<? super T>); + method public static <T> T[] copyOf(T[], int); + method public static <T, U> T[] copyOf(U[], int, java.lang.Class<? extends T[]>); method public static byte[] copyOf(byte[], int); method public static short[] copyOf(short[], int); method public static int[] copyOf(int[], int); @@ -61555,8 +61577,8 @@ package java.util { method public static float[] copyOf(float[], int); method public static double[] copyOf(double[], int); method public static boolean[] copyOf(boolean[], int); - method public static T[] copyOfRange(T[], int, int); - method public static T[] copyOfRange(U[], int, int, java.lang.Class<? extends T[]>); + method public static <T> T[] copyOfRange(T[], int, int); + method public static <T, U> T[] copyOfRange(U[], int, int, java.lang.Class<? extends T[]>); method public static byte[] copyOfRange(byte[], int, int); method public static short[] copyOfRange(short[], int, int); method public static int[] copyOfRange(int[], int, int); @@ -61604,15 +61626,15 @@ package java.util { method public static int hashCode(float[]); method public static int hashCode(double[]); method public static int hashCode(java.lang.Object[]); - method public static void parallelPrefix(T[], java.util.function.BinaryOperator<T>); - method public static void parallelPrefix(T[], int, int, java.util.function.BinaryOperator<T>); + method public static <T> void parallelPrefix(T[], java.util.function.BinaryOperator<T>); + method public static <T> void parallelPrefix(T[], int, int, java.util.function.BinaryOperator<T>); method public static void parallelPrefix(long[], java.util.function.LongBinaryOperator); method public static void parallelPrefix(long[], int, int, java.util.function.LongBinaryOperator); method public static void parallelPrefix(double[], java.util.function.DoubleBinaryOperator); method public static void parallelPrefix(double[], int, int, java.util.function.DoubleBinaryOperator); method public static void parallelPrefix(int[], java.util.function.IntBinaryOperator); method public static void parallelPrefix(int[], int, int, java.util.function.IntBinaryOperator); - method public static void parallelSetAll(T[], java.util.function.IntFunction<? extends T>); + method public static <T> void parallelSetAll(T[], java.util.function.IntFunction<? extends T>); method public static void parallelSetAll(int[], java.util.function.IntUnaryOperator); method public static void parallelSetAll(long[], java.util.function.IntToLongFunction); method public static void parallelSetAll(double[], java.util.function.IntToDoubleFunction); @@ -61630,11 +61652,11 @@ package java.util { method public static void parallelSort(float[], int, int); method public static void parallelSort(double[]); method public static void parallelSort(double[], int, int); - method public static void parallelSort(T[]); - method public static void parallelSort(T[], int, int); - method public static void parallelSort(T[], java.util.Comparator<? super T>); - method public static void parallelSort(T[], int, int, java.util.Comparator<? super T>); - method public static void setAll(T[], java.util.function.IntFunction<? extends T>); + method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[]); + method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[], int, int); + method public static <T> void parallelSort(T[], java.util.Comparator<? super T>); + method public static <T> void parallelSort(T[], int, int, java.util.Comparator<? super T>); + method public static <T> void setAll(T[], java.util.function.IntFunction<? extends T>); method public static void setAll(int[], java.util.function.IntUnaryOperator); method public static void setAll(long[], java.util.function.IntToLongFunction); method public static void setAll(double[], java.util.function.IntToDoubleFunction); @@ -61654,18 +61676,18 @@ package java.util { method public static void sort(double[], int, int); method public static void sort(java.lang.Object[]); 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 <T> void sort(T[], java.util.Comparator<? super T>); + method public static <T> void sort(T[], int, int, java.util.Comparator<? super T>); + method public static <T> java.util.Spliterator<T> spliterator(T[]); + method public static <T> 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.util.stream.Stream<T> stream(T[]); - method public static java.util.stream.Stream<T> stream(T[], int, int); + method public static <T> java.util.stream.Stream<T> stream(T[]); + method public static <T> java.util.stream.Stream<T> stream(T[], int, int); method public static java.util.stream.IntStream stream(int[]); method public static java.util.stream.IntStream stream(int[], int, int); method public static java.util.stream.LongStream stream(long[]); @@ -61849,7 +61871,7 @@ package java.util { field protected long time; } - public abstract interface Collection implements java.lang.Iterable { + public abstract interface Collection<E> implements java.lang.Iterable { method public abstract boolean add(E); method public abstract boolean addAll(java.util.Collection<? extends E>); method public abstract void clear(); @@ -61867,86 +61889,86 @@ package java.util { method public abstract int size(); method public default java.util.stream.Stream<E> stream(); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract <T> T[] toArray(T[]); } public class Collections { - method public static boolean addAll(java.util.Collection<? super T>, T...); - method public static java.util.Queue<T> asLifoQueue(java.util.Deque<T>); - method public static int binarySearch(java.util.List<? extends java.lang.Comparable<? super T>>, T); - method public static int binarySearch(java.util.List<? extends T>, T, java.util.Comparator<? super T>); - method public static java.util.Collection<E> checkedCollection(java.util.Collection<E>, java.lang.Class<E>); - method public static java.util.List<E> checkedList(java.util.List<E>, java.lang.Class<E>); - method public static java.util.Map<K, V> checkedMap(java.util.Map<K, V>, java.lang.Class<K>, java.lang.Class<V>); - method public static java.util.Set<E> checkedSet(java.util.Set<E>, java.lang.Class<E>); - method public static java.util.SortedMap<K, V> checkedSortedMap(java.util.SortedMap<K, V>, java.lang.Class<K>, java.lang.Class<V>); - method public static java.util.SortedSet<E> checkedSortedSet(java.util.SortedSet<E>, java.lang.Class<E>); - method public static void copy(java.util.List<? super T>, java.util.List<? extends T>); + method public static <T> boolean addAll(java.util.Collection<? super T>, T...); + method public static <T> java.util.Queue<T> asLifoQueue(java.util.Deque<T>); + method public static <T> int binarySearch(java.util.List<? extends java.lang.Comparable<? super T>>, T); + method public static <T> int binarySearch(java.util.List<? extends T>, T, java.util.Comparator<? super T>); + method public static <E> java.util.Collection<E> checkedCollection(java.util.Collection<E>, java.lang.Class<E>); + method public static <E> java.util.List<E> checkedList(java.util.List<E>, java.lang.Class<E>); + method public static <K, V> java.util.Map<K, V> checkedMap(java.util.Map<K, V>, java.lang.Class<K>, java.lang.Class<V>); + method public static <E> java.util.Set<E> checkedSet(java.util.Set<E>, java.lang.Class<E>); + method public static <K, V> java.util.SortedMap<K, V> checkedSortedMap(java.util.SortedMap<K, V>, java.lang.Class<K>, java.lang.Class<V>); + method public static <E> java.util.SortedSet<E> checkedSortedSet(java.util.SortedSet<E>, java.lang.Class<E>); + method public static <T> void copy(java.util.List<? super T>, java.util.List<? extends T>); method public static boolean disjoint(java.util.Collection<?>, java.util.Collection<?>); - method public static java.util.Enumeration<T> emptyEnumeration(); - method public static java.util.Iterator<T> emptyIterator(); - method public static final java.util.List<T> emptyList(); - method public static java.util.ListIterator<T> emptyListIterator(); - method public static final java.util.Map<K, V> emptyMap(); - method public static final java.util.Set<T> emptySet(); - method public static java.util.Enumeration<T> enumeration(java.util.Collection<T>); - method public static void fill(java.util.List<? super T>, T); + method public static <T> java.util.Enumeration<T> emptyEnumeration(); + method public static <T> java.util.Iterator<T> emptyIterator(); + method public static final <T> java.util.List<T> emptyList(); + method public static <T> java.util.ListIterator<T> emptyListIterator(); + method public static final <K, V> java.util.Map<K, V> emptyMap(); + method public static final <T> java.util.Set<T> emptySet(); + method public static <T> java.util.Enumeration<T> enumeration(java.util.Collection<T>); + method public static <T> void fill(java.util.List<? super T>, T); method public static int frequency(java.util.Collection<?>, java.lang.Object); method public static int indexOfSubList(java.util.List<?>, java.util.List<?>); method public static int lastIndexOfSubList(java.util.List<?>, java.util.List<?>); - method public static java.util.ArrayList<T> list(java.util.Enumeration<T>); - method public static T max(java.util.Collection<? extends T>); - method public static T max(java.util.Collection<? extends T>, java.util.Comparator<? super T>); - method public static T min(java.util.Collection<? extends T>); - method public static T min(java.util.Collection<? extends T>, java.util.Comparator<? super T>); - method public static java.util.List<T> nCopies(int, T); - method public static java.util.Set<E> newSetFromMap(java.util.Map<E, java.lang.Boolean>); - method public static boolean replaceAll(java.util.List<T>, T, T); + method public static <T> java.util.ArrayList<T> list(java.util.Enumeration<T>); + method public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T max(java.util.Collection<? extends T>); + method public static <T> T max(java.util.Collection<? extends T>, java.util.Comparator<? super T>); + method public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T min(java.util.Collection<? extends T>); + method public static <T> T min(java.util.Collection<? extends T>, java.util.Comparator<? super T>); + method public static <T> java.util.List<T> nCopies(int, T); + method public static <E> java.util.Set<E> newSetFromMap(java.util.Map<E, java.lang.Boolean>); + method public static <T> boolean replaceAll(java.util.List<T>, T, T); method public static void reverse(java.util.List<?>); - method public static java.util.Comparator<T> reverseOrder(); - method public static java.util.Comparator<T> reverseOrder(java.util.Comparator<T>); + method public static <T> java.util.Comparator<T> reverseOrder(); + method public static <T> java.util.Comparator<T> reverseOrder(java.util.Comparator<T>); method public static void rotate(java.util.List<?>, int); method public static void shuffle(java.util.List<?>); method public static void shuffle(java.util.List<?>, java.util.Random); - method public static java.util.Set<E> singleton(E); - method public static java.util.List<E> singletonList(E); - method public static java.util.Map<K, V> singletonMap(K, V); - method public static void sort(java.util.List<T>); - method public static void sort(java.util.List<T>, java.util.Comparator<? super T>); + method public static <E> java.util.Set<E> singleton(E); + method public static <E> java.util.List<E> singletonList(E); + method public static <K, V> java.util.Map<K, V> singletonMap(K, V); + method public static <T extends java.lang.Comparable<? super T>> void sort(java.util.List<T>); + method public static <T> void sort(java.util.List<T>, java.util.Comparator<? super T>); method public static void swap(java.util.List<?>, int, int); - method public static java.util.Collection<T> synchronizedCollection(java.util.Collection<T>); - method public static java.util.List<T> synchronizedList(java.util.List<T>); - method public static java.util.Map<K, V> synchronizedMap(java.util.Map<K, V>); - method public static java.util.Set<T> synchronizedSet(java.util.Set<T>); - method public static java.util.SortedMap<K, V> synchronizedSortedMap(java.util.SortedMap<K, V>); - method public static java.util.SortedSet<T> synchronizedSortedSet(java.util.SortedSet<T>); - method public static java.util.Collection<T> unmodifiableCollection(java.util.Collection<? extends T>); - method public static java.util.List<T> unmodifiableList(java.util.List<? extends T>); - method public static java.util.Map<K, V> unmodifiableMap(java.util.Map<? extends K, ? extends V>); - method public static java.util.Set<T> unmodifiableSet(java.util.Set<? extends T>); - method public static java.util.SortedMap<K, V> unmodifiableSortedMap(java.util.SortedMap<K, ? extends V>); - method public static java.util.SortedSet<T> unmodifiableSortedSet(java.util.SortedSet<T>); + method public static <T> java.util.Collection<T> synchronizedCollection(java.util.Collection<T>); + method public static <T> java.util.List<T> synchronizedList(java.util.List<T>); + method public static <K, V> java.util.Map<K, V> synchronizedMap(java.util.Map<K, V>); + method public static <T> java.util.Set<T> synchronizedSet(java.util.Set<T>); + method public static <K, V> java.util.SortedMap<K, V> synchronizedSortedMap(java.util.SortedMap<K, V>); + method public static <T> java.util.SortedSet<T> synchronizedSortedSet(java.util.SortedSet<T>); + method public static <T> java.util.Collection<T> unmodifiableCollection(java.util.Collection<? extends T>); + method public static <T> java.util.List<T> unmodifiableList(java.util.List<? extends T>); + method public static <K, V> java.util.Map<K, V> unmodifiableMap(java.util.Map<? extends K, ? extends V>); + method public static <T> java.util.Set<T> unmodifiableSet(java.util.Set<? extends T>); + method public static <K, V> java.util.SortedMap<K, V> unmodifiableSortedMap(java.util.SortedMap<K, ? extends V>); + method public static <T> java.util.SortedSet<T> unmodifiableSortedSet(java.util.SortedSet<T>); field public static final java.util.List EMPTY_LIST; field public static final java.util.Map EMPTY_MAP; field public static final java.util.Set EMPTY_SET; } - public abstract interface Comparator { + public abstract interface Comparator<T> { method public abstract int compare(T, T); - method public static java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>); - method public static java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>); - method public static java.util.Comparator<T> comparingDouble(java.util.function.ToDoubleFunction<? super T>); - method public static java.util.Comparator<T> comparingInt(java.util.function.ToIntFunction<? super T>); - method public static java.util.Comparator<T> comparingLong(java.util.function.ToLongFunction<? super T>); + method public static <T, U> java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>); + method public static <T, U extends java.lang.Comparable<? super U>> java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>); + method public static <T> java.util.Comparator<T> comparingDouble(java.util.function.ToDoubleFunction<? super T>); + method public static <T> java.util.Comparator<T> comparingInt(java.util.function.ToIntFunction<? super T>); + method public static <T> java.util.Comparator<T> comparingLong(java.util.function.ToLongFunction<? super T>); method public abstract boolean equals(java.lang.Object); - method public static java.util.Comparator<T> naturalOrder(); - method public static java.util.Comparator<T> nullsFirst(java.util.Comparator<? super T>); - method public static java.util.Comparator<T> nullsLast(java.util.Comparator<? super T>); - method public static java.util.Comparator<T> reverseOrder(); + method public static <T extends java.lang.Comparable<? super T>> java.util.Comparator<T> naturalOrder(); + method public static <T> java.util.Comparator<T> nullsFirst(java.util.Comparator<? super T>); + method public static <T> java.util.Comparator<T> nullsLast(java.util.Comparator<? super T>); + method public static <T extends java.lang.Comparable<? super T>> java.util.Comparator<T> reverseOrder(); method public default java.util.Comparator<T> reversed(); method public default java.util.Comparator<T> thenComparing(java.util.Comparator<? super T>); - method public default java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>); - method public default java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>); + method public default <U> java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>); + method public default <U extends java.lang.Comparable<? super U>> java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>); method public default java.util.Comparator<T> thenComparingDouble(java.util.function.ToDoubleFunction<? super T>); method public default java.util.Comparator<T> thenComparingInt(java.util.function.ToIntFunction<? super T>); method public default java.util.Comparator<T> thenComparingLong(java.util.function.ToLongFunction<? super T>); @@ -62005,7 +62027,7 @@ package java.util { method public deprecated java.lang.String toLocaleString(); } - public abstract interface Deque implements java.util.Queue { + public abstract interface Deque<E> implements java.util.Queue { method public abstract boolean add(E); method public abstract void addFirst(E); method public abstract void addLast(E); @@ -62035,7 +62057,7 @@ package java.util { method public abstract int size(); } - public abstract class Dictionary { + public abstract class Dictionary<K, V> { ctor public Dictionary(); method public abstract java.util.Enumeration<V> elements(); method public abstract V get(java.lang.Object); @@ -62066,7 +62088,7 @@ package java.util { ctor public EmptyStackException(); } - public class EnumMap extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable { + public class EnumMap<K extends java.lang.Enum<K>, V> extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable { ctor public EnumMap(java.lang.Class<K>); ctor public EnumMap(java.util.EnumMap<K, ? extends V>); ctor public EnumMap(java.util.Map<K, ? extends V>); @@ -62074,23 +62096,23 @@ package java.util { method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); } - public abstract class EnumSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable { - method public static java.util.EnumSet<E> allOf(java.lang.Class<E>); + public abstract class EnumSet<E extends java.lang.Enum<E>> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable { + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> allOf(java.lang.Class<E>); method public java.util.EnumSet<E> clone(); - method public static java.util.EnumSet<E> complementOf(java.util.EnumSet<E>); - method public static java.util.EnumSet<E> copyOf(java.util.EnumSet<E>); - method public static java.util.EnumSet<E> copyOf(java.util.Collection<E>); - method public static java.util.EnumSet<E> noneOf(java.lang.Class<E>); - method public static java.util.EnumSet<E> of(E); - method public static java.util.EnumSet<E> of(E, E); - method public static java.util.EnumSet<E> of(E, E, E); - method public static java.util.EnumSet<E> of(E, E, E, E); - method public static java.util.EnumSet<E> of(E, E, E, E, E); - method public static java.util.EnumSet<E> of(E, E...); - method public static java.util.EnumSet<E> range(E, E); - } - - public abstract interface Enumeration { + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> complementOf(java.util.EnumSet<E>); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> copyOf(java.util.EnumSet<E>); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> copyOf(java.util.Collection<E>); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> noneOf(java.lang.Class<E>); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E, E); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E, E, E); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E...); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> range(E, E); + } + + public abstract interface Enumeration<E> { method public abstract boolean hasMoreElements(); method public abstract E nextElement(); } @@ -62098,7 +62120,7 @@ package java.util { public abstract interface EventListener { } - public abstract class EventListenerProxy implements java.util.EventListener { + public abstract class EventListenerProxy<T extends java.util.EventListener> implements java.util.EventListener { ctor public EventListenerProxy(T); method public T getListener(); } @@ -62184,7 +62206,7 @@ package java.util { field public static final int BC = 0; // 0x0 } - public class HashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class HashMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public HashMap(int, float); ctor public HashMap(int); ctor public HashMap(); @@ -62204,7 +62226,7 @@ package java.util { method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>); } - public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set { + public class HashSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set { ctor public HashSet(); ctor public HashSet(java.util.Collection<? extends E>); ctor public HashSet(int, float); @@ -62215,7 +62237,7 @@ package java.util { method public java.util.Spliterator<E> spliterator(); } - public class Hashtable extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class Hashtable<K, V> extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public Hashtable(int, float); ctor public Hashtable(int); ctor public Hashtable(); @@ -62250,7 +62272,7 @@ package java.util { method public java.util.Collection<V> values(); } - public class IdentityHashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class IdentityHashMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public IdentityHashMap(); ctor public IdentityHashMap(int); ctor public IdentityHashMap(java.util.Map<? extends K, ? extends V>); @@ -62317,14 +62339,14 @@ package java.util { ctor public InvalidPropertiesFormatException(java.lang.String); } - public abstract interface Iterator { + public abstract interface Iterator<E> { method public default void forEachRemaining(java.util.function.Consumer<? super E>); method public abstract boolean hasNext(); method public abstract E next(); method public default void remove(); } - public class LinkedHashMap extends java.util.HashMap implements java.util.Map { + public class LinkedHashMap<K, V> extends java.util.HashMap implements java.util.Map { ctor public LinkedHashMap(int, float); ctor public LinkedHashMap(int); ctor public LinkedHashMap(); @@ -62333,14 +62355,14 @@ package java.util { method protected boolean removeEldestEntry(java.util.Map.Entry<K, V>); } - public class LinkedHashSet extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set { + public class LinkedHashSet<E> extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set { ctor public LinkedHashSet(int, float); ctor public LinkedHashSet(int); ctor public LinkedHashSet(); ctor public LinkedHashSet(java.util.Collection<? extends E>); } - public class LinkedList extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable { + public class LinkedList<E> extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable { ctor public LinkedList(); ctor public LinkedList(java.util.Collection<? extends E>); method public void addFirst(E); @@ -62371,7 +62393,7 @@ package java.util { method public java.util.Spliterator<E> spliterator(); } - public abstract interface List implements java.util.Collection { + public abstract interface List<E> implements java.util.Collection { method public abstract boolean add(E); method public abstract void add(int, E); method public abstract boolean addAll(java.util.Collection<? extends E>); @@ -62398,10 +62420,10 @@ package java.util { method public default void sort(java.util.Comparator<? super E>); method public abstract java.util.List<E> subList(int, int); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract <T> T[] toArray(T[]); } - public abstract interface ListIterator implements java.util.Iterator { + public abstract interface ListIterator<E> implements java.util.Iterator { method public abstract void add(E); method public abstract boolean hasNext(); method public abstract boolean hasPrevious(); @@ -62452,8 +62474,10 @@ package java.util { method public java.util.Set<java.lang.String> getUnicodeLocaleKeys(); method public java.lang.String getUnicodeLocaleType(java.lang.String); method public java.lang.String getVariant(); + method public boolean hasExtensions(); method public static synchronized void setDefault(java.util.Locale); method public static synchronized void setDefault(java.util.Locale.Category, java.util.Locale); + method public java.util.Locale stripExtensions(); method public java.lang.String toLanguageTag(); method public final java.lang.String toString(); field public static final java.util.Locale CANADA; @@ -62518,7 +62542,7 @@ package java.util { method public final long getSum(); } - public abstract interface Map { + public abstract interface Map<K, V> { method public abstract void clear(); method public default V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public default V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>); @@ -62546,11 +62570,11 @@ package java.util { method public abstract java.util.Collection<V> values(); } - 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 static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(); - method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(java.util.Comparator<? super V>); + public static abstract interface Map.Entry<K, V> { + method public static <K extends java.lang.Comparable<? super K>, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(); + method public static <K, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(java.util.Comparator<? super K>); + method public static <K, V extends java.lang.Comparable<? super V>> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(); + method public static <K, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(java.util.Comparator<? super V>); method public abstract boolean equals(java.lang.Object); method public abstract K getKey(); method public abstract V getValue(); @@ -62574,7 +62598,7 @@ package java.util { method public java.lang.String getKey(); } - public abstract interface NavigableMap implements java.util.SortedMap { + public abstract interface NavigableMap<K, V> implements java.util.SortedMap { method public abstract java.util.Map.Entry<K, V> ceilingEntry(K); method public abstract K ceilingKey(K); method public abstract java.util.NavigableSet<K> descendingKeySet(); @@ -62598,7 +62622,7 @@ package java.util { method public abstract java.util.SortedMap<K, V> tailMap(K); } - public abstract interface NavigableSet implements java.util.SortedSet { + public abstract interface NavigableSet<E> implements java.util.SortedSet { method public abstract E ceiling(E); method public abstract java.util.Iterator<E> descendingIterator(); method public abstract java.util.NavigableSet<E> descendingSet(); @@ -62622,16 +62646,16 @@ package java.util { } public final class Objects { - method public static int compare(T, T, java.util.Comparator<? super T>); + method public static <T> int compare(T, T, java.util.Comparator<? super T>); method public static boolean deepEquals(java.lang.Object, java.lang.Object); method public static boolean equals(java.lang.Object, java.lang.Object); method public static int hash(java.lang.Object...); method public static int hashCode(java.lang.Object); method public static boolean isNull(java.lang.Object); method public static boolean nonNull(java.lang.Object); - method public static T requireNonNull(T); - method public static T requireNonNull(T, java.lang.String); - method public static T requireNonNull(T, java.util.function.Supplier<java.lang.String>); + method public static <T> T requireNonNull(T); + method public static <T> T requireNonNull(T, java.lang.String); + method public static <T> T requireNonNull(T, java.util.function.Supplier<java.lang.String>); method public static java.lang.String toString(java.lang.Object); method public static java.lang.String toString(java.lang.Object, java.lang.String); } @@ -62653,19 +62677,19 @@ package java.util { method public abstract void update(java.util.Observable, java.lang.Object); } - public final class Optional { - method public static java.util.Optional<T> empty(); + public final class Optional<T> { + method public static <T> java.util.Optional<T> empty(); method public java.util.Optional<T> filter(java.util.function.Predicate<? super T>); - method public java.util.Optional<U> flatMap(java.util.function.Function<? super T, java.util.Optional<U>>); + method public <U> java.util.Optional<U> flatMap(java.util.function.Function<? super T, java.util.Optional<U>>); method public T get(); method public void ifPresent(java.util.function.Consumer<? super T>); method public boolean isPresent(); - method public java.util.Optional<U> map(java.util.function.Function<? super T, ? extends U>); - method public static java.util.Optional<T> of(T); - method public static java.util.Optional<T> ofNullable(T); + method public <U> java.util.Optional<U> map(java.util.function.Function<? super T, ? extends U>); + method public static <T> java.util.Optional<T> of(T); + method public static <T> java.util.Optional<T> ofNullable(T); method public T orElse(T); method public T orElseGet(java.util.function.Supplier<? extends T>); - method public T orElseThrow(java.util.function.Supplier<? extends X>) throws java.lang.Throwable; + method public <X extends java.lang.Throwable> T orElseThrow(java.util.function.Supplier<? extends X>) throws java.lang.Throwable; } public final class OptionalDouble { @@ -62676,7 +62700,7 @@ package java.util { method public static java.util.OptionalDouble of(double); method public double orElse(double); method public double orElseGet(java.util.function.DoubleSupplier); - method public double orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; + method public <X extends java.lang.Throwable> double orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; } public final class OptionalInt { @@ -62687,7 +62711,7 @@ package java.util { method public static java.util.OptionalInt of(int); method public int orElse(int); method public int orElseGet(java.util.function.IntSupplier); - method public int orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; + method public <X extends java.lang.Throwable> int orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; } public final class OptionalLong { @@ -62698,10 +62722,10 @@ package java.util { method public static java.util.OptionalLong of(long); method public long orElse(long); method public long orElseGet(java.util.function.LongSupplier); - method public long orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; + method public <X extends java.lang.Throwable> long orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; } - public abstract interface PrimitiveIterator implements java.util.Iterator { + public abstract interface PrimitiveIterator<T, T_CONS> implements java.util.Iterator { method public abstract void forEachRemaining(T_CONS); } @@ -62726,7 +62750,7 @@ package java.util { method public abstract long nextLong(); } - public class PriorityQueue extends java.util.AbstractQueue implements java.io.Serializable { + public class PriorityQueue<E> extends java.util.AbstractQueue implements java.io.Serializable { ctor public PriorityQueue(); ctor public PriorityQueue(int); ctor public PriorityQueue(java.util.Comparator<? super E>); @@ -62775,7 +62799,7 @@ package java.util { method public java.lang.Object handleGetObject(java.lang.String); } - public abstract interface Queue implements java.util.Collection { + public abstract interface Queue<E> implements java.util.Collection { method public abstract boolean add(E); method public abstract E element(); method public abstract boolean offer(E); @@ -62819,6 +62843,7 @@ package java.util { method public static final void clearCache(); method public static final void clearCache(java.lang.ClassLoader); method public boolean containsKey(java.lang.String); + method public java.lang.String getBaseBundleName(); method public static final java.util.ResourceBundle getBundle(java.lang.String); method public static final java.util.ResourceBundle getBundle(java.lang.String, java.util.ResourceBundle.Control); method public static final java.util.ResourceBundle getBundle(java.lang.String, java.util.Locale); @@ -62927,15 +62952,15 @@ package java.util { ctor public ServiceConfigurationError(java.lang.String, java.lang.Throwable); } - public final class ServiceLoader implements java.lang.Iterable { + public final class ServiceLoader<S> implements java.lang.Iterable { method public java.util.Iterator<S> iterator(); - method public static java.util.ServiceLoader<S> load(java.lang.Class<S>, java.lang.ClassLoader); - method public static java.util.ServiceLoader<S> load(java.lang.Class<S>); - method public static java.util.ServiceLoader<S> loadInstalled(java.lang.Class<S>); + method public static <S> java.util.ServiceLoader<S> load(java.lang.Class<S>, java.lang.ClassLoader); + method public static <S> java.util.ServiceLoader<S> load(java.lang.Class<S>); + method public static <S> java.util.ServiceLoader<S> loadInstalled(java.lang.Class<S>); method public void reload(); } - public abstract interface Set implements java.util.Collection { + public abstract interface Set<E> implements java.util.Collection { method public abstract boolean add(E); method public abstract boolean addAll(java.util.Collection<? extends E>); method public abstract void clear(); @@ -62950,7 +62975,7 @@ package java.util { method public abstract boolean retainAll(java.util.Collection<?>); method public abstract int size(); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract <T> T[] toArray(T[]); } public class SimpleTimeZone extends java.util.TimeZone { @@ -62976,7 +63001,7 @@ package java.util { field public static final int WALL_TIME = 0; // 0x0 } - public abstract interface SortedMap implements java.util.Map { + public abstract interface SortedMap<K, V> implements java.util.Map { method public abstract java.util.Comparator<? super K> comparator(); method public abstract java.util.Set<java.util.Map.Entry<K, V>> entrySet(); method public abstract K firstKey(); @@ -62988,7 +63013,7 @@ package java.util { method public abstract java.util.Collection<V> values(); } - public abstract interface SortedSet implements java.util.Set { + public abstract interface SortedSet<E> implements java.util.Set { method public abstract java.util.Comparator<? super E> comparator(); method public abstract E first(); method public abstract java.util.SortedSet<E> headSet(E); @@ -62997,7 +63022,7 @@ package java.util { method public abstract java.util.SortedSet<E> tailSet(E); } - public abstract interface Spliterator { + public abstract interface Spliterator<T> { method public abstract int characteristics(); method public abstract long estimateSize(); method public default void forEachRemaining(java.util.function.Consumer<? super T>); @@ -63040,7 +63065,7 @@ package java.util { method public abstract java.util.Spliterator.OfLong trySplit(); } - public static abstract interface Spliterator.OfPrimitive implements java.util.Spliterator { + public static abstract interface Spliterator.OfPrimitive<T, T_CONS, T_SPLITR extends java.util.Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>> implements java.util.Spliterator { method public default void forEachRemaining(T_CONS); method public abstract boolean tryAdvance(T_CONS); method public abstract T_SPLITR trySplit(); @@ -63050,25 +63075,25 @@ package java.util { 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 <T> java.util.Spliterator<T> emptySpliterator(); + method public static <T> 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 <T> java.util.Spliterator<T> spliterator(java.lang.Object[], int); + method public static <T> 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 <T> java.util.Spliterator<T> spliterator(java.util.Collection<? extends T>, int); + method public static <T> 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 <T> 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); @@ -63095,7 +63120,7 @@ package java.util { method public java.util.Spliterator.OfLong trySplit(); } - public static abstract class Spliterators.AbstractSpliterator implements java.util.Spliterator { + public static abstract class Spliterators.AbstractSpliterator<T> implements java.util.Spliterator { ctor protected Spliterators.AbstractSpliterator(long, int); method public int characteristics(); method public long estimateSize(); @@ -63130,7 +63155,7 @@ package java.util { method public java.util.SplittableRandom split(); } - public class Stack extends java.util.Vector { + public class Stack<E> extends java.util.Vector { ctor public Stack(); method public boolean empty(); method public synchronized E peek(); @@ -63214,7 +63239,7 @@ package java.util { ctor public TooManyListenersException(java.lang.String); } - public class TreeMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable { + public class TreeMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable { ctor public TreeMap(); ctor public TreeMap(java.util.Comparator<? super K>); ctor public TreeMap(java.util.Map<? extends K, ? extends V>); @@ -63251,7 +63276,7 @@ package java.util { method public java.util.SortedMap<K, V> tailMap(K); } - public class TreeSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { + public class TreeSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { ctor public TreeSet(); ctor public TreeSet(java.util.Comparator<? super E>); ctor public TreeSet(java.util.Collection<? extends E>); @@ -63304,7 +63329,7 @@ package java.util { method public java.lang.String getFlags(); } - public class Vector extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { + public class Vector<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public Vector(int, int); ctor public Vector(int); ctor public Vector(); @@ -63339,7 +63364,7 @@ package java.util { field protected java.lang.Object[] elementData; } - public class WeakHashMap extends java.util.AbstractMap implements java.util.Map { + public class WeakHashMap<K, V> extends java.util.AbstractMap implements java.util.Map { ctor public WeakHashMap(int, float); ctor public WeakHashMap(int); ctor public WeakHashMap(); @@ -63355,18 +63380,18 @@ package java.util.concurrent { public abstract class AbstractExecutorService implements java.util.concurrent.ExecutorService { ctor public AbstractExecutorService(); - method public java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException; - method public java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; - method public T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; - method protected java.util.concurrent.RunnableFuture<T> newTaskFor(java.lang.Runnable, T); - method protected java.util.concurrent.RunnableFuture<T> newTaskFor(java.util.concurrent.Callable<T>); + method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException; + method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; + method public <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; + method protected <T> java.util.concurrent.RunnableFuture<T> newTaskFor(java.lang.Runnable, T); + method protected <T> java.util.concurrent.RunnableFuture<T> newTaskFor(java.util.concurrent.Callable<T>); method public java.util.concurrent.Future<?> submit(java.lang.Runnable); - method public java.util.concurrent.Future<T> submit(java.lang.Runnable, T); - method public java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>); + method public <T> java.util.concurrent.Future<T> submit(java.lang.Runnable, T); + method public <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>); } - public class ArrayBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class ArrayBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public ArrayBlockingQueue(int); ctor public ArrayBlockingQueue(int, boolean); ctor public ArrayBlockingQueue(int, boolean, java.util.Collection<? extends E>); @@ -63385,7 +63410,7 @@ package java.util.concurrent { method public E take() throws java.lang.InterruptedException; } - public abstract interface BlockingDeque implements java.util.concurrent.BlockingQueue java.util.Deque { + public abstract interface BlockingDeque<E> implements java.util.concurrent.BlockingQueue java.util.Deque { method public abstract boolean add(E); method public abstract void addFirst(E); method public abstract void addLast(E); @@ -63417,7 +63442,7 @@ package java.util.concurrent { method public abstract E takeLast() throws java.lang.InterruptedException; } - public abstract interface BlockingQueue implements java.util.Queue { + public abstract interface BlockingQueue<E> implements java.util.Queue { method public abstract boolean add(E); method public abstract boolean contains(java.lang.Object); method public abstract int drainTo(java.util.Collection<? super E>); @@ -63436,7 +63461,7 @@ package java.util.concurrent { ctor public BrokenBarrierException(java.lang.String); } - public abstract interface Callable { + public abstract interface Callable<V> { method public abstract V call() throws java.lang.Exception; } @@ -63445,28 +63470,28 @@ package java.util.concurrent { ctor public CancellationException(java.lang.String); } - public class CompletableFuture implements java.util.concurrent.CompletionStage java.util.concurrent.Future { + public class CompletableFuture<T> implements java.util.concurrent.CompletionStage java.util.concurrent.Future { ctor public CompletableFuture(); method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor); method public static java.util.concurrent.CompletableFuture<java.lang.Void> allOf(java.util.concurrent.CompletableFuture<?>...); method public static java.util.concurrent.CompletableFuture<java.lang.Object> anyOf(java.util.concurrent.CompletableFuture<?>...); - method public java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); - method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); - method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); + method public <U> java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public <U> java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public <U> java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); method public boolean cancel(boolean); method public boolean complete(T); method public boolean completeExceptionally(java.lang.Throwable); - method public static java.util.concurrent.CompletableFuture<U> completedFuture(U); + method public static <U> java.util.concurrent.CompletableFuture<U> completedFuture(U); method public java.util.concurrent.CompletableFuture<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>); method public T get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; method public T get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; method public T getNow(T); method public int getNumberOfDependents(); - method public java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); - method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); - method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); + method public <U> java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public <U> java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public <U> java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); method public boolean isCancelled(); method public boolean isCompletedExceptionally(); method public boolean isDone(); @@ -63481,23 +63506,23 @@ package java.util.concurrent { method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable); method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable, java.util.concurrent.Executor); - method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>); - method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>, java.util.concurrent.Executor); + method public static <U> java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>); + method public static <U> java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>, java.util.concurrent.Executor); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); - method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); - method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T, ? extends U>); - method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); - method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); - method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); - method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); - method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); - method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); + method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); + method public <U> java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T, ? extends U>); + method public <U> java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); + method public <U> java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); + method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); + method public <U> java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public <U> java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public <U> java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRun(java.lang.Runnable); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); @@ -63517,7 +63542,7 @@ package java.util.concurrent { ctor public CompletionException(java.lang.Throwable); } - public abstract interface CompletionService { + public abstract interface CompletionService<V> { method public abstract java.util.concurrent.Future<V> poll(); method public abstract java.util.concurrent.Future<V> poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; method public abstract java.util.concurrent.Future<V> submit(java.util.concurrent.Callable<V>); @@ -63525,17 +63550,17 @@ package java.util.concurrent { method public abstract java.util.concurrent.Future<V> take() throws java.lang.InterruptedException; } - public abstract interface CompletionStage { + public abstract interface CompletionStage<T> { method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); - method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); - method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); + method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>); - method public abstract java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); - method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); - method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); + method public abstract <U> java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBoth(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); @@ -63545,18 +63570,18 @@ package java.util.concurrent { method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); - method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); - method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T, ? extends U>); - method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); - method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); - method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); - method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); - method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); - method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); + method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T, ? extends U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); + method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRun(java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); @@ -63566,7 +63591,7 @@ package java.util.concurrent { method public abstract java.util.concurrent.CompletionStage<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>, java.util.concurrent.Executor); } - public class ConcurrentHashMap extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable { + public class ConcurrentHashMap<K, V> extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable { ctor public ConcurrentHashMap(); ctor public ConcurrentHashMap(int); ctor public ConcurrentHashMap(java.util.Map<? extends K, ? extends V>); @@ -63580,29 +63605,29 @@ package java.util.concurrent { method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); method public void forEach(long, java.util.function.BiConsumer<? super K, ? super V>); - method public void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>); + method public <U> void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>); method public void forEachEntry(long, java.util.function.Consumer<? super java.util.Map.Entry<K, V>>); - method public void forEachEntry(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.Consumer<? super U>); + method public <U> void forEachEntry(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.Consumer<? super U>); method public void forEachKey(long, java.util.function.Consumer<? super K>); - method public void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>); + method public <U> void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>); method public void forEachValue(long, java.util.function.Consumer<? super V>); - method public void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>); + method public <U> void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>); method public V getOrDefault(java.lang.Object, V); method public java.util.concurrent.ConcurrentHashMap.KeySetView<K, V> keySet(V); method public java.util.Enumeration<K> keys(); method public long mappingCount(); method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>); - method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(); - method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int); + method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(); + method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int); method public V putIfAbsent(K, V); - method public U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public <U> U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); method public java.util.Map.Entry<K, V> reduceEntries(long, java.util.function.BiFunction<java.util.Map.Entry<K, V>, java.util.Map.Entry<K, V>, ? extends java.util.Map.Entry<K, V>>); - method public U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public <U> U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); method public double reduceEntriesToDouble(long, java.util.function.ToDoubleFunction<java.util.Map.Entry<K, V>>, double, java.util.function.DoubleBinaryOperator); method public int reduceEntriesToInt(long, java.util.function.ToIntFunction<java.util.Map.Entry<K, V>>, int, java.util.function.IntBinaryOperator); method public long reduceEntriesToLong(long, java.util.function.ToLongFunction<java.util.Map.Entry<K, V>>, long, java.util.function.LongBinaryOperator); method public K reduceKeys(long, java.util.function.BiFunction<? super K, ? super K, ? extends K>); - method public U reduceKeys(long, java.util.function.Function<? super K, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public <U> U reduceKeys(long, java.util.function.Function<? super K, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); method public double reduceKeysToDouble(long, java.util.function.ToDoubleFunction<? super K>, double, java.util.function.DoubleBinaryOperator); method public int reduceKeysToInt(long, java.util.function.ToIntFunction<? super K>, int, java.util.function.IntBinaryOperator); method public long reduceKeysToLong(long, java.util.function.ToLongFunction<? super K>, long, java.util.function.LongBinaryOperator); @@ -63610,7 +63635,7 @@ package java.util.concurrent { method public int reduceToInt(long, java.util.function.ToIntBiFunction<? super K, ? super V>, int, java.util.function.IntBinaryOperator); method public long reduceToLong(long, java.util.function.ToLongBiFunction<? super K, ? super V>, long, java.util.function.LongBinaryOperator); method public V reduceValues(long, java.util.function.BiFunction<? super V, ? super V, ? extends V>); - method public U reduceValues(long, java.util.function.Function<? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public <U> U reduceValues(long, java.util.function.Function<? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); method public double reduceValuesToDouble(long, java.util.function.ToDoubleFunction<? super V>, double, java.util.function.DoubleBinaryOperator); method public int reduceValuesToInt(long, java.util.function.ToIntFunction<? super V>, int, java.util.function.IntBinaryOperator); method public long reduceValuesToLong(long, java.util.function.ToLongFunction<? super V>, long, java.util.function.LongBinaryOperator); @@ -63618,13 +63643,13 @@ package java.util.concurrent { method public boolean replace(K, V, V); method public V replace(K, V); method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>); - method public U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>); - method public U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>); - method public U searchKeys(long, java.util.function.Function<? super K, ? extends U>); - method public U searchValues(long, java.util.function.Function<? super V, ? extends U>); + method public <U> U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>); + method public <U> U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>); + method public <U> U searchKeys(long, java.util.function.Function<? super K, ? extends U>); + method public <U> U searchValues(long, java.util.function.Function<? super V, ? extends U>); } - static abstract class ConcurrentHashMap.CollectionView implements java.util.Collection java.io.Serializable { + static abstract class ConcurrentHashMap.CollectionView<K, V, E> implements java.util.Collection java.io.Serializable { method public final void clear(); method public abstract boolean contains(java.lang.Object); method public final boolean containsAll(java.util.Collection<?>); @@ -63636,11 +63661,11 @@ package java.util.concurrent { method public final boolean retainAll(java.util.Collection<?>); method public final int size(); method public final java.lang.Object[] toArray(); - method public final T[] toArray(T[]); + method public final <T> T[] toArray(T[]); method public final java.lang.String toString(); } - public static class ConcurrentHashMap.KeySetView extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set { + public static class ConcurrentHashMap.KeySetView<K, V> extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set { method public boolean add(K); method public boolean addAll(java.util.Collection<? extends K>); method public boolean contains(java.lang.Object); @@ -63651,7 +63676,7 @@ package java.util.concurrent { method public java.util.Spliterator<K> spliterator(); } - public class ConcurrentLinkedDeque extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable { + public class ConcurrentLinkedDeque<E> extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable { ctor public ConcurrentLinkedDeque(); ctor public ConcurrentLinkedDeque(java.util.Collection<? extends E>); method public void addFirst(E); @@ -63681,7 +63706,7 @@ package java.util.concurrent { method public java.util.Spliterator<E> spliterator(); } - public class ConcurrentLinkedQueue extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable { + public class ConcurrentLinkedQueue<E> extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable { ctor public ConcurrentLinkedQueue(); ctor public ConcurrentLinkedQueue(java.util.Collection<? extends E>); method public java.util.Iterator<E> iterator(); @@ -63692,14 +63717,14 @@ package java.util.concurrent { method public java.util.Spliterator<E> spliterator(); } - public abstract interface ConcurrentMap implements java.util.Map { + public abstract interface ConcurrentMap<K, V> implements java.util.Map { method public abstract V putIfAbsent(K, V); method public abstract boolean remove(java.lang.Object, java.lang.Object); method public abstract boolean replace(K, V, V); method public abstract V replace(K, V); } - public abstract interface ConcurrentNavigableMap implements java.util.concurrent.ConcurrentMap java.util.NavigableMap { + public abstract interface ConcurrentNavigableMap<K, V> implements java.util.concurrent.ConcurrentMap java.util.NavigableMap { method public abstract java.util.NavigableSet<K> descendingKeySet(); method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> descendingMap(); method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K, boolean); @@ -63712,7 +63737,7 @@ package java.util.concurrent { method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K); } - public class ConcurrentSkipListMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable { + public class ConcurrentSkipListMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable { ctor public ConcurrentSkipListMap(); ctor public ConcurrentSkipListMap(java.util.Comparator<? super K>); ctor public ConcurrentSkipListMap(java.util.Map<? extends K, ? extends V>); @@ -63756,7 +63781,7 @@ package java.util.concurrent { method public java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K); } - public class ConcurrentSkipListSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { + public class ConcurrentSkipListSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { ctor public ConcurrentSkipListSet(); ctor public ConcurrentSkipListSet(java.util.Comparator<? super E>); ctor public ConcurrentSkipListSet(java.util.Collection<? extends E>); @@ -63784,7 +63809,7 @@ package java.util.concurrent { method public java.util.NavigableSet<E> tailSet(E); } - public class CopyOnWriteArrayList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { + public class CopyOnWriteArrayList<E> implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public CopyOnWriteArrayList(); ctor public CopyOnWriteArrayList(java.util.Collection<? extends E>); ctor public CopyOnWriteArrayList(E[]); @@ -63816,10 +63841,10 @@ package java.util.concurrent { method public int size(); method public java.util.List<E> subList(int, int); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public <T> T[] toArray(T[]); } - public class CopyOnWriteArraySet extends java.util.AbstractSet implements java.io.Serializable { + public class CopyOnWriteArraySet<E> extends java.util.AbstractSet implements java.io.Serializable { ctor public CopyOnWriteArraySet(); ctor public CopyOnWriteArraySet(java.util.Collection<? extends E>); method public void forEach(java.util.function.Consumer<? super E>); @@ -63837,7 +63862,7 @@ package java.util.concurrent { method public long getCount(); } - public abstract class CountedCompleter extends java.util.concurrent.ForkJoinTask { + public abstract class CountedCompleter<T> extends java.util.concurrent.ForkJoinTask { ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>, int); ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>); ctor protected CountedCompleter(); @@ -63874,7 +63899,7 @@ package java.util.concurrent { method public void reset(); } - public class DelayQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue { + public class DelayQueue<E extends java.util.concurrent.Delayed> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue { ctor public DelayQueue(); ctor public DelayQueue(java.util.Collection<? extends E>); method public int drainTo(java.util.Collection<? super E>); @@ -63895,7 +63920,7 @@ package java.util.concurrent { method public abstract long getDelay(java.util.concurrent.TimeUnit); } - public class Exchanger { + public class Exchanger<V> { ctor public Exchanger(); method public V exchange(V) throws java.lang.InterruptedException; method public V exchange(V, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException, java.util.concurrent.TimeoutException; @@ -63912,7 +63937,7 @@ package java.util.concurrent { method public abstract void execute(java.lang.Runnable); } - public class ExecutorCompletionService implements java.util.concurrent.CompletionService { + public class ExecutorCompletionService<V> implements java.util.concurrent.CompletionService { ctor public ExecutorCompletionService(java.util.concurrent.Executor); ctor public ExecutorCompletionService(java.util.concurrent.Executor, java.util.concurrent.BlockingQueue<java.util.concurrent.Future<V>>); method public java.util.concurrent.Future<V> poll(); @@ -63924,21 +63949,21 @@ package java.util.concurrent { public abstract interface ExecutorService implements java.util.concurrent.Executor { method public abstract boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public abstract java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException; - method public abstract java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public abstract T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; - method public abstract T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; + method public abstract <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException; + method public abstract <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public abstract <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; + method public abstract <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; method public abstract boolean isShutdown(); method public abstract boolean isTerminated(); method public abstract void shutdown(); method public abstract java.util.List<java.lang.Runnable> shutdownNow(); - method public abstract java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>); - method public abstract java.util.concurrent.Future<T> submit(java.lang.Runnable, T); + method public abstract <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>); + method public abstract <T> java.util.concurrent.Future<T> submit(java.lang.Runnable, T); method public abstract java.util.concurrent.Future<?> submit(java.lang.Runnable); } public class Executors { - method public static java.util.concurrent.Callable<T> callable(java.lang.Runnable, T); + method public static <T> java.util.concurrent.Callable<T> callable(java.lang.Runnable, T); method public static java.util.concurrent.Callable<java.lang.Object> callable(java.lang.Runnable); method public static java.util.concurrent.Callable<java.lang.Object> callable(java.security.PrivilegedAction<?>); method public static java.util.concurrent.Callable<java.lang.Object> callable(java.security.PrivilegedExceptionAction<?>); @@ -63955,8 +63980,8 @@ package java.util.concurrent { method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor(java.util.concurrent.ThreadFactory); method public static java.util.concurrent.ExecutorService newWorkStealingPool(int); method public static java.util.concurrent.ExecutorService newWorkStealingPool(); - method public static java.util.concurrent.Callable<T> privilegedCallable(java.util.concurrent.Callable<T>); - method public static java.util.concurrent.Callable<T> privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable<T>); + method public static <T> java.util.concurrent.Callable<T> privilegedCallable(java.util.concurrent.Callable<T>); + method public static <T> java.util.concurrent.Callable<T> privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable<T>); method public static java.util.concurrent.ThreadFactory privilegedThreadFactory(); method public static java.util.concurrent.ExecutorService unconfigurableExecutorService(java.util.concurrent.ExecutorService); method public static java.util.concurrent.ScheduledExecutorService unconfigurableScheduledExecutorService(java.util.concurrent.ScheduledExecutorService); @@ -63984,7 +64009,7 @@ package java.util.concurrent { method public long getStealCount(); method public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler(); method public boolean hasQueuedSubmissions(); - method public T invoke(java.util.concurrent.ForkJoinTask<T>); + method public <T> T invoke(java.util.concurrent.ForkJoinTask<T>); method public boolean isQuiescent(); method public boolean isShutdown(); method public boolean isTerminated(); @@ -63993,7 +64018,7 @@ package java.util.concurrent { method protected java.util.concurrent.ForkJoinTask<?> pollSubmission(); method public void shutdown(); method public java.util.List<java.lang.Runnable> shutdownNow(); - method public java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.ForkJoinTask<T>); + method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.ForkJoinTask<T>); field public static final java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory; } @@ -64006,11 +64031,11 @@ package java.util.concurrent { method public abstract boolean isReleasable(); } - public abstract class ForkJoinTask implements java.util.concurrent.Future java.io.Serializable { + public abstract class ForkJoinTask<V> implements java.util.concurrent.Future java.io.Serializable { ctor public ForkJoinTask(); method public static java.util.concurrent.ForkJoinTask<?> adapt(java.lang.Runnable); - method public static java.util.concurrent.ForkJoinTask<T> adapt(java.lang.Runnable, T); - method public static java.util.concurrent.ForkJoinTask<T> adapt(java.util.concurrent.Callable<? extends T>); + method public static <T> java.util.concurrent.ForkJoinTask<T> adapt(java.lang.Runnable, T); + method public static <T> java.util.concurrent.ForkJoinTask<T> adapt(java.util.concurrent.Callable<? extends T>); method public boolean cancel(boolean); method public final boolean compareAndSetForkJoinTaskTag(short, short); method public void complete(V); @@ -64030,7 +64055,7 @@ package java.util.concurrent { method public final V invoke(); method public static void invokeAll(java.util.concurrent.ForkJoinTask<?>, java.util.concurrent.ForkJoinTask<?>); method public static void invokeAll(java.util.concurrent.ForkJoinTask<?>...); - method public static java.util.Collection<T> invokeAll(java.util.Collection<T>); + method public static <T extends java.util.concurrent.ForkJoinTask<?>> java.util.Collection<T> invokeAll(java.util.Collection<T>); method public final boolean isCancelled(); method public final boolean isCompletedAbnormally(); method public final boolean isCompletedNormally(); @@ -64056,7 +64081,7 @@ package java.util.concurrent { method protected void onTermination(java.lang.Throwable); } - public abstract interface Future { + public abstract interface Future<V> { method public abstract boolean cancel(boolean); method public abstract V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; method public abstract V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; @@ -64064,7 +64089,7 @@ package java.util.concurrent { method public abstract boolean isDone(); } - public class FutureTask implements java.util.concurrent.RunnableFuture { + public class FutureTask<V> implements java.util.concurrent.RunnableFuture { ctor public FutureTask(java.util.concurrent.Callable<V>); ctor public FutureTask(java.lang.Runnable, V); method public boolean cancel(boolean); @@ -64079,7 +64104,7 @@ package java.util.concurrent { method protected void setException(java.lang.Throwable); } - public class LinkedBlockingDeque extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable { + public class LinkedBlockingDeque<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable { ctor public LinkedBlockingDeque(); ctor public LinkedBlockingDeque(int); ctor public LinkedBlockingDeque(java.util.Collection<? extends E>); @@ -64123,7 +64148,7 @@ package java.util.concurrent { method public E takeLast() throws java.lang.InterruptedException; } - public class LinkedBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class LinkedBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public LinkedBlockingQueue(); ctor public LinkedBlockingQueue(int); ctor public LinkedBlockingQueue(java.util.Collection<? extends E>); @@ -64142,7 +64167,7 @@ package java.util.concurrent { method public E take() throws java.lang.InterruptedException; } - public class LinkedTransferQueue extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue { + public class LinkedTransferQueue<E> extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue { ctor public LinkedTransferQueue(); ctor public LinkedTransferQueue(java.util.Collection<? extends E>); method public int drainTo(java.util.Collection<? super E>); @@ -64189,7 +64214,7 @@ package java.util.concurrent { method public int register(); } - public class PriorityBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class PriorityBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public PriorityBlockingQueue(); ctor public PriorityBlockingQueue(int); ctor public PriorityBlockingQueue(int, java.util.Comparator<? super E>); @@ -64218,7 +64243,7 @@ package java.util.concurrent { method protected final void setRawResult(java.lang.Void); } - public abstract class RecursiveTask extends java.util.concurrent.ForkJoinTask { + public abstract class RecursiveTask<V> extends java.util.concurrent.ForkJoinTask { ctor public RecursiveTask(); method protected abstract V compute(); method protected final boolean exec(); @@ -64237,22 +64262,22 @@ package java.util.concurrent { method public abstract void rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor); } - public abstract interface RunnableFuture implements java.util.concurrent.Future java.lang.Runnable { + public abstract interface RunnableFuture<V> implements java.util.concurrent.Future java.lang.Runnable { method public abstract void run(); } - public abstract interface RunnableScheduledFuture implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture { + public abstract interface RunnableScheduledFuture<V> implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture { method public abstract boolean isPeriodic(); } public abstract interface ScheduledExecutorService implements java.util.concurrent.ExecutorService { method public abstract java.util.concurrent.ScheduledFuture<?> schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit); - method public abstract java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit); + method public abstract <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit); method public abstract java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public abstract java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); } - public abstract interface ScheduledFuture implements java.util.concurrent.Delayed java.util.concurrent.Future { + public abstract interface ScheduledFuture<V> implements java.util.concurrent.Delayed java.util.concurrent.Future { } public class ScheduledThreadPoolExecutor extends java.util.concurrent.ThreadPoolExecutor implements java.util.concurrent.ScheduledExecutorService { @@ -64260,13 +64285,13 @@ package java.util.concurrent { ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory); ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.RejectedExecutionHandler); ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory, java.util.concurrent.RejectedExecutionHandler); - method protected java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture<V>); - method protected java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.util.concurrent.Callable<V>, java.util.concurrent.RunnableScheduledFuture<V>); + method protected <V> java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture<V>); + method protected <V> java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.util.concurrent.Callable<V>, java.util.concurrent.RunnableScheduledFuture<V>); method public boolean getContinueExistingPeriodicTasksAfterShutdownPolicy(); method public boolean getExecuteExistingDelayedTasksAfterShutdownPolicy(); method public boolean getRemoveOnCancelPolicy(); method public java.util.concurrent.ScheduledFuture<?> schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit); - method public java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit); + method public <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit); method public java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean); @@ -64296,7 +64321,7 @@ package java.util.concurrent { method public boolean tryAcquire(int, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; } - public class SynchronousQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class SynchronousQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public SynchronousQueue(); ctor public SynchronousQueue(boolean); method public int drainTo(java.util.Collection<? super E>); @@ -64414,7 +64439,7 @@ package java.util.concurrent { ctor public TimeoutException(java.lang.String); } - public abstract interface TransferQueue implements java.util.concurrent.BlockingQueue { + public abstract interface TransferQueue<E> implements java.util.concurrent.BlockingQueue { method public abstract int getWaitingConsumerCount(); method public abstract boolean hasWaitingConsumer(); method public abstract void transfer(E) throws java.lang.InterruptedException; @@ -64484,7 +64509,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, int, int); } - public abstract class AtomicIntegerFieldUpdater { + public abstract class AtomicIntegerFieldUpdater<T> { ctor protected AtomicIntegerFieldUpdater(); method public final int accumulateAndGet(T, int, java.util.function.IntBinaryOperator); method public int addAndGet(T, int); @@ -64499,7 +64524,7 @@ package java.util.concurrent.atomic { method public final int getAndUpdate(T, java.util.function.IntUnaryOperator); method public int incrementAndGet(T); method public abstract void lazySet(T, int); - method public static java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); + method public static <U> java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); method public abstract void set(T, int); method public final int updateAndGet(T, java.util.function.IntUnaryOperator); method public abstract boolean weakCompareAndSet(T, int, int); @@ -64552,7 +64577,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, long, long); } - public abstract class AtomicLongFieldUpdater { + public abstract class AtomicLongFieldUpdater<T> { ctor protected AtomicLongFieldUpdater(); method public final long accumulateAndGet(T, long, java.util.function.LongBinaryOperator); method public long addAndGet(T, long); @@ -64567,13 +64592,13 @@ package java.util.concurrent.atomic { method public final long getAndUpdate(T, java.util.function.LongUnaryOperator); method public long incrementAndGet(T); method public abstract void lazySet(T, long); - method public static java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); + method public static <U> java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); method public abstract void set(T, long); method public final long updateAndGet(T, java.util.function.LongUnaryOperator); method public abstract boolean weakCompareAndSet(T, long, long); } - public class AtomicMarkableReference { + public class AtomicMarkableReference<V> { ctor public AtomicMarkableReference(V, boolean); method public boolean attemptMark(V, boolean); method public boolean compareAndSet(V, V, boolean, boolean); @@ -64584,7 +64609,7 @@ package java.util.concurrent.atomic { method public boolean weakCompareAndSet(V, V, boolean, boolean); } - public class AtomicReference implements java.io.Serializable { + public class AtomicReference<V> implements java.io.Serializable { ctor public AtomicReference(V); ctor public AtomicReference(); method public final V accumulateAndGet(V, java.util.function.BinaryOperator<V>); @@ -64599,7 +64624,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(V, V); } - public class AtomicReferenceArray implements java.io.Serializable { + public class AtomicReferenceArray<E> implements java.io.Serializable { ctor public AtomicReferenceArray(int); ctor public AtomicReferenceArray(E[]); method public final E accumulateAndGet(int, E, java.util.function.BinaryOperator<E>); @@ -64615,7 +64640,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, E, E); } - public abstract class AtomicReferenceFieldUpdater { + public abstract class AtomicReferenceFieldUpdater<T, V> { ctor protected AtomicReferenceFieldUpdater(); method public final V accumulateAndGet(T, V, java.util.function.BinaryOperator<V>); method public abstract boolean compareAndSet(T, V, V); @@ -64624,13 +64649,13 @@ package java.util.concurrent.atomic { method public V getAndSet(T, V); method public final V getAndUpdate(T, java.util.function.UnaryOperator<V>); method public abstract void lazySet(T, V); - method public static java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U, W> newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String); + method public static <U, W> java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U, W> newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String); method public abstract void set(T, V); method public final V updateAndGet(T, java.util.function.UnaryOperator<V>); method public abstract boolean weakCompareAndSet(T, V, V); } - public class AtomicStampedReference { + public class AtomicStampedReference<V> { ctor public AtomicStampedReference(V, int); method public boolean attemptStamp(V, int); method public boolean compareAndSet(V, V, int, int); @@ -64933,33 +64958,33 @@ package java.util.concurrent.locks { package java.util.function { - public abstract interface BiConsumer { + public abstract interface BiConsumer<T, U> { method public abstract void accept(T, U); method public default java.util.function.BiConsumer<T, U> andThen(java.util.function.BiConsumer<? super T, ? super U>); } - public abstract interface BiFunction { - method public default java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>); + public abstract interface BiFunction<T, U, R> { + method public default <V> java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>); method public abstract R apply(T, U); } - public abstract interface BiPredicate { + public abstract interface BiPredicate<T, U> { method public default java.util.function.BiPredicate<T, U> and(java.util.function.BiPredicate<? super T, ? super U>); method public default java.util.function.BiPredicate<T, U> negate(); method public default java.util.function.BiPredicate<T, U> or(java.util.function.BiPredicate<? super T, ? super U>); method public abstract boolean test(T, U); } - public abstract interface BinaryOperator implements java.util.function.BiFunction { - method public static java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>); - method public static java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>); + public abstract interface BinaryOperator<T> implements java.util.function.BiFunction { + method public static <T> java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>); + method public static <T> java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>); } public abstract interface BooleanSupplier { method public abstract boolean getAsBoolean(); } - public abstract interface Consumer { + public abstract interface Consumer<T> { method public abstract void accept(T); method public default java.util.function.Consumer<T> andThen(java.util.function.Consumer<? super T>); } @@ -64973,7 +64998,7 @@ package java.util.function { method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer); } - public abstract interface DoubleFunction { + public abstract interface DoubleFunction<R> { method public abstract R apply(double); } @@ -65003,11 +65028,11 @@ package java.util.function { method public static java.util.function.DoubleUnaryOperator identity(); } - public abstract interface Function { - method public default java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>); + public abstract interface Function<T, R> { + method public default <V> java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>); method public abstract R apply(T); - method public default java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>); - method public static java.util.function.Function<T, T> identity(); + method public default <V> java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>); + method public static <T> java.util.function.Function<T, T> identity(); } public abstract interface IntBinaryOperator { @@ -65019,7 +65044,7 @@ package java.util.function { method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer); } - public abstract interface IntFunction { + public abstract interface IntFunction<R> { method public abstract R apply(int); } @@ -65058,7 +65083,7 @@ package java.util.function { method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer); } - public abstract interface LongFunction { + public abstract interface LongFunction<R> { method public abstract R apply(long); } @@ -65088,56 +65113,56 @@ package java.util.function { method public static java.util.function.LongUnaryOperator identity(); } - public abstract interface ObjDoubleConsumer { + public abstract interface ObjDoubleConsumer<T> { method public abstract void accept(T, double); } - public abstract interface ObjIntConsumer { + public abstract interface ObjIntConsumer<T> { method public abstract void accept(T, int); } - public abstract interface ObjLongConsumer { + public abstract interface ObjLongConsumer<T> { method public abstract void accept(T, long); } - public abstract interface Predicate { + public abstract interface Predicate<T> { method public default java.util.function.Predicate<T> and(java.util.function.Predicate<? super T>); - method public static java.util.function.Predicate<T> isEqual(java.lang.Object); + method public static <T> java.util.function.Predicate<T> isEqual(java.lang.Object); method public default java.util.function.Predicate<T> negate(); method public default java.util.function.Predicate<T> or(java.util.function.Predicate<? super T>); method public abstract boolean test(T); } - public abstract interface Supplier { + public abstract interface Supplier<T> { method public abstract T get(); } - public abstract interface ToDoubleBiFunction { + public abstract interface ToDoubleBiFunction<T, U> { method public abstract double applyAsDouble(T, U); } - public abstract interface ToDoubleFunction { + public abstract interface ToDoubleFunction<T> { method public abstract double applyAsDouble(T); } - public abstract interface ToIntBiFunction { + public abstract interface ToIntBiFunction<T, U> { method public abstract int applyAsInt(T, U); } - public abstract interface ToIntFunction { + public abstract interface ToIntFunction<T> { method public abstract int applyAsInt(T); } - public abstract interface ToLongBiFunction { + public abstract interface ToLongBiFunction<T, U> { method public abstract long applyAsLong(T, U); } - public abstract interface ToLongFunction { + public abstract interface ToLongFunction<T> { method public abstract long applyAsLong(T); } - public abstract interface UnaryOperator implements java.util.function.Function { - method public static java.util.function.UnaryOperator<T> identity(); + public abstract interface UnaryOperator<T> implements java.util.function.Function { + method public static <T> java.util.function.UnaryOperator<T> identity(); } } @@ -65725,7 +65750,7 @@ package java.util.regex { package java.util.stream { - public abstract interface BaseStream implements java.lang.AutoCloseable { + public abstract interface BaseStream<T, S extends java.util.stream.BaseStream<T, S>> implements java.lang.AutoCloseable { method public abstract void close(); method public abstract boolean isParallel(); method public abstract java.util.Iterator<T> iterator(); @@ -65736,13 +65761,13 @@ package java.util.stream { method public abstract S unordered(); } - public abstract interface Collector { + public abstract interface Collector<T, A, R> { method public abstract java.util.function.BiConsumer<A, T> accumulator(); method public abstract java.util.Set<java.util.stream.Collector.Characteristics> characteristics(); method public abstract java.util.function.BinaryOperator<A> combiner(); method public abstract java.util.function.Function<A, R> finisher(); - method public static java.util.stream.Collector<T, R, R> of(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, T>, java.util.function.BinaryOperator<R>, java.util.stream.Collector.Characteristics...); - method public static java.util.stream.Collector<T, A, R> of(java.util.function.Supplier<A>, java.util.function.BiConsumer<A, T>, java.util.function.BinaryOperator<A>, java.util.function.Function<A, R>, java.util.stream.Collector.Characteristics...); + method public static <T, R> java.util.stream.Collector<T, R, R> of(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, T>, java.util.function.BinaryOperator<R>, java.util.stream.Collector.Characteristics...); + method public static <T, A, R> java.util.stream.Collector<T, A, R> of(java.util.function.Supplier<A>, java.util.function.BiConsumer<A, T>, java.util.function.BinaryOperator<A>, java.util.function.Function<A, R>, java.util.stream.Collector.Characteristics...); method public abstract java.util.function.Supplier<A> supplier(); } @@ -65755,43 +65780,43 @@ package java.util.stream { } public final class Collectors { - method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingDouble(java.util.function.ToDoubleFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingInt(java.util.function.ToIntFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingLong(java.util.function.ToLongFunction<? super T>); - method public static java.util.stream.Collector<T, A, RR> collectingAndThen(java.util.stream.Collector<T, A, R>, java.util.function.Function<R, RR>); - method public static java.util.stream.Collector<T, ?, java.lang.Long> counting(); - method public static java.util.stream.Collector<T, ?, java.util.Map<K, java.util.List<T>>> groupingBy(java.util.function.Function<? super T, ? extends K>); - method public static java.util.stream.Collector<T, ?, java.util.Map<K, D>> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>); - method public static java.util.stream.Collector<T, ?, M> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>); - method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, java.util.List<T>>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>); - method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, D>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>); - method public static java.util.stream.Collector<T, ?, M> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingDouble(java.util.function.ToDoubleFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingInt(java.util.function.ToIntFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingLong(java.util.function.ToLongFunction<? super T>); + method public static <T, A, R, RR> java.util.stream.Collector<T, A, RR> collectingAndThen(java.util.stream.Collector<T, A, R>, java.util.function.Function<R, RR>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Long> counting(); + method public static <T, K> java.util.stream.Collector<T, ?, java.util.Map<K, java.util.List<T>>> groupingBy(java.util.function.Function<? super T, ? extends K>); + method public static <T, K, A, D> java.util.stream.Collector<T, ?, java.util.Map<K, D>> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>); + method public static <T, K, D, A, M extends java.util.Map<K, D>> java.util.stream.Collector<T, ?, M> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>); + method public static <T, K> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, java.util.List<T>>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>); + method public static <T, K, A, D> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, D>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>); + method public static <T, K, A, D, M extends java.util.concurrent.ConcurrentMap<K, D>> java.util.stream.Collector<T, ?, M> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>); method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(); method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(java.lang.CharSequence); method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(java.lang.CharSequence, java.lang.CharSequence, java.lang.CharSequence); - method public static java.util.stream.Collector<T, ?, R> mapping(java.util.function.Function<? super T, ? extends U>, java.util.stream.Collector<? super U, A, R>); - method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> maxBy(java.util.Comparator<? super T>); - method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> minBy(java.util.Comparator<? super T>); - method public static java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, java.util.List<T>>> partitioningBy(java.util.function.Predicate<? super T>); - method public static java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, D>> partitioningBy(java.util.function.Predicate<? super T>, java.util.stream.Collector<? super T, A, D>); - method public static java.util.stream.Collector<T, ?, T> reducing(T, java.util.function.BinaryOperator<T>); - method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> reducing(java.util.function.BinaryOperator<T>); - method public static java.util.stream.Collector<T, ?, U> reducing(U, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); - method public static java.util.stream.Collector<T, ?, java.util.DoubleSummaryStatistics> summarizingDouble(java.util.function.ToDoubleFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.util.IntSummaryStatistics> summarizingInt(java.util.function.ToIntFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.util.LongSummaryStatistics> summarizingLong(java.util.function.ToLongFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.lang.Double> summingDouble(java.util.function.ToDoubleFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.lang.Integer> summingInt(java.util.function.ToIntFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.lang.Long> summingLong(java.util.function.ToLongFunction<? super T>); - method public static java.util.stream.Collector<T, ?, C> toCollection(java.util.function.Supplier<C>); - method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>); - method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); - method public static java.util.stream.Collector<T, ?, M> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>); - method public static java.util.stream.Collector<T, ?, java.util.List<T>> toList(); - method public static java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>); - method public static java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); - method public static java.util.stream.Collector<T, ?, M> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>); - method public static java.util.stream.Collector<T, ?, java.util.Set<T>> toSet(); + method public static <T, U, A, R> java.util.stream.Collector<T, ?, R> mapping(java.util.function.Function<? super T, ? extends U>, java.util.stream.Collector<? super U, A, R>); + method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> maxBy(java.util.Comparator<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> minBy(java.util.Comparator<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, java.util.List<T>>> partitioningBy(java.util.function.Predicate<? super T>); + method public static <T, D, A> java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, D>> partitioningBy(java.util.function.Predicate<? super T>, java.util.stream.Collector<? super T, A, D>); + method public static <T> java.util.stream.Collector<T, ?, T> reducing(T, java.util.function.BinaryOperator<T>); + method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> reducing(java.util.function.BinaryOperator<T>); + method public static <T, U> java.util.stream.Collector<T, ?, U> reducing(U, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); + method public static <T> java.util.stream.Collector<T, ?, java.util.DoubleSummaryStatistics> summarizingDouble(java.util.function.ToDoubleFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.util.IntSummaryStatistics> summarizingInt(java.util.function.ToIntFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.util.LongSummaryStatistics> summarizingLong(java.util.function.ToLongFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> summingDouble(java.util.function.ToDoubleFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Integer> summingInt(java.util.function.ToIntFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Long> summingLong(java.util.function.ToLongFunction<? super T>); + method public static <T, C extends java.util.Collection<T>> java.util.stream.Collector<T, ?, C> toCollection(java.util.function.Supplier<C>); + method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>); + method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); + method public static <T, K, U, M extends java.util.concurrent.ConcurrentMap<K, U>> java.util.stream.Collector<T, ?, M> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>); + method public static <T> java.util.stream.Collector<T, ?, java.util.List<T>> toList(); + method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>); + method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); + method public static <T, K, U, M extends java.util.Map<K, U>> java.util.stream.Collector<T, ?, M> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>); + method public static <T> java.util.stream.Collector<T, ?, java.util.Set<T>> toSet(); } public abstract interface DoubleStream implements java.util.stream.BaseStream { @@ -65800,7 +65825,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream<java.lang.Double> boxed(); method public static java.util.stream.DoubleStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjDoubleConsumer<R>, java.util.function.BiConsumer<R, R>); + method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjDoubleConsumer<R>, java.util.function.BiConsumer<R, R>); method public static java.util.stream.DoubleStream concat(java.util.stream.DoubleStream, java.util.stream.DoubleStream); method public abstract long count(); method public abstract java.util.stream.DoubleStream distinct(); @@ -65818,7 +65843,7 @@ package java.util.stream { method public abstract java.util.stream.DoubleStream map(java.util.function.DoubleUnaryOperator); method public abstract java.util.stream.IntStream mapToInt(java.util.function.DoubleToIntFunction); method public abstract java.util.stream.LongStream mapToLong(java.util.function.DoubleToLongFunction); - method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.DoubleFunction<? extends U>); + method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.DoubleFunction<? extends U>); method public abstract java.util.OptionalDouble max(); method public abstract java.util.OptionalDouble min(); method public abstract boolean noneMatch(java.util.function.DoublePredicate); @@ -65851,7 +65876,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream<java.lang.Integer> boxed(); method public static java.util.stream.IntStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjIntConsumer<R>, java.util.function.BiConsumer<R, R>); + method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjIntConsumer<R>, java.util.function.BiConsumer<R, R>); method public static java.util.stream.IntStream concat(java.util.stream.IntStream, java.util.stream.IntStream); method public abstract long count(); method public abstract java.util.stream.IntStream distinct(); @@ -65869,7 +65894,7 @@ package java.util.stream { method public abstract java.util.stream.IntStream map(java.util.function.IntUnaryOperator); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.IntToDoubleFunction); method public abstract java.util.stream.LongStream mapToLong(java.util.function.IntToLongFunction); - method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.IntFunction<? extends U>); + method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.IntFunction<? extends U>); method public abstract java.util.OptionalInt max(); method public abstract java.util.OptionalInt min(); method public abstract boolean noneMatch(java.util.function.IntPredicate); @@ -65903,7 +65928,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream<java.lang.Long> boxed(); method public static java.util.stream.LongStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjLongConsumer<R>, java.util.function.BiConsumer<R, R>); + method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjLongConsumer<R>, java.util.function.BiConsumer<R, R>); method public static java.util.stream.LongStream concat(java.util.stream.LongStream, java.util.stream.LongStream); method public abstract long count(); method public abstract java.util.stream.LongStream distinct(); @@ -65921,7 +65946,7 @@ package java.util.stream { method public abstract java.util.stream.LongStream map(java.util.function.LongUnaryOperator); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.LongToDoubleFunction); method public abstract java.util.stream.IntStream mapToInt(java.util.function.LongToIntFunction); - method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.LongFunction<? extends U>); + method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.LongFunction<? extends U>); method public abstract java.util.OptionalLong max(); method public abstract java.util.OptionalLong min(); method public abstract boolean noneMatch(java.util.function.LongPredicate); @@ -65948,49 +65973,49 @@ package java.util.stream { method public abstract java.util.stream.LongStream build(); } - public abstract interface Stream implements java.util.stream.BaseStream { + public abstract interface Stream<T> implements java.util.stream.BaseStream { method public abstract boolean allMatch(java.util.function.Predicate<? super T>); method public abstract boolean anyMatch(java.util.function.Predicate<? super T>); - method public static java.util.stream.Stream.Builder<T> builder(); - method public abstract R collect(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, ? super T>, java.util.function.BiConsumer<R, R>); - method public abstract R collect(java.util.stream.Collector<? super T, A, R>); - method public static java.util.stream.Stream<T> concat(java.util.stream.Stream<? extends T>, java.util.stream.Stream<? extends T>); + method public static <T> java.util.stream.Stream.Builder<T> builder(); + method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, ? super T>, java.util.function.BiConsumer<R, R>); + method public abstract <R, A> R collect(java.util.stream.Collector<? super T, A, R>); + method public static <T> java.util.stream.Stream<T> concat(java.util.stream.Stream<? extends T>, java.util.stream.Stream<? extends T>); method public abstract long count(); method public abstract java.util.stream.Stream<T> distinct(); - method public static java.util.stream.Stream<T> empty(); + method public static <T> java.util.stream.Stream<T> empty(); method public abstract java.util.stream.Stream<T> filter(java.util.function.Predicate<? super T>); method public abstract java.util.Optional<T> findAny(); method public abstract java.util.Optional<T> findFirst(); - method public abstract java.util.stream.Stream<R> flatMap(java.util.function.Function<? super T, ? extends java.util.stream.Stream<? extends R>>); + method public abstract <R> java.util.stream.Stream<R> flatMap(java.util.function.Function<? super T, ? extends java.util.stream.Stream<? extends R>>); method public abstract java.util.stream.DoubleStream flatMapToDouble(java.util.function.Function<? super T, ? extends java.util.stream.DoubleStream>); method public abstract java.util.stream.IntStream flatMapToInt(java.util.function.Function<? super T, ? extends java.util.stream.IntStream>); method public abstract java.util.stream.LongStream flatMapToLong(java.util.function.Function<? super T, ? extends java.util.stream.LongStream>); method public abstract void forEach(java.util.function.Consumer<? super T>); method public abstract void forEachOrdered(java.util.function.Consumer<? super T>); - method public static java.util.stream.Stream<T> generate(java.util.function.Supplier<T>); - method public static java.util.stream.Stream<T> iterate(T, java.util.function.UnaryOperator<T>); + method public static <T> java.util.stream.Stream<T> generate(java.util.function.Supplier<T>); + method public static <T> java.util.stream.Stream<T> iterate(T, java.util.function.UnaryOperator<T>); method public abstract java.util.stream.Stream<T> limit(long); - method public abstract java.util.stream.Stream<R> map(java.util.function.Function<? super T, ? extends R>); + method public abstract <R> java.util.stream.Stream<R> map(java.util.function.Function<? super T, ? extends R>); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.ToDoubleFunction<? super T>); method public abstract java.util.stream.IntStream mapToInt(java.util.function.ToIntFunction<? super T>); method public abstract java.util.stream.LongStream mapToLong(java.util.function.ToLongFunction<? super T>); method public abstract java.util.Optional<T> max(java.util.Comparator<? super T>); method public abstract java.util.Optional<T> min(java.util.Comparator<? super T>); method public abstract boolean noneMatch(java.util.function.Predicate<? super T>); - method public static java.util.stream.Stream<T> of(T); - method public static java.util.stream.Stream<T> of(T...); + method public static <T> java.util.stream.Stream<T> of(T); + method public static <T> java.util.stream.Stream<T> of(T...); method public abstract java.util.stream.Stream<T> peek(java.util.function.Consumer<? super T>); method public abstract T reduce(T, java.util.function.BinaryOperator<T>); method public abstract java.util.Optional<T> reduce(java.util.function.BinaryOperator<T>); - method public abstract U reduce(U, java.util.function.BiFunction<U, ? super T, U>, java.util.function.BinaryOperator<U>); + method public abstract <U> U reduce(U, java.util.function.BiFunction<U, ? super T, U>, java.util.function.BinaryOperator<U>); method public abstract java.util.stream.Stream<T> skip(long); method public abstract java.util.stream.Stream<T> sorted(); method public abstract java.util.stream.Stream<T> sorted(java.util.Comparator<? super T>); method public abstract java.lang.Object[] toArray(); - method public abstract A[] toArray(java.util.function.IntFunction<A[]>); + method public abstract <A> A[] toArray(java.util.function.IntFunction<A[]>); } - public static abstract interface Stream.Builder implements java.util.function.Consumer { + public static abstract interface Stream.Builder<T> implements java.util.function.Consumer { method public abstract void accept(T); method public default java.util.stream.Stream.Builder<T> add(T); method public abstract java.util.stream.Stream<T> build(); @@ -66003,8 +66028,8 @@ package java.util.stream { method public static java.util.stream.IntStream intStream(java.util.function.Supplier<? extends java.util.Spliterator.OfInt>, int, boolean); method public static java.util.stream.LongStream longStream(java.util.Spliterator.OfLong, boolean); method public static java.util.stream.LongStream longStream(java.util.function.Supplier<? extends java.util.Spliterator.OfLong>, int, boolean); - method public static java.util.stream.Stream<T> stream(java.util.Spliterator<T>, boolean); - method public static java.util.stream.Stream<T> stream(java.util.function.Supplier<? extends java.util.Spliterator<T>>, int, boolean); + method public static <T> java.util.stream.Stream<T> stream(java.util.Spliterator<T>, boolean); + method public static <T> java.util.stream.Stream<T> stream(java.util.function.Supplier<? extends java.util.Spliterator<T>>, int, boolean); } } @@ -68177,16 +68202,16 @@ package javax.security.auth { public final class Subject implements java.io.Serializable { ctor public Subject(); ctor public Subject(boolean, java.util.Set<? extends java.security.Principal>, java.util.Set<?>, java.util.Set<?>); - method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedAction<T>); - method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; - method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction<T>, java.security.AccessControlContext); - method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException; + method public static <T> T doAs(javax.security.auth.Subject, java.security.PrivilegedAction<T>); + method public static <T> T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; + method public static <T> T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction<T>, java.security.AccessControlContext); + method public static <T> T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException; method public java.util.Set<java.security.Principal> getPrincipals(); - method public java.util.Set<T> getPrincipals(java.lang.Class<T>); + method public <T extends java.security.Principal> java.util.Set<T> getPrincipals(java.lang.Class<T>); method public java.util.Set<java.lang.Object> getPrivateCredentials(); - method public java.util.Set<T> getPrivateCredentials(java.lang.Class<T>); + method public <T> java.util.Set<T> getPrivateCredentials(java.lang.Class<T>); method public java.util.Set<java.lang.Object> getPublicCredentials(); - method public java.util.Set<T> getPublicCredentials(java.lang.Class<T>); + method public <T> java.util.Set<T> getPublicCredentials(java.lang.Class<T>); method public static javax.security.auth.Subject getSubject(java.security.AccessControlContext); method public boolean isReadOnly(); method public void setReadOnly(); diff --git a/api/test-current.txt b/api/test-current.txt index b3572ba7e821..2aa6cfe7e52f 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -2897,11 +2897,11 @@ package android.accounts { field public static final java.lang.String LOGIN_ACCOUNTS_CHANGED_ACTION = "android.accounts.LOGIN_ACCOUNTS_CHANGED"; } - public abstract interface AccountManagerCallback { + public abstract interface AccountManagerCallback<V> { method public abstract void run(android.accounts.AccountManagerFuture<V>); } - public abstract interface AccountManagerFuture { + public abstract interface AccountManagerFuture<V> { method public abstract boolean cancel(boolean); method public abstract V getResult() throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException; method public abstract V getResult(long, java.util.concurrent.TimeUnit) throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException; @@ -3047,7 +3047,7 @@ package android.animation { method public java.lang.Object evaluate(float, java.lang.Object, java.lang.Object); } - public abstract class BidirectionalTypeConverter extends android.animation.TypeConverter { + public abstract class BidirectionalTypeConverter<T, V> extends android.animation.TypeConverter { ctor public BidirectionalTypeConverter(java.lang.Class<T>, java.lang.Class<V>); method public abstract T convertBack(V); method public android.animation.BidirectionalTypeConverter<V, T> invert(); @@ -3139,26 +3139,26 @@ package android.animation { method public java.lang.String getPropertyName(); method public java.lang.Object getTarget(); method public static android.animation.ObjectAnimator ofArgb(java.lang.Object, java.lang.String, int...); - method public static android.animation.ObjectAnimator ofArgb(T, android.util.Property<T, java.lang.Integer>, int...); + method public static <T> android.animation.ObjectAnimator ofArgb(T, android.util.Property<T, java.lang.Integer>, int...); method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, float...); method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, float...); - method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, android.util.Property<T, java.lang.Float>, android.graphics.Path); + method public static <T> android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, float...); + method public static <T> android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, android.util.Property<T, java.lang.Float>, android.graphics.Path); method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, int...); method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, int...); - method public static android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, android.util.Property<T, java.lang.Integer>, android.graphics.Path); + method public static <T> android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, int...); + method public static <T> android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, android.util.Property<T, java.lang.Integer>, android.graphics.Path); method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, float[][]); method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, T...); + method public static <T> android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, T...); method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, int[][]); method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, T...); + method public static <T> android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, T...); method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeEvaluator, java.lang.Object...); method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeConverter<android.graphics.PointF, ?>, android.graphics.Path); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeEvaluator<V>, V...); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, P>, android.animation.TypeConverter<V, P>, android.animation.TypeEvaluator<V>, V...); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path); + method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeEvaluator<V>, V...); + method public static <T, V, P> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, P>, android.animation.TypeConverter<V, P>, android.animation.TypeEvaluator<V>, V...); + method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path); method public static android.animation.ObjectAnimator ofPropertyValuesHolder(java.lang.Object, android.animation.PropertyValuesHolder...); method public void setAutoCancel(boolean); method public void setProperty(android.util.Property); @@ -3182,17 +3182,17 @@ package android.animation { method public static android.animation.PropertyValuesHolder ofKeyframe(android.util.Property, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, float[][]); method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<V, float[]>, android.animation.TypeEvaluator<V>, V...); - method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...); + method public static <V> android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<V, float[]>, android.animation.TypeEvaluator<V>, V...); + method public static <T> android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, int[][]); method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<V, int[]>, android.animation.TypeEvaluator<V>, V...); - method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...); + method public static <V> android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<V, int[]>, android.animation.TypeEvaluator<V>, V...); + method public static <T> android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeEvaluator, java.lang.Object...); method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeConverter<android.graphics.PointF, ?>, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator<V>, V...); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<T, V>, android.animation.TypeEvaluator<T>, T...); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path); + method public static <V> android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator<V>, V...); + method public static <T, V> android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<T, V>, android.animation.TypeEvaluator<T>, T...); + method public static <V> android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path); method public void setConverter(android.animation.TypeConverter); method public void setEvaluator(android.animation.TypeEvaluator); method public void setFloatValues(float...); @@ -3229,12 +3229,12 @@ package android.animation { method public abstract float getInterpolation(float); } - public abstract class TypeConverter { + public abstract class TypeConverter<T, V> { ctor public TypeConverter(java.lang.Class<T>, java.lang.Class<V>); method public abstract V convert(T); } - public abstract interface TypeEvaluator { + public abstract interface TypeEvaluator<T> { method public abstract T evaluate(float, T, T); } @@ -4562,7 +4562,7 @@ package android.app { method public android.os.Parcelable saveAllState(); } - public abstract class FragmentHostCallback extends android.app.FragmentContainer { + public abstract class FragmentHostCallback<E> extends android.app.FragmentContainer { ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int); method public void onAttachFragment(android.app.Fragment); method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); @@ -4829,12 +4829,12 @@ package android.app { method public abstract void destroyLoader(int); method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); method public static void enableDebugLogging(boolean); - method public abstract android.content.Loader<D> getLoader(int); - method public abstract android.content.Loader<D> initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>); - method public abstract android.content.Loader<D> restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>); + method public abstract <D> android.content.Loader<D> getLoader(int); + method public abstract <D> android.content.Loader<D> initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>); + method public abstract <D> android.content.Loader<D> restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>); } - public static abstract interface LoaderManager.LoaderCallbacks { + public static abstract interface LoaderManager.LoaderCallbacks<D> { method public abstract android.content.Loader<D> onCreateLoader(int, android.os.Bundle); method public abstract void onLoadFinished(android.content.Loader<D>, D); method public abstract void onLoaderReset(android.content.Loader<D>); @@ -7618,7 +7618,7 @@ package android.content { ctor public AsyncQueryHandler.WorkerHandler(android.os.Looper); } - public abstract class AsyncTaskLoader extends android.content.Loader { + public abstract class AsyncTaskLoader<D> extends android.content.Loader { ctor public AsyncTaskLoader(android.content.Context); method public void cancelLoadInBackground(); method public boolean isLoadInBackgroundCanceled(); @@ -7800,7 +7800,7 @@ package android.content { method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException; method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException; method protected final android.os.ParcelFileDescriptor openFileHelper(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException; - method public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter<T>) throws java.io.FileNotFoundException; + method public <T> android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter<T>) throws java.io.FileNotFoundException; method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException; method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException; method public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String); @@ -7813,7 +7813,7 @@ package android.content { method public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]); } - public static abstract interface ContentProvider.PipeDataWriter { + public static abstract interface ContentProvider.PipeDataWriter<T> { method public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, T); } @@ -8085,7 +8085,7 @@ package android.content { method public final java.lang.String getString(int); method public final java.lang.String getString(int, java.lang.Object...); method public abstract java.lang.Object getSystemService(java.lang.String); - method public final T getSystemService(java.lang.Class<T>); + method public final <T> T getSystemService(java.lang.Class<T>); method public abstract java.lang.String getSystemServiceName(java.lang.Class<?>); method public final java.lang.CharSequence getText(int); method public abstract android.content.res.Resources.Theme getTheme(); @@ -8441,8 +8441,8 @@ package android.content { method public long getLongExtra(java.lang.String, long); method public java.lang.String getPackage(); method public android.os.Parcelable[] getParcelableArrayExtra(java.lang.String); - method public java.util.ArrayList<T> getParcelableArrayListExtra(java.lang.String); - method public T getParcelableExtra(java.lang.String); + method public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayListExtra(java.lang.String); + method public <T extends android.os.Parcelable> T getParcelableExtra(java.lang.String); method public java.lang.String getScheme(); method public android.content.Intent getSelector(); method public java.io.Serializable getSerializableExtra(java.lang.String); @@ -8917,7 +8917,7 @@ package android.content { ctor public IntentSender.SendIntentException(java.lang.Exception); } - public class Loader { + public class Loader<D> { ctor public Loader(android.content.Context); method public void abandon(); method public boolean cancelLoad(); @@ -8954,11 +8954,11 @@ package android.content { ctor public Loader.ForceLoadContentObserver(); } - public static abstract interface Loader.OnLoadCanceledListener { + public static abstract interface Loader.OnLoadCanceledListener<D> { method public abstract void onLoadCanceled(android.content.Loader<D>); } - public static abstract interface Loader.OnLoadCompleteListener { + public static abstract interface Loader.OnLoadCompleteListener<D> { method public abstract void onLoadComplete(android.content.Loader<D>, D); } @@ -10753,7 +10753,7 @@ package android.database { method public boolean isNull(int); } - public abstract class Observable { + public abstract class Observable<T> { ctor public Observable(); method public void registerObserver(T); method public void unregisterAll(); @@ -12643,7 +12643,7 @@ package android.graphics.drawable { public class AnimatedStateListDrawable extends android.graphics.drawable.StateListDrawable { ctor public AnimatedStateListDrawable(); method public void addState(int[], android.graphics.drawable.Drawable, int); - method public void addTransition(int, int, T, boolean); + method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean); } public class AnimatedVectorDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable2 { @@ -13767,7 +13767,7 @@ package android.hardware.camera2 { } public final class CameraCharacteristics extends android.hardware.camera2.CameraMetadata { - method public T get(android.hardware.camera2.CameraCharacteristics.Key<T>); + method public <T> T get(android.hardware.camera2.CameraCharacteristics.Key<T>); method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableCaptureRequestKeys(); method public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getAvailableCaptureResultKeys(); field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES; @@ -13852,7 +13852,7 @@ package android.hardware.camera2 { field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> TONEMAP_MAX_CURVE_POINTS; } - public static final class CameraCharacteristics.Key { + public static final class CameraCharacteristics.Key<T> { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); @@ -13917,7 +13917,7 @@ package android.hardware.camera2 { method public void onTorchModeUnavailable(java.lang.String); } - public abstract class CameraMetadata { + public abstract class CameraMetadata<TKey> { method public java.util.List<TKey> getKeys(); field public static final int COLOR_CORRECTION_ABERRATION_MODE_FAST = 1; // 0x1 field public static final int COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY = 2; // 0x2 @@ -14125,7 +14125,7 @@ package android.hardware.camera2 { public final class CaptureRequest extends android.hardware.camera2.CameraMetadata implements android.os.Parcelable { method public int describeContents(); - method public T get(android.hardware.camera2.CaptureRequest.Key<T>); + method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>); method public java.lang.Object getTag(); method public boolean isReprocess(); method public void writeToParcel(android.os.Parcel, int); @@ -14188,20 +14188,20 @@ package android.hardware.camera2 { public static final class CaptureRequest.Builder { method public void addTarget(android.view.Surface); method public android.hardware.camera2.CaptureRequest build(); - method public T get(android.hardware.camera2.CaptureRequest.Key<T>); + method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>); method public void removeTarget(android.view.Surface); - method public void set(android.hardware.camera2.CaptureRequest.Key<T>, T); + method public <T> void set(android.hardware.camera2.CaptureRequest.Key<T>, T); method public void setTag(java.lang.Object); } - public static final class CaptureRequest.Key { + public static final class CaptureRequest.Key<T> { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); } public class CaptureResult extends android.hardware.camera2.CameraMetadata { - method public T get(android.hardware.camera2.CaptureResult.Key<T>); + method public <T> T get(android.hardware.camera2.CaptureResult.Key<T>); method public long getFrameNumber(); method public android.hardware.camera2.CaptureRequest getRequest(); method public int getSequenceId(); @@ -14282,7 +14282,7 @@ package android.hardware.camera2 { field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_PRESET_CURVE; } - public static final class CaptureResult.Key { + public static final class CaptureResult.Key<T> { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); @@ -14407,14 +14407,14 @@ package android.hardware.camera2.params { method public android.util.Size[] getInputSizes(int); method public final int[] getOutputFormats(); method public long getOutputMinFrameDuration(int, android.util.Size); - method public long getOutputMinFrameDuration(java.lang.Class<T>, android.util.Size); - method public android.util.Size[] getOutputSizes(java.lang.Class<T>); + method public <T> long getOutputMinFrameDuration(java.lang.Class<T>, android.util.Size); + method public <T> android.util.Size[] getOutputSizes(java.lang.Class<T>); method public android.util.Size[] getOutputSizes(int); method public long getOutputStallDuration(int, android.util.Size); - method public long getOutputStallDuration(java.lang.Class<T>, android.util.Size); + method public <T> long getOutputStallDuration(java.lang.Class<T>, android.util.Size); method public final int[] getValidOutputFormatsForInput(int); method public boolean isOutputSupportedFor(int); - method public static boolean isOutputSupportedFor(java.lang.Class<T>); + method public static <T> boolean isOutputSupportedFor(java.lang.Class<T>); method public boolean isOutputSupportedFor(android.view.Surface); } @@ -16115,7 +16115,7 @@ package android.icu.math { package android.icu.text { - public final class AlphabeticIndex implements java.lang.Iterable { + public final class AlphabeticIndex<V> implements java.lang.Iterable { ctor public AlphabeticIndex(android.icu.util.ULocale); ctor public AlphabeticIndex(java.util.Locale); ctor public AlphabeticIndex(android.icu.text.RuleBasedCollator); @@ -16141,7 +16141,7 @@ package android.icu.text { method public android.icu.text.AlphabeticIndex<V> setUnderflowLabel(java.lang.String); } - public static class AlphabeticIndex.Bucket implements java.lang.Iterable { + public static class AlphabeticIndex.Bucket<V> implements java.lang.Iterable { method public java.lang.String getLabel(); method public android.icu.text.AlphabeticIndex.Bucket.LabelType getLabelType(); method public java.util.Iterator<android.icu.text.AlphabeticIndex.Record<V>> iterator(); @@ -16157,14 +16157,14 @@ package android.icu.text { enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType UNDERFLOW; } - public static final class AlphabeticIndex.ImmutableIndex implements java.lang.Iterable { + public static final class AlphabeticIndex.ImmutableIndex<V> implements java.lang.Iterable { method public android.icu.text.AlphabeticIndex.Bucket<V> getBucket(int); method public int getBucketCount(); method public int getBucketIndex(java.lang.CharSequence); method public java.util.Iterator<android.icu.text.AlphabeticIndex.Bucket<V>> iterator(); } - public static class AlphabeticIndex.Record { + public static class AlphabeticIndex.Record<V> { method public V getData(); method public java.lang.CharSequence getName(); } @@ -17677,8 +17677,8 @@ package android.icu.text { method public final android.icu.text.UnicodeSet addAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet addAll(android.icu.text.UnicodeSet); method public android.icu.text.UnicodeSet addAll(java.lang.Iterable<?>); - method public android.icu.text.UnicodeSet addAll(T...); - method public T addAllTo(T); + method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet addAll(T...); + method public <T extends java.util.Collection<java.lang.String>> T addAllTo(T); method public void addMatchSetTo(android.icu.text.UnicodeSet); method public android.icu.text.UnicodeSet applyIntPropertyValue(int, int); method public final android.icu.text.UnicodeSet applyPattern(java.lang.String); @@ -17706,15 +17706,15 @@ package android.icu.text { method public final boolean contains(java.lang.CharSequence); method public boolean containsAll(android.icu.text.UnicodeSet); method public boolean containsAll(java.lang.String); - method public boolean containsAll(java.lang.Iterable<T>); + method public <T extends java.lang.CharSequence> boolean containsAll(java.lang.Iterable<T>); method public boolean containsNone(int, int); method public boolean containsNone(android.icu.text.UnicodeSet); method public boolean containsNone(java.lang.CharSequence); - method public boolean containsNone(java.lang.Iterable<T>); + method public <T extends java.lang.CharSequence> boolean containsNone(java.lang.Iterable<T>); method public final boolean containsSome(int, int); method public final boolean containsSome(android.icu.text.UnicodeSet); method public final boolean containsSome(java.lang.CharSequence); - method public final boolean containsSome(java.lang.Iterable<T>); + method public final <T extends java.lang.CharSequence> boolean containsSome(java.lang.Iterable<T>); method public android.icu.text.UnicodeSet freeze(); method public static android.icu.text.UnicodeSet from(java.lang.CharSequence); method public static android.icu.text.UnicodeSet fromAll(java.lang.CharSequence); @@ -17732,14 +17732,14 @@ package android.icu.text { method public final android.icu.text.UnicodeSet remove(java.lang.CharSequence); method public final android.icu.text.UnicodeSet removeAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet removeAll(android.icu.text.UnicodeSet); - method public android.icu.text.UnicodeSet removeAll(java.lang.Iterable<T>); + method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet removeAll(java.lang.Iterable<T>); method public final android.icu.text.UnicodeSet removeAllStrings(); method public android.icu.text.UnicodeSet retain(int, int); method public final android.icu.text.UnicodeSet retain(int); method public final android.icu.text.UnicodeSet retain(java.lang.CharSequence); method public final android.icu.text.UnicodeSet retainAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet retainAll(android.icu.text.UnicodeSet); - method public android.icu.text.UnicodeSet retainAll(java.lang.Iterable<T>); + method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet retainAll(java.lang.Iterable<T>); method public android.icu.text.UnicodeSet set(int, int); method public android.icu.text.UnicodeSet set(android.icu.text.UnicodeSet); method public int size(); @@ -18149,7 +18149,7 @@ package android.icu.util { method public long getToDate(); } - public abstract interface Freezable implements java.lang.Cloneable { + public abstract interface Freezable<T> implements java.lang.Cloneable { method public abstract T cloneAsThawed(); method public abstract T freeze(); method public abstract boolean isFrozen(); @@ -18431,7 +18431,7 @@ package android.icu.util { field public static final android.icu.util.TimeUnit YEAR; } - public class Output { + public class Output<T> { ctor public Output(); ctor public Output(T); field public T value; @@ -28138,7 +28138,7 @@ package android.opengl { package android.os { - public abstract class AsyncTask { + public abstract class AsyncTask<Params, Progress, Result> { ctor public AsyncTask(); method public final boolean cancel(boolean); method protected abstract Result doInBackground(Params...); @@ -28364,16 +28364,16 @@ package android.os { method public float getFloat(java.lang.String, float); method public float[] getFloatArray(java.lang.String); method public java.util.ArrayList<java.lang.Integer> getIntegerArrayList(java.lang.String); - method public T getParcelable(java.lang.String); + method public <T extends android.os.Parcelable> T getParcelable(java.lang.String); method public android.os.Parcelable[] getParcelableArray(java.lang.String); - method public java.util.ArrayList<T> getParcelableArrayList(java.lang.String); + method public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayList(java.lang.String); method public java.io.Serializable getSerializable(java.lang.String); method public short getShort(java.lang.String); method public short getShort(java.lang.String, short); method public short[] getShortArray(java.lang.String); method public android.util.Size getSize(java.lang.String); method public android.util.SizeF getSizeF(java.lang.String); - method public android.util.SparseArray<T> getSparseParcelableArray(java.lang.String); + method public <T extends android.os.Parcelable> android.util.SparseArray<T> getSparseParcelableArray(java.lang.String); method public java.util.ArrayList<java.lang.String> getStringArrayList(java.lang.String); method public boolean hasFileDescriptors(); method public void putAll(android.os.Bundle); @@ -28878,8 +28878,8 @@ package android.os { method public final long[] createLongArray(); method public final java.lang.String[] createStringArray(); method public final java.util.ArrayList<java.lang.String> createStringArrayList(); - method public final T[] createTypedArray(android.os.Parcelable.Creator<T>); - method public final java.util.ArrayList<T> createTypedArrayList(android.os.Parcelable.Creator<T>); + method public final <T> T[] createTypedArray(android.os.Parcelable.Creator<T>); + method public final <T> java.util.ArrayList<T> createTypedArrayList(android.os.Parcelable.Creator<T>); method public final int dataAvail(); method public final int dataCapacity(); method public final int dataPosition(); @@ -28912,7 +28912,7 @@ package android.os { method public final long readLong(); method public final void readLongArray(long[]); method public final void readMap(java.util.Map, java.lang.ClassLoader); - method public final T readParcelable(java.lang.ClassLoader); + method public final <T extends android.os.Parcelable> T readParcelable(java.lang.ClassLoader); method public final android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader); method public final android.os.PersistableBundle readPersistableBundle(); method public final android.os.PersistableBundle readPersistableBundle(java.lang.ClassLoader); @@ -28925,9 +28925,9 @@ package android.os { method public final void readStringArray(java.lang.String[]); method public final void readStringList(java.util.List<java.lang.String>); method public final android.os.IBinder readStrongBinder(); - method public final void readTypedArray(T[], android.os.Parcelable.Creator<T>); - method public final void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>); - method public final T readTypedObject(android.os.Parcelable.Creator<T>); + method public final <T> void readTypedArray(T[], android.os.Parcelable.Creator<T>); + method public final <T> void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>); + method public final <T> T readTypedObject(android.os.Parcelable.Creator<T>); method public final java.lang.Object readValue(java.lang.ClassLoader); method public final void recycle(); method public final void setDataCapacity(int); @@ -28958,7 +28958,7 @@ package android.os { method public final void writeMap(java.util.Map); method public final void writeNoException(); method public final void writeParcelable(android.os.Parcelable, int); - method public final void writeParcelableArray(T[], int); + method public final <T extends android.os.Parcelable> void writeParcelableArray(T[], int); method public final void writePersistableBundle(android.os.PersistableBundle); method public final void writeSerializable(java.io.Serializable); method public final void writeSize(android.util.Size); @@ -28970,9 +28970,9 @@ package android.os { method public final void writeStringList(java.util.List<java.lang.String>); method public final void writeStrongBinder(android.os.IBinder); method public final void writeStrongInterface(android.os.IInterface); - method public final void writeTypedArray(T[], int); - method public final void writeTypedList(java.util.List<T>); - method public final void writeTypedObject(T, int); + method public final <T extends android.os.Parcelable> void writeTypedArray(T[], int); + method public final <T extends android.os.Parcelable> void writeTypedList(java.util.List<T>); + method public final <T extends android.os.Parcelable> void writeTypedObject(T, int); method public final void writeValue(java.lang.Object); field public static final android.os.Parcelable.Creator<java.lang.String> STRING_CREATOR; } @@ -29050,11 +29050,11 @@ package android.os { field public static final int PARCELABLE_WRITE_RETURN_VALUE = 1; // 0x1 } - public static abstract interface Parcelable.ClassLoaderCreator implements android.os.Parcelable.Creator { + public static abstract interface Parcelable.ClassLoaderCreator<T> implements android.os.Parcelable.Creator { method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader); } - public static abstract interface Parcelable.Creator { + public static abstract interface Parcelable.Creator<T> { method public abstract T createFromParcel(android.os.Parcel); method public abstract T[] newArray(int); } @@ -29168,7 +29168,7 @@ package android.os { method public abstract void onProgress(int); } - public class RemoteCallbackList { + public class RemoteCallbackList<E extends android.os.IInterface> { ctor public RemoteCallbackList(); method public int beginBroadcast(); method public void finishBroadcast(); @@ -29238,6 +29238,7 @@ package android.os { method public android.os.StrictMode.ThreadPolicy.Builder detectDiskWrites(); method public android.os.StrictMode.ThreadPolicy.Builder detectNetwork(); method public android.os.StrictMode.ThreadPolicy.Builder detectResourceMismatches(); + method public android.os.StrictMode.ThreadPolicy.Builder detectUnbufferedIo(); method public android.os.StrictMode.ThreadPolicy.Builder penaltyDeath(); method public android.os.StrictMode.ThreadPolicy.Builder penaltyDeathOnNetwork(); method public android.os.StrictMode.ThreadPolicy.Builder penaltyDialog(); @@ -29250,6 +29251,7 @@ package android.os { method public android.os.StrictMode.ThreadPolicy.Builder permitDiskWrites(); method public android.os.StrictMode.ThreadPolicy.Builder permitNetwork(); method public android.os.StrictMode.ThreadPolicy.Builder permitResourceMismatches(); + method public android.os.StrictMode.ThreadPolicy.Builder permitUnbufferedIo(); } public static final class StrictMode.VmPolicy { @@ -34486,7 +34488,7 @@ package android.service.carrier { field public static final java.lang.String SERVICE_INTERFACE = "android.service.carrier.CarrierMessagingService"; } - public static abstract interface CarrierMessagingService.ResultCallback { + public static abstract interface CarrierMessagingService.ResultCallback<T> { method public abstract void onReceiveResult(T) throws android.os.RemoteException; } @@ -34637,7 +34639,7 @@ package android.service.media { field public static final java.lang.String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED"; } - public class MediaBrowserService.Result { + public class MediaBrowserService.Result<T> { method public void detach(); method public void sendResult(T); } @@ -37507,14 +37509,14 @@ package android.telephony.gsm { package android.test { - public abstract deprecated class ActivityInstrumentationTestCase extends android.test.ActivityTestCase { + public abstract deprecated class ActivityInstrumentationTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase { ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class<T>); ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class<T>, boolean); method public T getActivity(); method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception; } - public abstract deprecated class ActivityInstrumentationTestCase2 extends android.test.ActivityTestCase { + public abstract deprecated class ActivityInstrumentationTestCase2<T extends android.app.Activity> extends android.test.ActivityTestCase { ctor public deprecated ActivityInstrumentationTestCase2(java.lang.String, java.lang.Class<T>); ctor public ActivityInstrumentationTestCase2(java.lang.Class<T>); method public T getActivity(); @@ -37529,7 +37531,7 @@ package android.test { method protected void setActivity(android.app.Activity); } - public abstract deprecated class ActivityUnitTestCase extends android.test.ActivityTestCase { + public abstract deprecated class ActivityUnitTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase { ctor public ActivityUnitTestCase(java.lang.Class<T>); method public T getActivity(); method public int getFinishedActivityRequest(); @@ -37575,7 +37577,7 @@ package android.test { method public void testStarted(java.lang.String); } - public abstract deprecated class ApplicationTestCase extends android.test.AndroidTestCase { + public abstract deprecated class ApplicationTestCase<T extends android.app.Application> extends android.test.AndroidTestCase { ctor public ApplicationTestCase(java.lang.Class<T>); method protected final void createApplication(); method public T getApplication(); @@ -37601,8 +37603,8 @@ package android.test { method public android.app.Instrumentation getInstrumentation(); method public deprecated void injectInsrumentation(android.app.Instrumentation); method public void injectInstrumentation(android.app.Instrumentation); - method public final T launchActivity(java.lang.String, java.lang.Class<T>, android.os.Bundle); - method public final T launchActivityWithIntent(java.lang.String, java.lang.Class<T>, android.content.Intent); + method public final <T extends android.app.Activity> T launchActivity(java.lang.String, java.lang.Class<T>, android.os.Bundle); + method public final <T extends android.app.Activity> T launchActivityWithIntent(java.lang.String, java.lang.Class<T>, android.content.Intent); method public void runTestOnUiThread(java.lang.Runnable) throws java.lang.Throwable; method public void sendKeys(java.lang.String); method public void sendKeys(int...); @@ -37642,7 +37644,7 @@ package android.test { public class LoaderTestCase extends android.test.AndroidTestCase { ctor public LoaderTestCase(); - method public T getLoaderResultSynchronously(android.content.Loader<T>); + method public <T> T getLoaderResultSynchronously(android.content.Loader<T>); } public final deprecated class MoreAsserts { @@ -37697,20 +37699,20 @@ package android.test { method public abstract void startTiming(boolean); } - public abstract deprecated class ProviderTestCase extends android.test.InstrumentationTestCase { + public abstract deprecated class ProviderTestCase<T extends android.content.ContentProvider> extends android.test.InstrumentationTestCase { ctor public ProviderTestCase(java.lang.Class<T>, java.lang.String); method public android.test.mock.MockContentResolver getMockContentResolver(); method public android.test.IsolatedContext getMockContext(); method public T getProvider(); - method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } - public abstract class ProviderTestCase2 extends android.test.AndroidTestCase { + public abstract class ProviderTestCase2<T extends android.content.ContentProvider> extends android.test.AndroidTestCase { ctor public ProviderTestCase2(java.lang.Class<T>, java.lang.String); method public android.test.mock.MockContentResolver getMockContentResolver(); method public android.test.IsolatedContext getMockContext(); method public T getProvider(); - method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } public deprecated class RenamingDelegatingContext extends android.content.ContextWrapper { @@ -37718,11 +37720,11 @@ package android.test { ctor public RenamingDelegatingContext(android.content.Context, android.content.Context, java.lang.String); method public java.lang.String getDatabasePrefix(); method public void makeExistingFilesAndDbsAccessible(); - method public static T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; - method public static T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } - public abstract deprecated class ServiceTestCase extends android.test.AndroidTestCase { + public abstract deprecated class ServiceTestCase<T extends android.app.Service> extends android.test.AndroidTestCase { ctor public ServiceTestCase(java.lang.Class<T>); method protected android.os.IBinder bindService(android.content.Intent); method public android.app.Application getApplication(); @@ -37735,7 +37737,7 @@ package android.test { method public void testServiceTestCaseSetUpProperly() throws java.lang.Exception; } - public abstract deprecated class SingleLaunchActivityTestCase extends android.test.InstrumentationTestCase { + public abstract deprecated class SingleLaunchActivityTestCase<T extends android.app.Activity> extends android.test.InstrumentationTestCase { ctor public SingleLaunchActivityTestCase(java.lang.String, java.lang.Class<T>); method public T getActivity(); method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception; @@ -38092,7 +38094,7 @@ package android.test.suitebuilder { ctor public TestMethod(java.lang.String, java.lang.Class<? extends junit.framework.TestCase>); ctor public TestMethod(junit.framework.TestCase); method public junit.framework.TestCase createTest() throws java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException; - method public T getAnnotation(java.lang.Class<T>); + method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>); method public java.lang.Class<? extends junit.framework.TestCase> getEnclosingClass(); method public java.lang.String getEnclosingClassname(); method public java.lang.String getName(); @@ -38535,7 +38537,7 @@ package android.text { method public int getSpanEnd(java.lang.Object); method public int getSpanFlags(java.lang.Object); method public int getSpanStart(java.lang.Object); - method public T[] getSpans(int, int, java.lang.Class<T>); + method public <T> T[] getSpans(int, int, java.lang.Class<T>); method public deprecated int getTextRunCursor(int, int, int, int, int, android.graphics.Paint); method public int getTextWatcherDepth(); method public android.text.SpannableStringBuilder insert(int, java.lang.CharSequence, int, int); @@ -38557,7 +38559,7 @@ package android.text { method public int getSpanEnd(java.lang.Object); method public int getSpanFlags(java.lang.Object); method public int getSpanStart(java.lang.Object); - method public T[] getSpans(int, int, java.lang.Class<T>); + method public <T> T[] getSpans(int, int, java.lang.Class<T>); method public final int length(); method public int nextSpanTransition(int, int, java.lang.Class); method public final java.lang.String toString(); @@ -38567,7 +38569,7 @@ package android.text { method public abstract int getSpanEnd(java.lang.Object); method public abstract int getSpanFlags(java.lang.Object); method public abstract int getSpanStart(java.lang.Object); - method public abstract T[] getSpans(int, int, java.lang.Class<T>); + method public abstract <T> T[] getSpans(int, int, java.lang.Class<T>); method public abstract int nextSpanTransition(int, int, java.lang.Class); field public static final int SPAN_COMPOSING = 256; // 0x100 field public static final int SPAN_EXCLUSIVE_EXCLUSIVE = 33; // 0x21 @@ -39544,7 +39546,7 @@ package android.text.style { field public static final int WEEKDAY_WEDNESDAY = 4; // 0x4 } - public static class TtsSpan.Builder { + public static class TtsSpan.Builder<C extends android.text.style.TtsSpan.Builder<?>> { ctor public TtsSpan.Builder(java.lang.String); method public android.text.style.TtsSpan build(); method public C setIntArgument(java.lang.String, int); @@ -39640,7 +39642,7 @@ package android.text.style { method public android.text.style.TtsSpan.OrdinalBuilder setNumber(java.lang.String); } - public static class TtsSpan.SemioticClassBuilder extends android.text.style.TtsSpan.Builder { + public static class TtsSpan.SemioticClassBuilder<C extends android.text.style.TtsSpan.SemioticClassBuilder<?>> extends android.text.style.TtsSpan.Builder { ctor public TtsSpan.SemioticClassBuilder(java.lang.String); method public C setAnimacy(java.lang.String); method public C setCase(java.lang.String); @@ -40047,7 +40049,7 @@ package android.util { ctor public AndroidRuntimeException(java.lang.Exception); } - public final class ArrayMap implements java.util.Map { + public final class ArrayMap<K, V> implements java.util.Map { ctor public ArrayMap(); ctor public ArrayMap(int); ctor public ArrayMap(android.util.ArrayMap<K, V>); @@ -40075,7 +40077,7 @@ package android.util { method public java.util.Collection<V> values(); } - public final class ArraySet implements java.util.Collection java.util.Set { + public final class ArraySet<E> implements java.util.Collection java.util.Set { ctor public ArraySet(); ctor public ArraySet(int); ctor public ArraySet(android.util.ArraySet<E>); @@ -40096,7 +40098,7 @@ package android.util { method public boolean retainAll(java.util.Collection<?>); method public int size(); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public <T> T[] toArray(T[]); method public E valueAt(int); } @@ -40238,13 +40240,13 @@ package android.util { public deprecated class FloatMath { } - public abstract class FloatProperty extends android.util.Property { + public abstract class FloatProperty<T> extends android.util.Property { ctor public FloatProperty(java.lang.String); method public final void set(T, java.lang.Float); method public abstract void setValue(T, float); } - public abstract class IntProperty extends android.util.Property { + public abstract class IntProperty<T> extends android.util.Property { ctor public IntProperty(java.lang.String); method public final void set(T, java.lang.Integer); method public abstract void setValue(T, int); @@ -40344,7 +40346,7 @@ package android.util { method public void println(java.lang.String); } - public class LongSparseArray implements java.lang.Cloneable { + public class LongSparseArray<E> implements java.lang.Cloneable { ctor public LongSparseArray(); ctor public LongSparseArray(int); method public void append(long, E); @@ -40364,7 +40366,7 @@ package android.util { method public E valueAt(int); } - public class LruCache { + public class LruCache<K, V> { ctor public LruCache(int); method protected V create(K); method public final synchronized int createCount(); @@ -40452,9 +40454,9 @@ package android.util { ctor public NoSuchPropertyException(java.lang.String); } - public class Pair { + public class Pair<F, S> { ctor public Pair(F, S); - method public static android.util.Pair<A, B> create(A, B); + method public static <A, B> android.util.Pair<A, B> create(A, B); field public final F first; field public final S second; } @@ -40487,22 +40489,22 @@ package android.util { method public abstract void println(java.lang.String); } - public abstract class Property { + public abstract class Property<T, V> { ctor public Property(java.lang.Class<V>, java.lang.String); method public abstract V get(T); method public java.lang.String getName(); method public java.lang.Class<V> getType(); method public boolean isReadOnly(); - method public static android.util.Property<T, V> of(java.lang.Class<T>, java.lang.Class<V>, java.lang.String); + method public static <T, V> android.util.Property<T, V> of(java.lang.Class<T>, java.lang.Class<V>, java.lang.String); method public void set(T, V); } - public final class Range { + public final class Range<T extends java.lang.Comparable<? super T>> { ctor public Range(T, T); method public T clamp(T); method public boolean contains(T); method public boolean contains(android.util.Range<T>); - method public static android.util.Range<T> create(T, T); + method public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> create(T, T); method public android.util.Range<T> extend(android.util.Range<T>); method public android.util.Range<T> extend(T, T); method public android.util.Range<T> extend(T); @@ -40546,7 +40548,7 @@ package android.util { method public static android.util.SizeF parseSizeF(java.lang.String) throws java.lang.NumberFormatException; } - public class SparseArray implements java.lang.Cloneable { + public class SparseArray<E> implements java.lang.Cloneable { ctor public SparseArray(); ctor public SparseArray(int); method public void append(int, E); @@ -45250,7 +45252,7 @@ package android.webkit { method public static java.lang.String stripAnchor(java.lang.String); } - public abstract interface ValueCallback { + public abstract interface ValueCallback<T> { method public abstract void onReceiveValue(T); } @@ -45984,7 +45986,7 @@ package android.widget { field public static final int NO_SELECTION = -2147483648; // 0x80000000 } - public abstract class AdapterView extends android.view.ViewGroup { + public abstract class AdapterView<T extends android.widget.Adapter> extends android.view.ViewGroup { ctor public AdapterView(android.content.Context); ctor public AdapterView(android.content.Context, android.util.AttributeSet); ctor public AdapterView(android.content.Context, android.util.AttributeSet, int); @@ -46107,7 +46109,7 @@ package android.widget { ctor public AnalogClock(android.content.Context, android.util.AttributeSet, int, int); } - public class ArrayAdapter extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter { + public class ArrayAdapter<T> extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter { ctor public ArrayAdapter(android.content.Context, int); ctor public ArrayAdapter(android.content.Context, int, int); ctor public ArrayAdapter(android.content.Context, int, T[]); @@ -46168,7 +46170,7 @@ package android.widget { method protected void performFiltering(java.lang.CharSequence, int); method public void performValidation(); method protected void replaceText(java.lang.CharSequence); - method public void setAdapter(T); + method public <T extends android.widget.ListAdapter & android.widget.Filterable> void setAdapter(T); method public void setCompletionHint(java.lang.CharSequence); method public void setDropDownAnchor(int); method public void setDropDownBackgroundDrawable(android.graphics.drawable.Drawable); @@ -48454,7 +48456,7 @@ package android.widget { package com.android.internal.util { - public abstract interface Predicate { + public abstract interface Predicate<T> { method public abstract boolean apply(T); } @@ -50526,22 +50528,22 @@ package java.lang { enum_constant public static final java.lang.Character.UnicodeScript YI; } - public final class Class implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type { - method public java.lang.Class<? extends U> asSubclass(java.lang.Class<U>); + public final class Class<T> implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type { + method public <U> java.lang.Class<? extends U> asSubclass(java.lang.Class<U>); method public T cast(java.lang.Object); method public boolean desiredAssertionStatus(); method public static java.lang.Class<?> forName(java.lang.String) throws java.lang.ClassNotFoundException; method public static java.lang.Class<?> forName(java.lang.String, boolean, java.lang.ClassLoader) throws java.lang.ClassNotFoundException; - method public A getAnnotation(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A getAnnotation(java.lang.Class<A>); method public java.lang.annotation.Annotation[] getAnnotations(); - method public A[] getAnnotationsByType(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(java.lang.Class<A>); method public java.lang.String getCanonicalName(); method public java.lang.ClassLoader getClassLoader(); method public java.lang.Class<?>[] getClasses(); method public java.lang.Class<?> getComponentType(); method public java.lang.reflect.Constructor<T> getConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException; method public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException; - method public A getDeclaredAnnotation(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(java.lang.Class<A>); method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); method public java.lang.Class<?>[] getDeclaredClasses(); method public java.lang.reflect.Constructor<T> getDeclaredConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException; @@ -50653,7 +50655,7 @@ package java.lang { public abstract interface Cloneable { } - public abstract interface Comparable { + public abstract interface Comparable<T> { method public abstract int compareTo(T); } @@ -50707,7 +50709,7 @@ package java.lang { field public static final java.lang.Class<java.lang.Double> TYPE; } - public abstract class Enum implements java.lang.Comparable java.io.Serializable { + public abstract class Enum<E extends java.lang.Enum<E>> implements java.lang.Comparable java.io.Serializable { ctor protected Enum(java.lang.String, int); method protected final java.lang.Object clone() throws java.lang.CloneNotSupportedException; method public final int compareTo(E); @@ -50717,7 +50719,7 @@ package java.lang { method public final int hashCode(); method public final java.lang.String name(); method public final int ordinal(); - method public static T valueOf(java.lang.Class<T>, java.lang.String); + method public static <T extends java.lang.Enum<T>> T valueOf(java.lang.Class<T>, java.lang.String); } public class EnumConstantNotPresentException extends java.lang.RuntimeException { @@ -50836,7 +50838,7 @@ package java.lang { ctor public IndexOutOfBoundsException(java.lang.String); } - public class InheritableThreadLocal extends java.lang.ThreadLocal { + public class InheritableThreadLocal<T> extends java.lang.ThreadLocal { ctor public InheritableThreadLocal(); method protected T childValue(T); } @@ -50915,7 +50917,7 @@ package java.lang { ctor public InterruptedException(java.lang.String); } - public abstract interface Iterable { + public abstract interface Iterable<T> { 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(); @@ -51130,12 +51132,12 @@ package java.lang { } public class Package implements java.lang.reflect.AnnotatedElement { - method public A getAnnotation(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A getAnnotation(java.lang.Class<A>); method public java.lang.annotation.Annotation[] getAnnotations(); - method public A[] getAnnotationsByType(java.lang.Class<A>); - method public A getDeclaredAnnotation(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(java.lang.Class<A>); method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); - method public A[] getDeclaredAnnotationsByType(java.lang.Class<A>); + method public <A extends java.lang.annotation.Annotation> A[] getDeclaredAnnotationsByType(java.lang.Class<A>); method public java.lang.String getImplementationTitle(); method public java.lang.String getImplementationVendor(); method public java.lang.String getImplementationVersion(); @@ -51734,13 +51736,13 @@ package java.lang { method public void uncaughtException(java.lang.Thread, java.lang.Throwable); } - public class ThreadLocal { + public class ThreadLocal<T> { ctor public ThreadLocal(); method public T get(); method protected T initialValue(); method public void remove(); method public void set(T); - method public static java.lang.ThreadLocal<S> withInitial(java.util.function.Supplier<? extends S>); + method public static <S> java.lang.ThreadLocal<S> withInitial(java.util.function.Supplier<? extends S>); } public class Throwable implements java.io.Serializable { @@ -51843,6 +51845,8 @@ package java.lang.annotation { enum_constant public static final java.lang.annotation.ElementType PACKAGE; enum_constant public static final java.lang.annotation.ElementType PARAMETER; enum_constant public static final java.lang.annotation.ElementType TYPE; + enum_constant public static final java.lang.annotation.ElementType TYPE_PARAMETER; + enum_constant public static final java.lang.annotation.ElementType TYPE_USE; } public class IncompleteAnnotationException extends java.lang.RuntimeException { @@ -51878,30 +51882,30 @@ package java.lang.annotation { package java.lang.ref { - public class PhantomReference extends java.lang.ref.Reference { + public class PhantomReference<T> extends java.lang.ref.Reference { ctor public PhantomReference(T, java.lang.ref.ReferenceQueue<? super T>); } - public abstract class Reference { + public abstract class Reference<T> { method public void clear(); method public boolean enqueue(); method public T get(); method public boolean isEnqueued(); } - public class ReferenceQueue { + public class ReferenceQueue<T> { ctor public ReferenceQueue(); method public java.lang.ref.Reference<? extends T> poll(); method public java.lang.ref.Reference<? extends T> remove(long) throws java.lang.IllegalArgumentException, java.lang.InterruptedException; method public java.lang.ref.Reference<? extends T> remove() throws java.lang.InterruptedException; } - public class SoftReference extends java.lang.ref.Reference { + public class SoftReference<T> extends java.lang.ref.Reference { ctor public SoftReference(T); ctor public SoftReference(T, java.lang.ref.ReferenceQueue<? super T>); } - public class WeakReference extends java.lang.ref.Reference { + public class WeakReference<T> extends java.lang.ref.Reference { ctor public WeakReference(T); ctor public WeakReference(T, java.lang.ref.ReferenceQueue<? super T>); } @@ -51912,7 +51916,7 @@ package java.lang.reflect { public class AccessibleObject implements java.lang.reflect.AnnotatedElement { ctor protected AccessibleObject(); - method public T getAnnotation(java.lang.Class<T>); + method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>); method public java.lang.annotation.Annotation[] getAnnotations(); method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); method public boolean isAccessible(); @@ -51921,12 +51925,12 @@ package java.lang.reflect { } public abstract interface AnnotatedElement { - method public abstract T getAnnotation(java.lang.Class<T>); + method public abstract <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>); method public abstract java.lang.annotation.Annotation[] getAnnotations(); - method public default T[] getAnnotationsByType(java.lang.Class<T>); - method public default java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class<T>); + method public default <T extends java.lang.annotation.Annotation> T[] getAnnotationsByType(java.lang.Class<T>); + method public default <T extends java.lang.annotation.Annotation> T getDeclaredAnnotation(java.lang.Class<T>); method public abstract java.lang.annotation.Annotation[] getDeclaredAnnotations(); - method public default T[] getDeclaredAnnotationsByType(java.lang.Class<T>); + method public default <T extends java.lang.annotation.Annotation> T[] getDeclaredAnnotationsByType(java.lang.Class<T>); method public default boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>); } @@ -51954,7 +51958,7 @@ package java.lang.reflect { method public static void setShort(java.lang.Object, int, short) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException; } - public final class Constructor extends java.lang.reflect.Executable { + public final class Constructor<T> extends java.lang.reflect.Executable { method public java.lang.Class<T> getDeclaringClass(); method public java.lang.Class<?>[] getExceptionTypes(); method public int getModifiers(); @@ -51976,7 +51980,9 @@ package java.lang.reflect { method public abstract java.lang.annotation.Annotation[][] getParameterAnnotations(); method public int getParameterCount(); method public abstract java.lang.Class<?>[] getParameterTypes(); + method public java.lang.reflect.Parameter[] getParameters(); method public abstract java.lang.reflect.TypeVariable<?>[] getTypeParameters(); + method public final boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>); method public boolean isSynthetic(); method public boolean isVarArgs(); method public abstract java.lang.String toGenericString(); @@ -52099,6 +52105,21 @@ package java.lang.reflect { field public static final int VOLATILE = 64; // 0x40 } + public final class Parameter implements java.lang.reflect.AnnotatedElement { + method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>); + method public java.lang.annotation.Annotation[] getAnnotations(); + method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); + method public java.lang.reflect.Executable getDeclaringExecutable(); + method public int getModifiers(); + method public java.lang.String getName(); + method public java.lang.reflect.Type getParameterizedType(); + method public java.lang.Class<?> getType(); + method public boolean isImplicit(); + method public boolean isNamePresent(); + method public boolean isSynthetic(); + method public boolean isVarArgs(); + } + public abstract interface ParameterizedType implements java.lang.reflect.Type { method public abstract java.lang.reflect.Type[] getActualTypeArguments(); method public abstract java.lang.reflect.Type getOwnerType(); @@ -52122,7 +52143,7 @@ package java.lang.reflect { public abstract interface Type { } - public abstract interface TypeVariable implements java.lang.reflect.Type { + public abstract interface TypeVariable<D extends java.lang.reflect.GenericDeclaration> implements java.lang.reflect.Type { method public abstract java.lang.reflect.Type[] getBounds(); method public abstract D getGenericDeclaration(); method public abstract java.lang.String getName(); @@ -52911,7 +52932,7 @@ package java.net { method public abstract java.net.SocketImpl createSocketImpl(); } - public abstract interface SocketOption { + public abstract interface SocketOption<T> { method public abstract java.lang.String name(); method public abstract java.lang.Class<T> type(); } @@ -53443,9 +53464,9 @@ package java.nio.channels { } public abstract interface AsynchronousByteChannel implements java.nio.channels.AsynchronousChannel { - method public abstract void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer); - method public abstract void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer); } @@ -53473,25 +53494,25 @@ package java.nio.channels { public abstract class AsynchronousFileChannel implements java.nio.channels.AsynchronousChannel { ctor protected AsynchronousFileChannel(); method public abstract void force(boolean) throws java.io.IOException; - method public abstract void lock(long, long, boolean, A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>); - method public final void lock(A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>); + method public abstract <A> void lock(long, long, boolean, A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>); + method public final <A> void lock(A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>); method public abstract java.util.concurrent.Future<java.nio.channels.FileLock> lock(long, long, boolean); method public final java.util.concurrent.Future<java.nio.channels.FileLock> lock(); method public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.util.Set<? extends java.nio.file.OpenOption>, java.util.concurrent.ExecutorService, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException; method public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException; - method public abstract void read(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void read(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer, long); method public abstract long size() throws java.io.IOException; method public abstract java.nio.channels.AsynchronousFileChannel truncate(long) throws java.io.IOException; method public abstract java.nio.channels.FileLock tryLock(long, long, boolean) throws java.io.IOException; method public final java.nio.channels.FileLock tryLock() throws java.io.IOException; - method public abstract void write(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void write(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer, long); } public abstract class AsynchronousServerSocketChannel implements java.nio.channels.AsynchronousChannel java.nio.channels.NetworkChannel { ctor protected AsynchronousServerSocketChannel(java.nio.channels.spi.AsynchronousChannelProvider); - method public abstract void accept(A, java.nio.channels.CompletionHandler<java.nio.channels.AsynchronousSocketChannel, ? super A>); + method public abstract <A> void accept(A, java.nio.channels.CompletionHandler<java.nio.channels.AsynchronousSocketChannel, ? super A>); method public abstract java.util.concurrent.Future<java.nio.channels.AsynchronousSocketChannel> accept(); method public final java.nio.channels.AsynchronousServerSocketChannel bind(java.net.SocketAddress) throws java.io.IOException; method public abstract java.nio.channels.AsynchronousServerSocketChannel bind(java.net.SocketAddress, int) throws java.io.IOException; @@ -53499,30 +53520,30 @@ package java.nio.channels { method public static java.nio.channels.AsynchronousServerSocketChannel open(java.nio.channels.AsynchronousChannelGroup) throws java.io.IOException; method public static java.nio.channels.AsynchronousServerSocketChannel open() throws java.io.IOException; method public final java.nio.channels.spi.AsynchronousChannelProvider provider(); - method public abstract java.nio.channels.AsynchronousServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <T> java.nio.channels.AsynchronousServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; } public abstract class AsynchronousSocketChannel implements java.nio.channels.AsynchronousByteChannel java.nio.channels.NetworkChannel { ctor protected AsynchronousSocketChannel(java.nio.channels.spi.AsynchronousChannelProvider); method public abstract java.nio.channels.AsynchronousSocketChannel bind(java.net.SocketAddress) throws java.io.IOException; - method public abstract void connect(java.net.SocketAddress, A, java.nio.channels.CompletionHandler<java.lang.Void, ? super A>); + method public abstract <A> void connect(java.net.SocketAddress, A, java.nio.channels.CompletionHandler<java.lang.Void, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Void> connect(java.net.SocketAddress); method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException; method public abstract java.net.SocketAddress getRemoteAddress() throws java.io.IOException; method public static java.nio.channels.AsynchronousSocketChannel open(java.nio.channels.AsynchronousChannelGroup) throws java.io.IOException; method public static java.nio.channels.AsynchronousSocketChannel open() throws java.io.IOException; method public final java.nio.channels.spi.AsynchronousChannelProvider provider(); - method public abstract void read(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); - method public final void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void read(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public final <A> void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer); - method public abstract void read(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>); - method public abstract java.nio.channels.AsynchronousSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <A> void read(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>); + method public abstract <T> java.nio.channels.AsynchronousSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; method public abstract java.nio.channels.AsynchronousSocketChannel shutdownInput() throws java.io.IOException; method public abstract java.nio.channels.AsynchronousSocketChannel shutdownOutput() throws java.io.IOException; - method public abstract void write(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); - method public final void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public abstract <A> void write(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); + method public final <A> void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>); method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer); - method public abstract void write(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>); + method public abstract <A> void write(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>); } public abstract interface ByteChannel implements java.nio.channels.ReadableByteChannel java.nio.channels.WritableByteChannel { @@ -53562,7 +53583,7 @@ package java.nio.channels { ctor public ClosedSelectorException(); } - public abstract interface CompletionHandler { + public abstract interface CompletionHandler<V, A> { method public abstract void completed(V, A); method public abstract void failed(java.lang.Throwable, A); } @@ -53586,7 +53607,7 @@ package java.nio.channels { method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException; method public abstract java.net.SocketAddress receive(java.nio.ByteBuffer) throws java.io.IOException; method public abstract int send(java.nio.ByteBuffer, java.net.SocketAddress) throws java.io.IOException; - method public abstract java.nio.channels.DatagramChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <T> java.nio.channels.DatagramChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; method public abstract java.net.DatagramSocket socket(); method public final int validOps(); method public abstract int write(java.nio.ByteBuffer) throws java.io.IOException; @@ -53691,8 +53712,8 @@ package java.nio.channels { public abstract interface NetworkChannel implements java.nio.channels.Channel { method public abstract java.nio.channels.NetworkChannel bind(java.net.SocketAddress) throws java.io.IOException; method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException; - method public abstract T getOption(java.net.SocketOption<T>) throws java.io.IOException; - method public abstract java.nio.channels.NetworkChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <T> T getOption(java.net.SocketOption<T>) throws java.io.IOException; + method public abstract <T> java.nio.channels.NetworkChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; method public abstract java.util.Set<java.net.SocketOption<?>> supportedOptions(); } @@ -53814,7 +53835,7 @@ package java.nio.channels { method public abstract java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress, int) throws java.io.IOException; method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException; method public static java.nio.channels.ServerSocketChannel open() throws java.io.IOException; - method public abstract java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <T> java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; method public abstract java.net.ServerSocket socket(); method public final int validOps(); } @@ -53837,7 +53858,7 @@ package java.nio.channels { method public abstract int read(java.nio.ByteBuffer) throws java.io.IOException; method public abstract long read(java.nio.ByteBuffer[], int, int) throws java.io.IOException; method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException; - method public abstract java.nio.channels.SocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; + method public abstract <T> java.nio.channels.SocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException; method public abstract java.nio.channels.SocketChannel shutdownInput() throws java.io.IOException; method public abstract java.nio.channels.SocketChannel shutdownOutput() throws java.io.IOException; method public abstract java.net.Socket socket(); @@ -54122,11 +54143,11 @@ package java.nio.file { ctor public DirectoryNotEmptyException(java.lang.String); } - public abstract interface DirectoryStream implements java.io.Closeable java.lang.Iterable { + public abstract interface DirectoryStream<T> implements java.io.Closeable java.lang.Iterable { method public abstract java.util.Iterator<T> iterator(); } - public static abstract interface DirectoryStream.Filter { + public static abstract interface DirectoryStream.Filter<T> { method public abstract boolean accept(T) throws java.io.IOException; } @@ -54138,7 +54159,7 @@ package java.nio.file { public abstract class FileStore { ctor protected FileStore(); method public abstract java.lang.Object getAttribute(java.lang.String) throws java.io.IOException; - method public abstract V getFileStoreAttributeView(java.lang.Class<V>); + method public abstract <V extends java.nio.file.attribute.FileStoreAttributeView> V getFileStoreAttributeView(java.lang.Class<V>); method public abstract long getTotalSpace() throws java.io.IOException; method public abstract long getUnallocatedSpace() throws java.io.IOException; method public abstract long getUsableSpace() throws java.io.IOException; @@ -54210,7 +54231,7 @@ package java.nio.file { enum_constant public static final java.nio.file.FileVisitResult TERMINATE; } - public abstract interface FileVisitor { + public abstract interface FileVisitor<T> { method public abstract java.nio.file.FileVisitResult postVisitDirectory(T, java.io.IOException) throws java.io.IOException; method public abstract java.nio.file.FileVisitResult preVisitDirectory(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException; method public abstract java.nio.file.FileVisitResult visitFile(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException; @@ -54235,7 +54256,7 @@ package java.nio.file { method public static boolean exists(java.nio.file.Path, java.nio.file.LinkOption...); method public static java.util.stream.Stream<java.nio.file.Path> find(java.nio.file.Path, int, java.util.function.BiPredicate<java.nio.file.Path, java.nio.file.attribute.BasicFileAttributes>, java.nio.file.FileVisitOption...) throws java.io.IOException; method public static java.lang.Object getAttribute(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException; - method public static V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...); + method public static <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...); method public static java.nio.file.FileStore getFileStore(java.nio.file.Path) throws java.io.IOException; method public static java.nio.file.attribute.FileTime getLastModifiedTime(java.nio.file.Path, java.nio.file.LinkOption...) throws java.io.IOException; method public static java.nio.file.attribute.UserPrincipal getOwner(java.nio.file.Path, java.nio.file.LinkOption...) throws java.io.IOException; @@ -54268,7 +54289,7 @@ package java.nio.file { method public static byte[] readAllBytes(java.nio.file.Path) throws java.io.IOException; method public static java.util.List<java.lang.String> readAllLines(java.nio.file.Path, java.nio.charset.Charset) throws java.io.IOException; method public static java.util.List<java.lang.String> readAllLines(java.nio.file.Path) throws java.io.IOException; - method public static A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException; + method public static <A extends java.nio.file.attribute.BasicFileAttributes> A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException; method public static java.util.Map<java.lang.String, java.lang.Object> readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException; method public static java.nio.file.Path readSymbolicLink(java.nio.file.Path) throws java.io.IOException; method public static java.nio.file.Path setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption...) throws java.io.IOException; @@ -54376,17 +54397,17 @@ package java.nio.file { ctor public ReadOnlyFileSystemException(); } - public abstract interface SecureDirectoryStream implements java.nio.file.DirectoryStream { + public abstract interface SecureDirectoryStream<T> implements java.nio.file.DirectoryStream { method public abstract void deleteDirectory(T) throws java.io.IOException; method public abstract void deleteFile(T) throws java.io.IOException; - method public abstract V getFileAttributeView(java.lang.Class<V>); - method public abstract V getFileAttributeView(T, java.lang.Class<V>, java.nio.file.LinkOption...); + method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.lang.Class<V>); + method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(T, java.lang.Class<V>, java.nio.file.LinkOption...); method public abstract void move(T, java.nio.file.SecureDirectoryStream<T>, T) throws java.io.IOException; method public abstract java.nio.channels.SeekableByteChannel newByteChannel(T, java.util.Set<? extends java.nio.file.OpenOption>, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException; method public abstract java.nio.file.SecureDirectoryStream<T> newDirectoryStream(T, java.nio.file.LinkOption...) throws java.io.IOException; } - public class SimpleFileVisitor implements java.nio.file.FileVisitor { + public class SimpleFileVisitor<T> implements java.nio.file.FileVisitor { ctor protected SimpleFileVisitor(); method public java.nio.file.FileVisitResult postVisitDirectory(T, java.io.IOException) throws java.io.IOException; method public java.nio.file.FileVisitResult preVisitDirectory(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException; @@ -54424,13 +54445,13 @@ package java.nio.file { field public static final java.nio.file.WatchEvent.Kind<java.lang.Object> OVERFLOW; } - public abstract interface WatchEvent { + public abstract interface WatchEvent<T> { method public abstract T context(); method public abstract int count(); method public abstract java.nio.file.WatchEvent.Kind<T> kind(); } - public static abstract interface WatchEvent.Kind { + public static abstract interface WatchEvent.Kind<T> { method public abstract java.lang.String name(); method public abstract java.lang.Class<T> type(); } @@ -54566,7 +54587,7 @@ package java.nio.file.attribute { method public abstract boolean isSystem(); } - public abstract interface FileAttribute { + public abstract interface FileAttribute<T> { method public abstract java.lang.String name(); method public abstract T value(); } @@ -54663,7 +54684,7 @@ package java.nio.file.spi { method public void createSymbolicLink(java.nio.file.Path, java.nio.file.Path, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException; method public abstract void delete(java.nio.file.Path) throws java.io.IOException; method public boolean deleteIfExists(java.nio.file.Path) throws java.io.IOException; - method public abstract V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...); + method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...); method public abstract java.nio.file.FileStore getFileStore(java.nio.file.Path) throws java.io.IOException; method public abstract java.nio.file.FileSystem getFileSystem(java.net.URI); method public abstract java.nio.file.Path getPath(java.net.URI); @@ -54680,7 +54701,7 @@ package java.nio.file.spi { method public java.nio.file.FileSystem newFileSystem(java.nio.file.Path, java.util.Map<java.lang.String, ?>) throws java.io.IOException; method public java.io.InputStream newInputStream(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException; method public java.io.OutputStream newOutputStream(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException; - method public abstract A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException; + method public abstract <A extends java.nio.file.attribute.BasicFileAttributes> A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException; method public abstract java.util.Map<java.lang.String, java.lang.Object> readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException; method public java.nio.file.Path readSymbolicLink(java.nio.file.Path) throws java.io.IOException; method public abstract void setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption...) throws java.io.IOException; @@ -54710,12 +54731,12 @@ package java.security { public final class AccessController { method public static void checkPermission(java.security.Permission) throws java.security.AccessControlException; - method public static T doPrivileged(java.security.PrivilegedAction<T>); - method public static T doPrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext); - method public static T doPrivileged(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; - method public static T doPrivileged(java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException; - method public static T doPrivilegedWithCombiner(java.security.PrivilegedAction<T>); - method public static T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; + method public static <T> T doPrivileged(java.security.PrivilegedAction<T>); + method public static <T> T doPrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext); + method public static <T> T doPrivileged(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; + method public static <T> T doPrivileged(java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException; + method public static <T> T doPrivilegedWithCombiner(java.security.PrivilegedAction<T>); + method public static <T> T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; method public static java.security.AccessControlContext getContext(); } @@ -54754,7 +54775,7 @@ package java.security { method public static java.security.AlgorithmParameters getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException; method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException; method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException; - method public final T getParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException; + method public final <T extends java.security.spec.AlgorithmParameterSpec> T getParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException; method public final java.security.Provider getProvider(); method public final void init(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException; method public final void init(byte[]) throws java.io.IOException; @@ -54766,7 +54787,7 @@ package java.security { ctor public AlgorithmParametersSpi(); method protected abstract byte[] engineGetEncoded() throws java.io.IOException; method protected abstract byte[] engineGetEncoded(java.lang.String) throws java.io.IOException; - method protected abstract T engineGetParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException; + method protected abstract <T extends java.security.spec.AlgorithmParameterSpec> T engineGetParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException; method protected abstract void engineInit(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException; method protected abstract void engineInit(byte[]) throws java.io.IOException; method protected abstract void engineInit(byte[], java.lang.String) throws java.io.IOException; @@ -54958,7 +54979,7 @@ package java.security { method public static java.security.KeyFactory getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException; method public static java.security.KeyFactory getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException; method public static java.security.KeyFactory getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException; - method public final T getKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException; + method public final <T extends java.security.spec.KeySpec> T getKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException; method public final java.security.Provider getProvider(); method public final java.security.Key translateKey(java.security.Key) throws java.security.InvalidKeyException; } @@ -54967,7 +54988,7 @@ package java.security { ctor public KeyFactorySpi(); method protected abstract java.security.PrivateKey engineGeneratePrivate(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException; method protected abstract java.security.PublicKey engineGeneratePublic(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException; - method protected abstract T engineGetKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException; + method protected abstract <T extends java.security.spec.KeySpec> T engineGetKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException; method protected abstract java.security.Key engineTranslateKey(java.security.Key) throws java.security.InvalidKeyException; } @@ -55255,7 +55276,7 @@ package java.security { field public static final long serialVersionUID = 6034044314589513430L; // 0x53bd3b559a12c6d6L } - public abstract interface PrivilegedAction { + public abstract interface PrivilegedAction<T> { method public abstract T run(); } @@ -55264,7 +55285,7 @@ package java.security { method public java.lang.Exception getException(); } - public abstract interface PrivilegedExceptionAction { + public abstract interface PrivilegedExceptionAction<T> { method public abstract T run() throws java.lang.Exception; } @@ -57458,11 +57479,11 @@ package java.sql { method public abstract void free() throws java.sql.SQLException; method public abstract java.io.InputStream getBinaryStream() throws java.sql.SQLException; method public abstract java.io.Reader getCharacterStream() throws java.sql.SQLException; - method public abstract T getSource(java.lang.Class<T>) throws java.sql.SQLException; + method public abstract <T extends javax.xml.transform.Source> T getSource(java.lang.Class<T>) throws java.sql.SQLException; method public abstract java.lang.String getString() throws java.sql.SQLException; method public abstract java.io.OutputStream setBinaryStream() throws java.sql.SQLException; method public abstract java.io.Writer setCharacterStream() throws java.sql.SQLException; - method public abstract T setResult(java.lang.Class<T>) throws java.sql.SQLException; + method public abstract <T extends javax.xml.transform.Result> T setResult(java.lang.Class<T>) throws java.sql.SQLException; method public abstract void setString(java.lang.String) throws java.sql.SQLException; } @@ -57586,7 +57607,7 @@ package java.sql { public abstract interface Wrapper { method public abstract boolean isWrapperFor(java.lang.Class<?>) throws java.sql.SQLException; - method public abstract T unwrap(java.lang.Class<T>) throws java.sql.SQLException; + method public abstract <T> T unwrap(java.lang.Class<T>) throws java.sql.SQLException; } } @@ -58119,7 +58140,7 @@ package java.text { package java.util { - public abstract class AbstractCollection implements java.util.Collection { + public abstract class AbstractCollection<E> implements java.util.Collection { ctor protected AbstractCollection(); method public boolean add(E); method public boolean addAll(java.util.Collection<? extends E>); @@ -58133,10 +58154,10 @@ package java.util { method public boolean retainAll(java.util.Collection<?>); method public abstract int size(); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public <T> T[] toArray(T[]); } - public abstract class AbstractList extends java.util.AbstractCollection implements java.util.List { + public abstract class AbstractList<E> extends java.util.AbstractCollection implements java.util.List { ctor protected AbstractList(); method public void add(int, E); method public boolean addAll(int, java.util.Collection<? extends E>); @@ -58153,7 +58174,7 @@ package java.util { field protected transient int modCount; } - public abstract class AbstractMap implements java.util.Map { + public abstract class AbstractMap<K, V> implements java.util.Map { ctor protected AbstractMap(); method public void clear(); method public boolean containsKey(java.lang.Object); @@ -58169,7 +58190,7 @@ package java.util { method public java.util.Collection<V> values(); } - public static class AbstractMap.SimpleEntry implements java.util.Map.Entry java.io.Serializable { + public static class AbstractMap.SimpleEntry<K, V> implements java.util.Map.Entry java.io.Serializable { ctor public AbstractMap.SimpleEntry(K, V); ctor public AbstractMap.SimpleEntry(java.util.Map.Entry<? extends K, ? extends V>); method public K getKey(); @@ -58177,7 +58198,7 @@ package java.util { method public V setValue(V); } - public static class AbstractMap.SimpleImmutableEntry implements java.util.Map.Entry java.io.Serializable { + public static class AbstractMap.SimpleImmutableEntry<K, V> implements java.util.Map.Entry java.io.Serializable { ctor public AbstractMap.SimpleImmutableEntry(K, V); ctor public AbstractMap.SimpleImmutableEntry(java.util.Map.Entry<? extends K, ? extends V>); method public K getKey(); @@ -58185,23 +58206,23 @@ package java.util { method public V setValue(V); } - public abstract class AbstractQueue extends java.util.AbstractCollection implements java.util.Queue { + public abstract class AbstractQueue<E> extends java.util.AbstractCollection implements java.util.Queue { ctor protected AbstractQueue(); method public E element(); method public E remove(); } - public abstract class AbstractSequentialList extends java.util.AbstractList { + public abstract class AbstractSequentialList<E> extends java.util.AbstractList { ctor protected AbstractSequentialList(); method public E get(int); method public abstract java.util.ListIterator<E> listIterator(int); } - public abstract class AbstractSet extends java.util.AbstractCollection implements java.util.Set { + public abstract class AbstractSet<E> extends java.util.AbstractCollection implements java.util.Set { ctor protected AbstractSet(); } - public class ArrayDeque extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable { + public class ArrayDeque<E> extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable { ctor public ArrayDeque(); ctor public ArrayDeque(int); ctor public ArrayDeque(java.util.Collection<? extends E>); @@ -58233,7 +58254,7 @@ package java.util { 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 { + public class ArrayList<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public ArrayList(int); ctor public ArrayList(); ctor public ArrayList(java.util.Collection<? extends E>); @@ -58250,7 +58271,7 @@ package java.util { } public class Arrays { - method public static java.util.List<T> asList(T...); + method public static <T> java.util.List<T> asList(T...); method public static int binarySearch(long[], long); method public static int binarySearch(long[], int, int, long); method public static int binarySearch(int[], int); @@ -58267,10 +58288,10 @@ package java.util { method public static int binarySearch(float[], int, int, float); method public static int binarySearch(java.lang.Object[], java.lang.Object); method public static int binarySearch(java.lang.Object[], int, int, java.lang.Object); - method public static int binarySearch(T[], T, java.util.Comparator<? super T>); - method public static int binarySearch(T[], int, int, T, java.util.Comparator<? super T>); - method public static T[] copyOf(T[], int); - method public static T[] copyOf(U[], int, java.lang.Class<? extends T[]>); + method public static <T> int binarySearch(T[], T, java.util.Comparator<? super T>); + method public static <T> int binarySearch(T[], int, int, T, java.util.Comparator<? super T>); + method public static <T> T[] copyOf(T[], int); + method public static <T, U> T[] copyOf(U[], int, java.lang.Class<? extends T[]>); method public static byte[] copyOf(byte[], int); method public static short[] copyOf(short[], int); method public static int[] copyOf(int[], int); @@ -58279,8 +58300,8 @@ package java.util { method public static float[] copyOf(float[], int); method public static double[] copyOf(double[], int); method public static boolean[] copyOf(boolean[], int); - method public static T[] copyOfRange(T[], int, int); - method public static T[] copyOfRange(U[], int, int, java.lang.Class<? extends T[]>); + method public static <T> T[] copyOfRange(T[], int, int); + method public static <T, U> T[] copyOfRange(U[], int, int, java.lang.Class<? extends T[]>); method public static byte[] copyOfRange(byte[], int, int); method public static short[] copyOfRange(short[], int, int); method public static int[] copyOfRange(int[], int, int); @@ -58328,15 +58349,15 @@ package java.util { method public static int hashCode(float[]); method public static int hashCode(double[]); method public static int hashCode(java.lang.Object[]); - method public static void parallelPrefix(T[], java.util.function.BinaryOperator<T>); - method public static void parallelPrefix(T[], int, int, java.util.function.BinaryOperator<T>); + method public static <T> void parallelPrefix(T[], java.util.function.BinaryOperator<T>); + method public static <T> void parallelPrefix(T[], int, int, java.util.function.BinaryOperator<T>); method public static void parallelPrefix(long[], java.util.function.LongBinaryOperator); method public static void parallelPrefix(long[], int, int, java.util.function.LongBinaryOperator); method public static void parallelPrefix(double[], java.util.function.DoubleBinaryOperator); method public static void parallelPrefix(double[], int, int, java.util.function.DoubleBinaryOperator); method public static void parallelPrefix(int[], java.util.function.IntBinaryOperator); method public static void parallelPrefix(int[], int, int, java.util.function.IntBinaryOperator); - method public static void parallelSetAll(T[], java.util.function.IntFunction<? extends T>); + method public static <T> void parallelSetAll(T[], java.util.function.IntFunction<? extends T>); method public static void parallelSetAll(int[], java.util.function.IntUnaryOperator); method public static void parallelSetAll(long[], java.util.function.IntToLongFunction); method public static void parallelSetAll(double[], java.util.function.IntToDoubleFunction); @@ -58354,11 +58375,11 @@ package java.util { method public static void parallelSort(float[], int, int); method public static void parallelSort(double[]); method public static void parallelSort(double[], int, int); - method public static void parallelSort(T[]); - method public static void parallelSort(T[], int, int); - method public static void parallelSort(T[], java.util.Comparator<? super T>); - method public static void parallelSort(T[], int, int, java.util.Comparator<? super T>); - method public static void setAll(T[], java.util.function.IntFunction<? extends T>); + method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[]); + method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[], int, int); + method public static <T> void parallelSort(T[], java.util.Comparator<? super T>); + method public static <T> void parallelSort(T[], int, int, java.util.Comparator<? super T>); + method public static <T> void setAll(T[], java.util.function.IntFunction<? extends T>); method public static void setAll(int[], java.util.function.IntUnaryOperator); method public static void setAll(long[], java.util.function.IntToLongFunction); method public static void setAll(double[], java.util.function.IntToDoubleFunction); @@ -58378,18 +58399,18 @@ package java.util { method public static void sort(double[], int, int); method public static void sort(java.lang.Object[]); 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 <T> void sort(T[], java.util.Comparator<? super T>); + method public static <T> void sort(T[], int, int, java.util.Comparator<? super T>); + method public static <T> java.util.Spliterator<T> spliterator(T[]); + method public static <T> 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.util.stream.Stream<T> stream(T[]); - method public static java.util.stream.Stream<T> stream(T[], int, int); + method public static <T> java.util.stream.Stream<T> stream(T[]); + method public static <T> java.util.stream.Stream<T> stream(T[], int, int); method public static java.util.stream.IntStream stream(int[]); method public static java.util.stream.IntStream stream(int[], int, int); method public static java.util.stream.LongStream stream(long[]); @@ -58573,7 +58594,7 @@ package java.util { field protected long time; } - public abstract interface Collection implements java.lang.Iterable { + public abstract interface Collection<E> implements java.lang.Iterable { method public abstract boolean add(E); method public abstract boolean addAll(java.util.Collection<? extends E>); method public abstract void clear(); @@ -58591,86 +58612,86 @@ package java.util { method public abstract int size(); method public default java.util.stream.Stream<E> stream(); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract <T> T[] toArray(T[]); } public class Collections { - method public static boolean addAll(java.util.Collection<? super T>, T...); - method public static java.util.Queue<T> asLifoQueue(java.util.Deque<T>); - method public static int binarySearch(java.util.List<? extends java.lang.Comparable<? super T>>, T); - method public static int binarySearch(java.util.List<? extends T>, T, java.util.Comparator<? super T>); - method public static java.util.Collection<E> checkedCollection(java.util.Collection<E>, java.lang.Class<E>); - method public static java.util.List<E> checkedList(java.util.List<E>, java.lang.Class<E>); - method public static java.util.Map<K, V> checkedMap(java.util.Map<K, V>, java.lang.Class<K>, java.lang.Class<V>); - method public static java.util.Set<E> checkedSet(java.util.Set<E>, java.lang.Class<E>); - method public static java.util.SortedMap<K, V> checkedSortedMap(java.util.SortedMap<K, V>, java.lang.Class<K>, java.lang.Class<V>); - method public static java.util.SortedSet<E> checkedSortedSet(java.util.SortedSet<E>, java.lang.Class<E>); - method public static void copy(java.util.List<? super T>, java.util.List<? extends T>); + method public static <T> boolean addAll(java.util.Collection<? super T>, T...); + method public static <T> java.util.Queue<T> asLifoQueue(java.util.Deque<T>); + method public static <T> int binarySearch(java.util.List<? extends java.lang.Comparable<? super T>>, T); + method public static <T> int binarySearch(java.util.List<? extends T>, T, java.util.Comparator<? super T>); + method public static <E> java.util.Collection<E> checkedCollection(java.util.Collection<E>, java.lang.Class<E>); + method public static <E> java.util.List<E> checkedList(java.util.List<E>, java.lang.Class<E>); + method public static <K, V> java.util.Map<K, V> checkedMap(java.util.Map<K, V>, java.lang.Class<K>, java.lang.Class<V>); + method public static <E> java.util.Set<E> checkedSet(java.util.Set<E>, java.lang.Class<E>); + method public static <K, V> java.util.SortedMap<K, V> checkedSortedMap(java.util.SortedMap<K, V>, java.lang.Class<K>, java.lang.Class<V>); + method public static <E> java.util.SortedSet<E> checkedSortedSet(java.util.SortedSet<E>, java.lang.Class<E>); + method public static <T> void copy(java.util.List<? super T>, java.util.List<? extends T>); method public static boolean disjoint(java.util.Collection<?>, java.util.Collection<?>); - method public static java.util.Enumeration<T> emptyEnumeration(); - method public static java.util.Iterator<T> emptyIterator(); - method public static final java.util.List<T> emptyList(); - method public static java.util.ListIterator<T> emptyListIterator(); - method public static final java.util.Map<K, V> emptyMap(); - method public static final java.util.Set<T> emptySet(); - method public static java.util.Enumeration<T> enumeration(java.util.Collection<T>); - method public static void fill(java.util.List<? super T>, T); + method public static <T> java.util.Enumeration<T> emptyEnumeration(); + method public static <T> java.util.Iterator<T> emptyIterator(); + method public static final <T> java.util.List<T> emptyList(); + method public static <T> java.util.ListIterator<T> emptyListIterator(); + method public static final <K, V> java.util.Map<K, V> emptyMap(); + method public static final <T> java.util.Set<T> emptySet(); + method public static <T> java.util.Enumeration<T> enumeration(java.util.Collection<T>); + method public static <T> void fill(java.util.List<? super T>, T); method public static int frequency(java.util.Collection<?>, java.lang.Object); method public static int indexOfSubList(java.util.List<?>, java.util.List<?>); method public static int lastIndexOfSubList(java.util.List<?>, java.util.List<?>); - method public static java.util.ArrayList<T> list(java.util.Enumeration<T>); - method public static T max(java.util.Collection<? extends T>); - method public static T max(java.util.Collection<? extends T>, java.util.Comparator<? super T>); - method public static T min(java.util.Collection<? extends T>); - method public static T min(java.util.Collection<? extends T>, java.util.Comparator<? super T>); - method public static java.util.List<T> nCopies(int, T); - method public static java.util.Set<E> newSetFromMap(java.util.Map<E, java.lang.Boolean>); - method public static boolean replaceAll(java.util.List<T>, T, T); + method public static <T> java.util.ArrayList<T> list(java.util.Enumeration<T>); + method public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T max(java.util.Collection<? extends T>); + method public static <T> T max(java.util.Collection<? extends T>, java.util.Comparator<? super T>); + method public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T min(java.util.Collection<? extends T>); + method public static <T> T min(java.util.Collection<? extends T>, java.util.Comparator<? super T>); + method public static <T> java.util.List<T> nCopies(int, T); + method public static <E> java.util.Set<E> newSetFromMap(java.util.Map<E, java.lang.Boolean>); + method public static <T> boolean replaceAll(java.util.List<T>, T, T); method public static void reverse(java.util.List<?>); - method public static java.util.Comparator<T> reverseOrder(); - method public static java.util.Comparator<T> reverseOrder(java.util.Comparator<T>); + method public static <T> java.util.Comparator<T> reverseOrder(); + method public static <T> java.util.Comparator<T> reverseOrder(java.util.Comparator<T>); method public static void rotate(java.util.List<?>, int); method public static void shuffle(java.util.List<?>); method public static void shuffle(java.util.List<?>, java.util.Random); - method public static java.util.Set<E> singleton(E); - method public static java.util.List<E> singletonList(E); - method public static java.util.Map<K, V> singletonMap(K, V); - method public static void sort(java.util.List<T>); - method public static void sort(java.util.List<T>, java.util.Comparator<? super T>); + method public static <E> java.util.Set<E> singleton(E); + method public static <E> java.util.List<E> singletonList(E); + method public static <K, V> java.util.Map<K, V> singletonMap(K, V); + method public static <T extends java.lang.Comparable<? super T>> void sort(java.util.List<T>); + method public static <T> void sort(java.util.List<T>, java.util.Comparator<? super T>); method public static void swap(java.util.List<?>, int, int); - method public static java.util.Collection<T> synchronizedCollection(java.util.Collection<T>); - method public static java.util.List<T> synchronizedList(java.util.List<T>); - method public static java.util.Map<K, V> synchronizedMap(java.util.Map<K, V>); - method public static java.util.Set<T> synchronizedSet(java.util.Set<T>); - method public static java.util.SortedMap<K, V> synchronizedSortedMap(java.util.SortedMap<K, V>); - method public static java.util.SortedSet<T> synchronizedSortedSet(java.util.SortedSet<T>); - method public static java.util.Collection<T> unmodifiableCollection(java.util.Collection<? extends T>); - method public static java.util.List<T> unmodifiableList(java.util.List<? extends T>); - method public static java.util.Map<K, V> unmodifiableMap(java.util.Map<? extends K, ? extends V>); - method public static java.util.Set<T> unmodifiableSet(java.util.Set<? extends T>); - method public static java.util.SortedMap<K, V> unmodifiableSortedMap(java.util.SortedMap<K, ? extends V>); - method public static java.util.SortedSet<T> unmodifiableSortedSet(java.util.SortedSet<T>); + method public static <T> java.util.Collection<T> synchronizedCollection(java.util.Collection<T>); + method public static <T> java.util.List<T> synchronizedList(java.util.List<T>); + method public static <K, V> java.util.Map<K, V> synchronizedMap(java.util.Map<K, V>); + method public static <T> java.util.Set<T> synchronizedSet(java.util.Set<T>); + method public static <K, V> java.util.SortedMap<K, V> synchronizedSortedMap(java.util.SortedMap<K, V>); + method public static <T> java.util.SortedSet<T> synchronizedSortedSet(java.util.SortedSet<T>); + method public static <T> java.util.Collection<T> unmodifiableCollection(java.util.Collection<? extends T>); + method public static <T> java.util.List<T> unmodifiableList(java.util.List<? extends T>); + method public static <K, V> java.util.Map<K, V> unmodifiableMap(java.util.Map<? extends K, ? extends V>); + method public static <T> java.util.Set<T> unmodifiableSet(java.util.Set<? extends T>); + method public static <K, V> java.util.SortedMap<K, V> unmodifiableSortedMap(java.util.SortedMap<K, ? extends V>); + method public static <T> java.util.SortedSet<T> unmodifiableSortedSet(java.util.SortedSet<T>); field public static final java.util.List EMPTY_LIST; field public static final java.util.Map EMPTY_MAP; field public static final java.util.Set EMPTY_SET; } - public abstract interface Comparator { + public abstract interface Comparator<T> { method public abstract int compare(T, T); - method public static java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>); - method public static java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>); - method public static java.util.Comparator<T> comparingDouble(java.util.function.ToDoubleFunction<? super T>); - method public static java.util.Comparator<T> comparingInt(java.util.function.ToIntFunction<? super T>); - method public static java.util.Comparator<T> comparingLong(java.util.function.ToLongFunction<? super T>); + method public static <T, U> java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>); + method public static <T, U extends java.lang.Comparable<? super U>> java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>); + method public static <T> java.util.Comparator<T> comparingDouble(java.util.function.ToDoubleFunction<? super T>); + method public static <T> java.util.Comparator<T> comparingInt(java.util.function.ToIntFunction<? super T>); + method public static <T> java.util.Comparator<T> comparingLong(java.util.function.ToLongFunction<? super T>); method public abstract boolean equals(java.lang.Object); - method public static java.util.Comparator<T> naturalOrder(); - method public static java.util.Comparator<T> nullsFirst(java.util.Comparator<? super T>); - method public static java.util.Comparator<T> nullsLast(java.util.Comparator<? super T>); - method public static java.util.Comparator<T> reverseOrder(); + method public static <T extends java.lang.Comparable<? super T>> java.util.Comparator<T> naturalOrder(); + method public static <T> java.util.Comparator<T> nullsFirst(java.util.Comparator<? super T>); + method public static <T> java.util.Comparator<T> nullsLast(java.util.Comparator<? super T>); + method public static <T extends java.lang.Comparable<? super T>> java.util.Comparator<T> reverseOrder(); method public default java.util.Comparator<T> reversed(); method public default java.util.Comparator<T> thenComparing(java.util.Comparator<? super T>); - method public default java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>); - method public default java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>); + method public default <U> java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>); + method public default <U extends java.lang.Comparable<? super U>> java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>); method public default java.util.Comparator<T> thenComparingDouble(java.util.function.ToDoubleFunction<? super T>); method public default java.util.Comparator<T> thenComparingInt(java.util.function.ToIntFunction<? super T>); method public default java.util.Comparator<T> thenComparingLong(java.util.function.ToLongFunction<? super T>); @@ -58729,7 +58750,7 @@ package java.util { method public deprecated java.lang.String toLocaleString(); } - public abstract interface Deque implements java.util.Queue { + public abstract interface Deque<E> implements java.util.Queue { method public abstract boolean add(E); method public abstract void addFirst(E); method public abstract void addLast(E); @@ -58759,7 +58780,7 @@ package java.util { method public abstract int size(); } - public abstract class Dictionary { + public abstract class Dictionary<K, V> { ctor public Dictionary(); method public abstract java.util.Enumeration<V> elements(); method public abstract V get(java.lang.Object); @@ -58790,7 +58811,7 @@ package java.util { ctor public EmptyStackException(); } - public class EnumMap extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable { + public class EnumMap<K extends java.lang.Enum<K>, V> extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable { ctor public EnumMap(java.lang.Class<K>); ctor public EnumMap(java.util.EnumMap<K, ? extends V>); ctor public EnumMap(java.util.Map<K, ? extends V>); @@ -58798,23 +58819,23 @@ package java.util { method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); } - public abstract class EnumSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable { - method public static java.util.EnumSet<E> allOf(java.lang.Class<E>); + public abstract class EnumSet<E extends java.lang.Enum<E>> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable { + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> allOf(java.lang.Class<E>); method public java.util.EnumSet<E> clone(); - method public static java.util.EnumSet<E> complementOf(java.util.EnumSet<E>); - method public static java.util.EnumSet<E> copyOf(java.util.EnumSet<E>); - method public static java.util.EnumSet<E> copyOf(java.util.Collection<E>); - method public static java.util.EnumSet<E> noneOf(java.lang.Class<E>); - method public static java.util.EnumSet<E> of(E); - method public static java.util.EnumSet<E> of(E, E); - method public static java.util.EnumSet<E> of(E, E, E); - method public static java.util.EnumSet<E> of(E, E, E, E); - method public static java.util.EnumSet<E> of(E, E, E, E, E); - method public static java.util.EnumSet<E> of(E, E...); - method public static java.util.EnumSet<E> range(E, E); - } - - public abstract interface Enumeration { + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> complementOf(java.util.EnumSet<E>); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> copyOf(java.util.EnumSet<E>); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> copyOf(java.util.Collection<E>); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> noneOf(java.lang.Class<E>); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E, E); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E, E, E); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E...); + method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> range(E, E); + } + + public abstract interface Enumeration<E> { method public abstract boolean hasMoreElements(); method public abstract E nextElement(); } @@ -58822,7 +58843,7 @@ package java.util { public abstract interface EventListener { } - public abstract class EventListenerProxy implements java.util.EventListener { + public abstract class EventListenerProxy<T extends java.util.EventListener> implements java.util.EventListener { ctor public EventListenerProxy(T); method public T getListener(); } @@ -58908,7 +58929,7 @@ package java.util { field public static final int BC = 0; // 0x0 } - public class HashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class HashMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public HashMap(int, float); ctor public HashMap(int); ctor public HashMap(); @@ -58928,7 +58949,7 @@ package java.util { method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>); } - public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set { + public class HashSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set { ctor public HashSet(); ctor public HashSet(java.util.Collection<? extends E>); ctor public HashSet(int, float); @@ -58939,7 +58960,7 @@ package java.util { method public java.util.Spliterator<E> spliterator(); } - public class Hashtable extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class Hashtable<K, V> extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public Hashtable(int, float); ctor public Hashtable(int); ctor public Hashtable(); @@ -58974,7 +58995,7 @@ package java.util { method public java.util.Collection<V> values(); } - public class IdentityHashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class IdentityHashMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public IdentityHashMap(); ctor public IdentityHashMap(int); ctor public IdentityHashMap(java.util.Map<? extends K, ? extends V>); @@ -59041,14 +59062,14 @@ package java.util { ctor public InvalidPropertiesFormatException(java.lang.String); } - public abstract interface Iterator { + public abstract interface Iterator<E> { method public default void forEachRemaining(java.util.function.Consumer<? super E>); method public abstract boolean hasNext(); method public abstract E next(); method public default void remove(); } - public class LinkedHashMap extends java.util.HashMap implements java.util.Map { + public class LinkedHashMap<K, V> extends java.util.HashMap implements java.util.Map { ctor public LinkedHashMap(int, float); ctor public LinkedHashMap(int); ctor public LinkedHashMap(); @@ -59057,14 +59078,14 @@ package java.util { method protected boolean removeEldestEntry(java.util.Map.Entry<K, V>); } - public class LinkedHashSet extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set { + public class LinkedHashSet<E> extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set { ctor public LinkedHashSet(int, float); ctor public LinkedHashSet(int); ctor public LinkedHashSet(); ctor public LinkedHashSet(java.util.Collection<? extends E>); } - public class LinkedList extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable { + public class LinkedList<E> extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable { ctor public LinkedList(); ctor public LinkedList(java.util.Collection<? extends E>); method public void addFirst(E); @@ -59095,7 +59116,7 @@ package java.util { method public java.util.Spliterator<E> spliterator(); } - public abstract interface List implements java.util.Collection { + public abstract interface List<E> implements java.util.Collection { method public abstract boolean add(E); method public abstract void add(int, E); method public abstract boolean addAll(java.util.Collection<? extends E>); @@ -59122,10 +59143,10 @@ package java.util { method public default void sort(java.util.Comparator<? super E>); method public abstract java.util.List<E> subList(int, int); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract <T> T[] toArray(T[]); } - public abstract interface ListIterator implements java.util.Iterator { + public abstract interface ListIterator<E> implements java.util.Iterator { method public abstract void add(E); method public abstract boolean hasNext(); method public abstract boolean hasPrevious(); @@ -59176,8 +59197,10 @@ package java.util { method public java.util.Set<java.lang.String> getUnicodeLocaleKeys(); method public java.lang.String getUnicodeLocaleType(java.lang.String); method public java.lang.String getVariant(); + method public boolean hasExtensions(); method public static synchronized void setDefault(java.util.Locale); method public static synchronized void setDefault(java.util.Locale.Category, java.util.Locale); + method public java.util.Locale stripExtensions(); method public java.lang.String toLanguageTag(); method public final java.lang.String toString(); field public static final java.util.Locale CANADA; @@ -59242,7 +59265,7 @@ package java.util { method public final long getSum(); } - public abstract interface Map { + public abstract interface Map<K, V> { method public abstract void clear(); method public default V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public default V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>); @@ -59270,11 +59293,11 @@ package java.util { method public abstract java.util.Collection<V> values(); } - 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 static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(); - method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(java.util.Comparator<? super V>); + public static abstract interface Map.Entry<K, V> { + method public static <K extends java.lang.Comparable<? super K>, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(); + method public static <K, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(java.util.Comparator<? super K>); + method public static <K, V extends java.lang.Comparable<? super V>> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(); + method public static <K, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(java.util.Comparator<? super V>); method public abstract boolean equals(java.lang.Object); method public abstract K getKey(); method public abstract V getValue(); @@ -59298,7 +59321,7 @@ package java.util { method public java.lang.String getKey(); } - public abstract interface NavigableMap implements java.util.SortedMap { + public abstract interface NavigableMap<K, V> implements java.util.SortedMap { method public abstract java.util.Map.Entry<K, V> ceilingEntry(K); method public abstract K ceilingKey(K); method public abstract java.util.NavigableSet<K> descendingKeySet(); @@ -59322,7 +59345,7 @@ package java.util { method public abstract java.util.SortedMap<K, V> tailMap(K); } - public abstract interface NavigableSet implements java.util.SortedSet { + public abstract interface NavigableSet<E> implements java.util.SortedSet { method public abstract E ceiling(E); method public abstract java.util.Iterator<E> descendingIterator(); method public abstract java.util.NavigableSet<E> descendingSet(); @@ -59346,16 +59369,16 @@ package java.util { } public final class Objects { - method public static int compare(T, T, java.util.Comparator<? super T>); + method public static <T> int compare(T, T, java.util.Comparator<? super T>); method public static boolean deepEquals(java.lang.Object, java.lang.Object); method public static boolean equals(java.lang.Object, java.lang.Object); method public static int hash(java.lang.Object...); method public static int hashCode(java.lang.Object); method public static boolean isNull(java.lang.Object); method public static boolean nonNull(java.lang.Object); - method public static T requireNonNull(T); - method public static T requireNonNull(T, java.lang.String); - method public static T requireNonNull(T, java.util.function.Supplier<java.lang.String>); + method public static <T> T requireNonNull(T); + method public static <T> T requireNonNull(T, java.lang.String); + method public static <T> T requireNonNull(T, java.util.function.Supplier<java.lang.String>); method public static java.lang.String toString(java.lang.Object); method public static java.lang.String toString(java.lang.Object, java.lang.String); } @@ -59377,19 +59400,19 @@ package java.util { method public abstract void update(java.util.Observable, java.lang.Object); } - public final class Optional { - method public static java.util.Optional<T> empty(); + public final class Optional<T> { + method public static <T> java.util.Optional<T> empty(); method public java.util.Optional<T> filter(java.util.function.Predicate<? super T>); - method public java.util.Optional<U> flatMap(java.util.function.Function<? super T, java.util.Optional<U>>); + method public <U> java.util.Optional<U> flatMap(java.util.function.Function<? super T, java.util.Optional<U>>); method public T get(); method public void ifPresent(java.util.function.Consumer<? super T>); method public boolean isPresent(); - method public java.util.Optional<U> map(java.util.function.Function<? super T, ? extends U>); - method public static java.util.Optional<T> of(T); - method public static java.util.Optional<T> ofNullable(T); + method public <U> java.util.Optional<U> map(java.util.function.Function<? super T, ? extends U>); + method public static <T> java.util.Optional<T> of(T); + method public static <T> java.util.Optional<T> ofNullable(T); method public T orElse(T); method public T orElseGet(java.util.function.Supplier<? extends T>); - method public T orElseThrow(java.util.function.Supplier<? extends X>) throws java.lang.Throwable; + method public <X extends java.lang.Throwable> T orElseThrow(java.util.function.Supplier<? extends X>) throws java.lang.Throwable; } public final class OptionalDouble { @@ -59400,7 +59423,7 @@ package java.util { method public static java.util.OptionalDouble of(double); method public double orElse(double); method public double orElseGet(java.util.function.DoubleSupplier); - method public double orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; + method public <X extends java.lang.Throwable> double orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; } public final class OptionalInt { @@ -59411,7 +59434,7 @@ package java.util { method public static java.util.OptionalInt of(int); method public int orElse(int); method public int orElseGet(java.util.function.IntSupplier); - method public int orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; + method public <X extends java.lang.Throwable> int orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; } public final class OptionalLong { @@ -59422,10 +59445,10 @@ package java.util { method public static java.util.OptionalLong of(long); method public long orElse(long); method public long orElseGet(java.util.function.LongSupplier); - method public long orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; + method public <X extends java.lang.Throwable> long orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable; } - public abstract interface PrimitiveIterator implements java.util.Iterator { + public abstract interface PrimitiveIterator<T, T_CONS> implements java.util.Iterator { method public abstract void forEachRemaining(T_CONS); } @@ -59450,7 +59473,7 @@ package java.util { method public abstract long nextLong(); } - public class PriorityQueue extends java.util.AbstractQueue implements java.io.Serializable { + public class PriorityQueue<E> extends java.util.AbstractQueue implements java.io.Serializable { ctor public PriorityQueue(); ctor public PriorityQueue(int); ctor public PriorityQueue(java.util.Comparator<? super E>); @@ -59499,7 +59522,7 @@ package java.util { method public java.lang.Object handleGetObject(java.lang.String); } - public abstract interface Queue implements java.util.Collection { + public abstract interface Queue<E> implements java.util.Collection { method public abstract boolean add(E); method public abstract E element(); method public abstract boolean offer(E); @@ -59543,6 +59566,7 @@ package java.util { method public static final void clearCache(); method public static final void clearCache(java.lang.ClassLoader); method public boolean containsKey(java.lang.String); + method public java.lang.String getBaseBundleName(); method public static final java.util.ResourceBundle getBundle(java.lang.String); method public static final java.util.ResourceBundle getBundle(java.lang.String, java.util.ResourceBundle.Control); method public static final java.util.ResourceBundle getBundle(java.lang.String, java.util.Locale); @@ -59651,15 +59675,15 @@ package java.util { ctor public ServiceConfigurationError(java.lang.String, java.lang.Throwable); } - public final class ServiceLoader implements java.lang.Iterable { + public final class ServiceLoader<S> implements java.lang.Iterable { method public java.util.Iterator<S> iterator(); - method public static java.util.ServiceLoader<S> load(java.lang.Class<S>, java.lang.ClassLoader); - method public static java.util.ServiceLoader<S> load(java.lang.Class<S>); - method public static java.util.ServiceLoader<S> loadInstalled(java.lang.Class<S>); + method public static <S> java.util.ServiceLoader<S> load(java.lang.Class<S>, java.lang.ClassLoader); + method public static <S> java.util.ServiceLoader<S> load(java.lang.Class<S>); + method public static <S> java.util.ServiceLoader<S> loadInstalled(java.lang.Class<S>); method public void reload(); } - public abstract interface Set implements java.util.Collection { + public abstract interface Set<E> implements java.util.Collection { method public abstract boolean add(E); method public abstract boolean addAll(java.util.Collection<? extends E>); method public abstract void clear(); @@ -59674,7 +59698,7 @@ package java.util { method public abstract boolean retainAll(java.util.Collection<?>); method public abstract int size(); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract <T> T[] toArray(T[]); } public class SimpleTimeZone extends java.util.TimeZone { @@ -59700,7 +59724,7 @@ package java.util { field public static final int WALL_TIME = 0; // 0x0 } - public abstract interface SortedMap implements java.util.Map { + public abstract interface SortedMap<K, V> implements java.util.Map { method public abstract java.util.Comparator<? super K> comparator(); method public abstract java.util.Set<java.util.Map.Entry<K, V>> entrySet(); method public abstract K firstKey(); @@ -59712,7 +59736,7 @@ package java.util { method public abstract java.util.Collection<V> values(); } - public abstract interface SortedSet implements java.util.Set { + public abstract interface SortedSet<E> implements java.util.Set { method public abstract java.util.Comparator<? super E> comparator(); method public abstract E first(); method public abstract java.util.SortedSet<E> headSet(E); @@ -59721,7 +59745,7 @@ package java.util { method public abstract java.util.SortedSet<E> tailSet(E); } - public abstract interface Spliterator { + public abstract interface Spliterator<T> { method public abstract int characteristics(); method public abstract long estimateSize(); method public default void forEachRemaining(java.util.function.Consumer<? super T>); @@ -59764,7 +59788,7 @@ package java.util { method public abstract java.util.Spliterator.OfLong trySplit(); } - public static abstract interface Spliterator.OfPrimitive implements java.util.Spliterator { + public static abstract interface Spliterator.OfPrimitive<T, T_CONS, T_SPLITR extends java.util.Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>> implements java.util.Spliterator { method public default void forEachRemaining(T_CONS); method public abstract boolean tryAdvance(T_CONS); method public abstract T_SPLITR trySplit(); @@ -59774,25 +59798,25 @@ package java.util { 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 <T> java.util.Spliterator<T> emptySpliterator(); + method public static <T> 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 <T> java.util.Spliterator<T> spliterator(java.lang.Object[], int); + method public static <T> 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 <T> java.util.Spliterator<T> spliterator(java.util.Collection<? extends T>, int); + method public static <T> 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 <T> 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); @@ -59819,7 +59843,7 @@ package java.util { method public java.util.Spliterator.OfLong trySplit(); } - public static abstract class Spliterators.AbstractSpliterator implements java.util.Spliterator { + public static abstract class Spliterators.AbstractSpliterator<T> implements java.util.Spliterator { ctor protected Spliterators.AbstractSpliterator(long, int); method public int characteristics(); method public long estimateSize(); @@ -59854,7 +59878,7 @@ package java.util { method public java.util.SplittableRandom split(); } - public class Stack extends java.util.Vector { + public class Stack<E> extends java.util.Vector { ctor public Stack(); method public boolean empty(); method public synchronized E peek(); @@ -59938,7 +59962,7 @@ package java.util { ctor public TooManyListenersException(java.lang.String); } - public class TreeMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable { + public class TreeMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable { ctor public TreeMap(); ctor public TreeMap(java.util.Comparator<? super K>); ctor public TreeMap(java.util.Map<? extends K, ? extends V>); @@ -59975,7 +59999,7 @@ package java.util { method public java.util.SortedMap<K, V> tailMap(K); } - public class TreeSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { + public class TreeSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { ctor public TreeSet(); ctor public TreeSet(java.util.Comparator<? super E>); ctor public TreeSet(java.util.Collection<? extends E>); @@ -60028,7 +60052,7 @@ package java.util { method public java.lang.String getFlags(); } - public class Vector extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { + public class Vector<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public Vector(int, int); ctor public Vector(int); ctor public Vector(); @@ -60063,7 +60087,7 @@ package java.util { field protected java.lang.Object[] elementData; } - public class WeakHashMap extends java.util.AbstractMap implements java.util.Map { + public class WeakHashMap<K, V> extends java.util.AbstractMap implements java.util.Map { ctor public WeakHashMap(int, float); ctor public WeakHashMap(int); ctor public WeakHashMap(); @@ -60079,18 +60103,18 @@ package java.util.concurrent { public abstract class AbstractExecutorService implements java.util.concurrent.ExecutorService { ctor public AbstractExecutorService(); - method public java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException; - method public java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; - method public T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; - method protected java.util.concurrent.RunnableFuture<T> newTaskFor(java.lang.Runnable, T); - method protected java.util.concurrent.RunnableFuture<T> newTaskFor(java.util.concurrent.Callable<T>); + method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException; + method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; + method public <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; + method protected <T> java.util.concurrent.RunnableFuture<T> newTaskFor(java.lang.Runnable, T); + method protected <T> java.util.concurrent.RunnableFuture<T> newTaskFor(java.util.concurrent.Callable<T>); method public java.util.concurrent.Future<?> submit(java.lang.Runnable); - method public java.util.concurrent.Future<T> submit(java.lang.Runnable, T); - method public java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>); + method public <T> java.util.concurrent.Future<T> submit(java.lang.Runnable, T); + method public <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>); } - public class ArrayBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class ArrayBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public ArrayBlockingQueue(int); ctor public ArrayBlockingQueue(int, boolean); ctor public ArrayBlockingQueue(int, boolean, java.util.Collection<? extends E>); @@ -60109,7 +60133,7 @@ package java.util.concurrent { method public E take() throws java.lang.InterruptedException; } - public abstract interface BlockingDeque implements java.util.concurrent.BlockingQueue java.util.Deque { + public abstract interface BlockingDeque<E> implements java.util.concurrent.BlockingQueue java.util.Deque { method public abstract boolean add(E); method public abstract void addFirst(E); method public abstract void addLast(E); @@ -60141,7 +60165,7 @@ package java.util.concurrent { method public abstract E takeLast() throws java.lang.InterruptedException; } - public abstract interface BlockingQueue implements java.util.Queue { + public abstract interface BlockingQueue<E> implements java.util.Queue { method public abstract boolean add(E); method public abstract boolean contains(java.lang.Object); method public abstract int drainTo(java.util.Collection<? super E>); @@ -60160,7 +60184,7 @@ package java.util.concurrent { ctor public BrokenBarrierException(java.lang.String); } - public abstract interface Callable { + public abstract interface Callable<V> { method public abstract V call() throws java.lang.Exception; } @@ -60169,28 +60193,28 @@ package java.util.concurrent { ctor public CancellationException(java.lang.String); } - public class CompletableFuture implements java.util.concurrent.CompletionStage java.util.concurrent.Future { + public class CompletableFuture<T> implements java.util.concurrent.CompletionStage java.util.concurrent.Future { ctor public CompletableFuture(); method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor); method public static java.util.concurrent.CompletableFuture<java.lang.Void> allOf(java.util.concurrent.CompletableFuture<?>...); method public static java.util.concurrent.CompletableFuture<java.lang.Object> anyOf(java.util.concurrent.CompletableFuture<?>...); - method public java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); - method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); - method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); + method public <U> java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public <U> java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public <U> java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); method public boolean cancel(boolean); method public boolean complete(T); method public boolean completeExceptionally(java.lang.Throwable); - method public static java.util.concurrent.CompletableFuture<U> completedFuture(U); + method public static <U> java.util.concurrent.CompletableFuture<U> completedFuture(U); method public java.util.concurrent.CompletableFuture<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>); method public T get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; method public T get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; method public T getNow(T); method public int getNumberOfDependents(); - method public java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); - method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); - method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); + method public <U> java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public <U> java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public <U> java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); method public boolean isCancelled(); method public boolean isCompletedExceptionally(); method public boolean isDone(); @@ -60205,23 +60229,23 @@ package java.util.concurrent { method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable); method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable, java.util.concurrent.Executor); - method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>); - method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>, java.util.concurrent.Executor); + method public static <U> java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>); + method public static <U> java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>, java.util.concurrent.Executor); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); - method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); - method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T, ? extends U>); - method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); - method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); - method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); - method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); - method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); - method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); + method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); + method public <U> java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T, ? extends U>); + method public <U> java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); + method public <U> java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); + method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); + method public <U> java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public <U> java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public <U> java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRun(java.lang.Runnable); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable); method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); @@ -60241,7 +60265,7 @@ package java.util.concurrent { ctor public CompletionException(java.lang.Throwable); } - public abstract interface CompletionService { + public abstract interface CompletionService<V> { method public abstract java.util.concurrent.Future<V> poll(); method public abstract java.util.concurrent.Future<V> poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; method public abstract java.util.concurrent.Future<V> submit(java.util.concurrent.Callable<V>); @@ -60249,17 +60273,17 @@ package java.util.concurrent { method public abstract java.util.concurrent.Future<V> take() throws java.lang.InterruptedException; } - public abstract interface CompletionStage { + public abstract interface CompletionStage<T> { method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); - method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); - method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); + method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>); - method public abstract java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); - method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); - method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); + method public abstract <U> java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBoth(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); @@ -60269,18 +60293,18 @@ package java.util.concurrent { method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); - method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); - method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T, ? extends U>); - method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); - method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); - method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); - method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); - method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); - method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); + method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T, ? extends U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); + method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public abstract <U> java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRun(java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); @@ -60290,7 +60314,7 @@ package java.util.concurrent { method public abstract java.util.concurrent.CompletionStage<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>, java.util.concurrent.Executor); } - public class ConcurrentHashMap extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable { + public class ConcurrentHashMap<K, V> extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable { ctor public ConcurrentHashMap(); ctor public ConcurrentHashMap(int); ctor public ConcurrentHashMap(java.util.Map<? extends K, ? extends V>); @@ -60304,29 +60328,29 @@ package java.util.concurrent { method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); method public void forEach(long, java.util.function.BiConsumer<? super K, ? super V>); - method public void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>); + method public <U> void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>); method public void forEachEntry(long, java.util.function.Consumer<? super java.util.Map.Entry<K, V>>); - method public void forEachEntry(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.Consumer<? super U>); + method public <U> void forEachEntry(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.Consumer<? super U>); method public void forEachKey(long, java.util.function.Consumer<? super K>); - method public void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>); + method public <U> void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>); method public void forEachValue(long, java.util.function.Consumer<? super V>); - method public void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>); + method public <U> void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>); method public V getOrDefault(java.lang.Object, V); method public java.util.concurrent.ConcurrentHashMap.KeySetView<K, V> keySet(V); method public java.util.Enumeration<K> keys(); method public long mappingCount(); method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>); - method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(); - method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int); + method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(); + method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int); method public V putIfAbsent(K, V); - method public U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public <U> U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); method public java.util.Map.Entry<K, V> reduceEntries(long, java.util.function.BiFunction<java.util.Map.Entry<K, V>, java.util.Map.Entry<K, V>, ? extends java.util.Map.Entry<K, V>>); - method public U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public <U> U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); method public double reduceEntriesToDouble(long, java.util.function.ToDoubleFunction<java.util.Map.Entry<K, V>>, double, java.util.function.DoubleBinaryOperator); method public int reduceEntriesToInt(long, java.util.function.ToIntFunction<java.util.Map.Entry<K, V>>, int, java.util.function.IntBinaryOperator); method public long reduceEntriesToLong(long, java.util.function.ToLongFunction<java.util.Map.Entry<K, V>>, long, java.util.function.LongBinaryOperator); method public K reduceKeys(long, java.util.function.BiFunction<? super K, ? super K, ? extends K>); - method public U reduceKeys(long, java.util.function.Function<? super K, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public <U> U reduceKeys(long, java.util.function.Function<? super K, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); method public double reduceKeysToDouble(long, java.util.function.ToDoubleFunction<? super K>, double, java.util.function.DoubleBinaryOperator); method public int reduceKeysToInt(long, java.util.function.ToIntFunction<? super K>, int, java.util.function.IntBinaryOperator); method public long reduceKeysToLong(long, java.util.function.ToLongFunction<? super K>, long, java.util.function.LongBinaryOperator); @@ -60334,7 +60358,7 @@ package java.util.concurrent { method public int reduceToInt(long, java.util.function.ToIntBiFunction<? super K, ? super V>, int, java.util.function.IntBinaryOperator); method public long reduceToLong(long, java.util.function.ToLongBiFunction<? super K, ? super V>, long, java.util.function.LongBinaryOperator); method public V reduceValues(long, java.util.function.BiFunction<? super V, ? super V, ? extends V>); - method public U reduceValues(long, java.util.function.Function<? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public <U> U reduceValues(long, java.util.function.Function<? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); method public double reduceValuesToDouble(long, java.util.function.ToDoubleFunction<? super V>, double, java.util.function.DoubleBinaryOperator); method public int reduceValuesToInt(long, java.util.function.ToIntFunction<? super V>, int, java.util.function.IntBinaryOperator); method public long reduceValuesToLong(long, java.util.function.ToLongFunction<? super V>, long, java.util.function.LongBinaryOperator); @@ -60342,13 +60366,13 @@ package java.util.concurrent { method public boolean replace(K, V, V); method public V replace(K, V); method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>); - method public U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>); - method public U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>); - method public U searchKeys(long, java.util.function.Function<? super K, ? extends U>); - method public U searchValues(long, java.util.function.Function<? super V, ? extends U>); + method public <U> U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>); + method public <U> U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>); + method public <U> U searchKeys(long, java.util.function.Function<? super K, ? extends U>); + method public <U> U searchValues(long, java.util.function.Function<? super V, ? extends U>); } - static abstract class ConcurrentHashMap.CollectionView implements java.util.Collection java.io.Serializable { + static abstract class ConcurrentHashMap.CollectionView<K, V, E> implements java.util.Collection java.io.Serializable { method public final void clear(); method public abstract boolean contains(java.lang.Object); method public final boolean containsAll(java.util.Collection<?>); @@ -60360,11 +60384,11 @@ package java.util.concurrent { method public final boolean retainAll(java.util.Collection<?>); method public final int size(); method public final java.lang.Object[] toArray(); - method public final T[] toArray(T[]); + method public final <T> T[] toArray(T[]); method public final java.lang.String toString(); } - public static class ConcurrentHashMap.KeySetView extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set { + public static class ConcurrentHashMap.KeySetView<K, V> extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set { method public boolean add(K); method public boolean addAll(java.util.Collection<? extends K>); method public boolean contains(java.lang.Object); @@ -60375,7 +60399,7 @@ package java.util.concurrent { method public java.util.Spliterator<K> spliterator(); } - public class ConcurrentLinkedDeque extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable { + public class ConcurrentLinkedDeque<E> extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable { ctor public ConcurrentLinkedDeque(); ctor public ConcurrentLinkedDeque(java.util.Collection<? extends E>); method public void addFirst(E); @@ -60405,7 +60429,7 @@ package java.util.concurrent { method public java.util.Spliterator<E> spliterator(); } - public class ConcurrentLinkedQueue extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable { + public class ConcurrentLinkedQueue<E> extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable { ctor public ConcurrentLinkedQueue(); ctor public ConcurrentLinkedQueue(java.util.Collection<? extends E>); method public java.util.Iterator<E> iterator(); @@ -60416,14 +60440,14 @@ package java.util.concurrent { method public java.util.Spliterator<E> spliterator(); } - public abstract interface ConcurrentMap implements java.util.Map { + public abstract interface ConcurrentMap<K, V> implements java.util.Map { method public abstract V putIfAbsent(K, V); method public abstract boolean remove(java.lang.Object, java.lang.Object); method public abstract boolean replace(K, V, V); method public abstract V replace(K, V); } - public abstract interface ConcurrentNavigableMap implements java.util.concurrent.ConcurrentMap java.util.NavigableMap { + public abstract interface ConcurrentNavigableMap<K, V> implements java.util.concurrent.ConcurrentMap java.util.NavigableMap { method public abstract java.util.NavigableSet<K> descendingKeySet(); method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> descendingMap(); method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K, boolean); @@ -60436,7 +60460,7 @@ package java.util.concurrent { method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K); } - public class ConcurrentSkipListMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable { + public class ConcurrentSkipListMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable { ctor public ConcurrentSkipListMap(); ctor public ConcurrentSkipListMap(java.util.Comparator<? super K>); ctor public ConcurrentSkipListMap(java.util.Map<? extends K, ? extends V>); @@ -60480,7 +60504,7 @@ package java.util.concurrent { method public java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K); } - public class ConcurrentSkipListSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { + public class ConcurrentSkipListSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { ctor public ConcurrentSkipListSet(); ctor public ConcurrentSkipListSet(java.util.Comparator<? super E>); ctor public ConcurrentSkipListSet(java.util.Collection<? extends E>); @@ -60508,7 +60532,7 @@ package java.util.concurrent { method public java.util.NavigableSet<E> tailSet(E); } - public class CopyOnWriteArrayList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { + public class CopyOnWriteArrayList<E> implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public CopyOnWriteArrayList(); ctor public CopyOnWriteArrayList(java.util.Collection<? extends E>); ctor public CopyOnWriteArrayList(E[]); @@ -60540,10 +60564,10 @@ package java.util.concurrent { method public int size(); method public java.util.List<E> subList(int, int); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public <T> T[] toArray(T[]); } - public class CopyOnWriteArraySet extends java.util.AbstractSet implements java.io.Serializable { + public class CopyOnWriteArraySet<E> extends java.util.AbstractSet implements java.io.Serializable { ctor public CopyOnWriteArraySet(); ctor public CopyOnWriteArraySet(java.util.Collection<? extends E>); method public void forEach(java.util.function.Consumer<? super E>); @@ -60561,7 +60585,7 @@ package java.util.concurrent { method public long getCount(); } - public abstract class CountedCompleter extends java.util.concurrent.ForkJoinTask { + public abstract class CountedCompleter<T> extends java.util.concurrent.ForkJoinTask { ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>, int); ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>); ctor protected CountedCompleter(); @@ -60598,7 +60622,7 @@ package java.util.concurrent { method public void reset(); } - public class DelayQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue { + public class DelayQueue<E extends java.util.concurrent.Delayed> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue { ctor public DelayQueue(); ctor public DelayQueue(java.util.Collection<? extends E>); method public int drainTo(java.util.Collection<? super E>); @@ -60619,7 +60643,7 @@ package java.util.concurrent { method public abstract long getDelay(java.util.concurrent.TimeUnit); } - public class Exchanger { + public class Exchanger<V> { ctor public Exchanger(); method public V exchange(V) throws java.lang.InterruptedException; method public V exchange(V, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException, java.util.concurrent.TimeoutException; @@ -60636,7 +60660,7 @@ package java.util.concurrent { method public abstract void execute(java.lang.Runnable); } - public class ExecutorCompletionService implements java.util.concurrent.CompletionService { + public class ExecutorCompletionService<V> implements java.util.concurrent.CompletionService { ctor public ExecutorCompletionService(java.util.concurrent.Executor); ctor public ExecutorCompletionService(java.util.concurrent.Executor, java.util.concurrent.BlockingQueue<java.util.concurrent.Future<V>>); method public java.util.concurrent.Future<V> poll(); @@ -60648,21 +60672,21 @@ package java.util.concurrent { public abstract interface ExecutorService implements java.util.concurrent.Executor { method public abstract boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public abstract java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException; - method public abstract java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public abstract T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; - method public abstract T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; + method public abstract <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException; + method public abstract <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public abstract <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; + method public abstract <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; method public abstract boolean isShutdown(); method public abstract boolean isTerminated(); method public abstract void shutdown(); method public abstract java.util.List<java.lang.Runnable> shutdownNow(); - method public abstract java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>); - method public abstract java.util.concurrent.Future<T> submit(java.lang.Runnable, T); + method public abstract <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>); + method public abstract <T> java.util.concurrent.Future<T> submit(java.lang.Runnable, T); method public abstract java.util.concurrent.Future<?> submit(java.lang.Runnable); } public class Executors { - method public static java.util.concurrent.Callable<T> callable(java.lang.Runnable, T); + method public static <T> java.util.concurrent.Callable<T> callable(java.lang.Runnable, T); method public static java.util.concurrent.Callable<java.lang.Object> callable(java.lang.Runnable); method public static java.util.concurrent.Callable<java.lang.Object> callable(java.security.PrivilegedAction<?>); method public static java.util.concurrent.Callable<java.lang.Object> callable(java.security.PrivilegedExceptionAction<?>); @@ -60679,8 +60703,8 @@ package java.util.concurrent { method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor(java.util.concurrent.ThreadFactory); method public static java.util.concurrent.ExecutorService newWorkStealingPool(int); method public static java.util.concurrent.ExecutorService newWorkStealingPool(); - method public static java.util.concurrent.Callable<T> privilegedCallable(java.util.concurrent.Callable<T>); - method public static java.util.concurrent.Callable<T> privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable<T>); + method public static <T> java.util.concurrent.Callable<T> privilegedCallable(java.util.concurrent.Callable<T>); + method public static <T> java.util.concurrent.Callable<T> privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable<T>); method public static java.util.concurrent.ThreadFactory privilegedThreadFactory(); method public static java.util.concurrent.ExecutorService unconfigurableExecutorService(java.util.concurrent.ExecutorService); method public static java.util.concurrent.ScheduledExecutorService unconfigurableScheduledExecutorService(java.util.concurrent.ScheduledExecutorService); @@ -60708,7 +60732,7 @@ package java.util.concurrent { method public long getStealCount(); method public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler(); method public boolean hasQueuedSubmissions(); - method public T invoke(java.util.concurrent.ForkJoinTask<T>); + method public <T> T invoke(java.util.concurrent.ForkJoinTask<T>); method public boolean isQuiescent(); method public boolean isShutdown(); method public boolean isTerminated(); @@ -60717,7 +60741,7 @@ package java.util.concurrent { method protected java.util.concurrent.ForkJoinTask<?> pollSubmission(); method public void shutdown(); method public java.util.List<java.lang.Runnable> shutdownNow(); - method public java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.ForkJoinTask<T>); + method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.ForkJoinTask<T>); field public static final java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory; } @@ -60730,11 +60754,11 @@ package java.util.concurrent { method public abstract boolean isReleasable(); } - public abstract class ForkJoinTask implements java.util.concurrent.Future java.io.Serializable { + public abstract class ForkJoinTask<V> implements java.util.concurrent.Future java.io.Serializable { ctor public ForkJoinTask(); method public static java.util.concurrent.ForkJoinTask<?> adapt(java.lang.Runnable); - method public static java.util.concurrent.ForkJoinTask<T> adapt(java.lang.Runnable, T); - method public static java.util.concurrent.ForkJoinTask<T> adapt(java.util.concurrent.Callable<? extends T>); + method public static <T> java.util.concurrent.ForkJoinTask<T> adapt(java.lang.Runnable, T); + method public static <T> java.util.concurrent.ForkJoinTask<T> adapt(java.util.concurrent.Callable<? extends T>); method public boolean cancel(boolean); method public final boolean compareAndSetForkJoinTaskTag(short, short); method public void complete(V); @@ -60754,7 +60778,7 @@ package java.util.concurrent { method public final V invoke(); method public static void invokeAll(java.util.concurrent.ForkJoinTask<?>, java.util.concurrent.ForkJoinTask<?>); method public static void invokeAll(java.util.concurrent.ForkJoinTask<?>...); - method public static java.util.Collection<T> invokeAll(java.util.Collection<T>); + method public static <T extends java.util.concurrent.ForkJoinTask<?>> java.util.Collection<T> invokeAll(java.util.Collection<T>); method public final boolean isCancelled(); method public final boolean isCompletedAbnormally(); method public final boolean isCompletedNormally(); @@ -60780,7 +60804,7 @@ package java.util.concurrent { method protected void onTermination(java.lang.Throwable); } - public abstract interface Future { + public abstract interface Future<V> { method public abstract boolean cancel(boolean); method public abstract V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; method public abstract V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; @@ -60788,7 +60812,7 @@ package java.util.concurrent { method public abstract boolean isDone(); } - public class FutureTask implements java.util.concurrent.RunnableFuture { + public class FutureTask<V> implements java.util.concurrent.RunnableFuture { ctor public FutureTask(java.util.concurrent.Callable<V>); ctor public FutureTask(java.lang.Runnable, V); method public boolean cancel(boolean); @@ -60803,7 +60827,7 @@ package java.util.concurrent { method protected void setException(java.lang.Throwable); } - public class LinkedBlockingDeque extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable { + public class LinkedBlockingDeque<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable { ctor public LinkedBlockingDeque(); ctor public LinkedBlockingDeque(int); ctor public LinkedBlockingDeque(java.util.Collection<? extends E>); @@ -60847,7 +60871,7 @@ package java.util.concurrent { method public E takeLast() throws java.lang.InterruptedException; } - public class LinkedBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class LinkedBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public LinkedBlockingQueue(); ctor public LinkedBlockingQueue(int); ctor public LinkedBlockingQueue(java.util.Collection<? extends E>); @@ -60866,7 +60890,7 @@ package java.util.concurrent { method public E take() throws java.lang.InterruptedException; } - public class LinkedTransferQueue extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue { + public class LinkedTransferQueue<E> extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue { ctor public LinkedTransferQueue(); ctor public LinkedTransferQueue(java.util.Collection<? extends E>); method public int drainTo(java.util.Collection<? super E>); @@ -60913,7 +60937,7 @@ package java.util.concurrent { method public int register(); } - public class PriorityBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class PriorityBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public PriorityBlockingQueue(); ctor public PriorityBlockingQueue(int); ctor public PriorityBlockingQueue(int, java.util.Comparator<? super E>); @@ -60942,7 +60966,7 @@ package java.util.concurrent { method protected final void setRawResult(java.lang.Void); } - public abstract class RecursiveTask extends java.util.concurrent.ForkJoinTask { + public abstract class RecursiveTask<V> extends java.util.concurrent.ForkJoinTask { ctor public RecursiveTask(); method protected abstract V compute(); method protected final boolean exec(); @@ -60961,22 +60985,22 @@ package java.util.concurrent { method public abstract void rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor); } - public abstract interface RunnableFuture implements java.util.concurrent.Future java.lang.Runnable { + public abstract interface RunnableFuture<V> implements java.util.concurrent.Future java.lang.Runnable { method public abstract void run(); } - public abstract interface RunnableScheduledFuture implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture { + public abstract interface RunnableScheduledFuture<V> implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture { method public abstract boolean isPeriodic(); } public abstract interface ScheduledExecutorService implements java.util.concurrent.ExecutorService { method public abstract java.util.concurrent.ScheduledFuture<?> schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit); - method public abstract java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit); + method public abstract <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit); method public abstract java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public abstract java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); } - public abstract interface ScheduledFuture implements java.util.concurrent.Delayed java.util.concurrent.Future { + public abstract interface ScheduledFuture<V> implements java.util.concurrent.Delayed java.util.concurrent.Future { } public class ScheduledThreadPoolExecutor extends java.util.concurrent.ThreadPoolExecutor implements java.util.concurrent.ScheduledExecutorService { @@ -60984,13 +61008,13 @@ package java.util.concurrent { ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory); ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.RejectedExecutionHandler); ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory, java.util.concurrent.RejectedExecutionHandler); - method protected java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture<V>); - method protected java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.util.concurrent.Callable<V>, java.util.concurrent.RunnableScheduledFuture<V>); + method protected <V> java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture<V>); + method protected <V> java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.util.concurrent.Callable<V>, java.util.concurrent.RunnableScheduledFuture<V>); method public boolean getContinueExistingPeriodicTasksAfterShutdownPolicy(); method public boolean getExecuteExistingDelayedTasksAfterShutdownPolicy(); method public boolean getRemoveOnCancelPolicy(); method public java.util.concurrent.ScheduledFuture<?> schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit); - method public java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit); + method public <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit); method public java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean); @@ -61020,7 +61044,7 @@ package java.util.concurrent { method public boolean tryAcquire(int, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; } - public class SynchronousQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class SynchronousQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public SynchronousQueue(); ctor public SynchronousQueue(boolean); method public int drainTo(java.util.Collection<? super E>); @@ -61138,7 +61162,7 @@ package java.util.concurrent { ctor public TimeoutException(java.lang.String); } - public abstract interface TransferQueue implements java.util.concurrent.BlockingQueue { + public abstract interface TransferQueue<E> implements java.util.concurrent.BlockingQueue { method public abstract int getWaitingConsumerCount(); method public abstract boolean hasWaitingConsumer(); method public abstract void transfer(E) throws java.lang.InterruptedException; @@ -61208,7 +61232,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, int, int); } - public abstract class AtomicIntegerFieldUpdater { + public abstract class AtomicIntegerFieldUpdater<T> { ctor protected AtomicIntegerFieldUpdater(); method public final int accumulateAndGet(T, int, java.util.function.IntBinaryOperator); method public int addAndGet(T, int); @@ -61223,7 +61247,7 @@ package java.util.concurrent.atomic { method public final int getAndUpdate(T, java.util.function.IntUnaryOperator); method public int incrementAndGet(T); method public abstract void lazySet(T, int); - method public static java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); + method public static <U> java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); method public abstract void set(T, int); method public final int updateAndGet(T, java.util.function.IntUnaryOperator); method public abstract boolean weakCompareAndSet(T, int, int); @@ -61276,7 +61300,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, long, long); } - public abstract class AtomicLongFieldUpdater { + public abstract class AtomicLongFieldUpdater<T> { ctor protected AtomicLongFieldUpdater(); method public final long accumulateAndGet(T, long, java.util.function.LongBinaryOperator); method public long addAndGet(T, long); @@ -61291,13 +61315,13 @@ package java.util.concurrent.atomic { method public final long getAndUpdate(T, java.util.function.LongUnaryOperator); method public long incrementAndGet(T); method public abstract void lazySet(T, long); - method public static java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); + method public static <U> java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); method public abstract void set(T, long); method public final long updateAndGet(T, java.util.function.LongUnaryOperator); method public abstract boolean weakCompareAndSet(T, long, long); } - public class AtomicMarkableReference { + public class AtomicMarkableReference<V> { ctor public AtomicMarkableReference(V, boolean); method public boolean attemptMark(V, boolean); method public boolean compareAndSet(V, V, boolean, boolean); @@ -61308,7 +61332,7 @@ package java.util.concurrent.atomic { method public boolean weakCompareAndSet(V, V, boolean, boolean); } - public class AtomicReference implements java.io.Serializable { + public class AtomicReference<V> implements java.io.Serializable { ctor public AtomicReference(V); ctor public AtomicReference(); method public final V accumulateAndGet(V, java.util.function.BinaryOperator<V>); @@ -61323,7 +61347,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(V, V); } - public class AtomicReferenceArray implements java.io.Serializable { + public class AtomicReferenceArray<E> implements java.io.Serializable { ctor public AtomicReferenceArray(int); ctor public AtomicReferenceArray(E[]); method public final E accumulateAndGet(int, E, java.util.function.BinaryOperator<E>); @@ -61339,7 +61363,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, E, E); } - public abstract class AtomicReferenceFieldUpdater { + public abstract class AtomicReferenceFieldUpdater<T, V> { ctor protected AtomicReferenceFieldUpdater(); method public final V accumulateAndGet(T, V, java.util.function.BinaryOperator<V>); method public abstract boolean compareAndSet(T, V, V); @@ -61348,13 +61372,13 @@ package java.util.concurrent.atomic { method public V getAndSet(T, V); method public final V getAndUpdate(T, java.util.function.UnaryOperator<V>); method public abstract void lazySet(T, V); - method public static java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U, W> newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String); + method public static <U, W> java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U, W> newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String); method public abstract void set(T, V); method public final V updateAndGet(T, java.util.function.UnaryOperator<V>); method public abstract boolean weakCompareAndSet(T, V, V); } - public class AtomicStampedReference { + public class AtomicStampedReference<V> { ctor public AtomicStampedReference(V, int); method public boolean attemptStamp(V, int); method public boolean compareAndSet(V, V, int, int); @@ -61657,33 +61681,33 @@ package java.util.concurrent.locks { package java.util.function { - public abstract interface BiConsumer { + public abstract interface BiConsumer<T, U> { method public abstract void accept(T, U); method public default java.util.function.BiConsumer<T, U> andThen(java.util.function.BiConsumer<? super T, ? super U>); } - public abstract interface BiFunction { - method public default java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>); + public abstract interface BiFunction<T, U, R> { + method public default <V> java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>); method public abstract R apply(T, U); } - public abstract interface BiPredicate { + public abstract interface BiPredicate<T, U> { method public default java.util.function.BiPredicate<T, U> and(java.util.function.BiPredicate<? super T, ? super U>); method public default java.util.function.BiPredicate<T, U> negate(); method public default java.util.function.BiPredicate<T, U> or(java.util.function.BiPredicate<? super T, ? super U>); method public abstract boolean test(T, U); } - public abstract interface BinaryOperator implements java.util.function.BiFunction { - method public static java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>); - method public static java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>); + public abstract interface BinaryOperator<T> implements java.util.function.BiFunction { + method public static <T> java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>); + method public static <T> java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>); } public abstract interface BooleanSupplier { method public abstract boolean getAsBoolean(); } - public abstract interface Consumer { + public abstract interface Consumer<T> { method public abstract void accept(T); method public default java.util.function.Consumer<T> andThen(java.util.function.Consumer<? super T>); } @@ -61697,7 +61721,7 @@ package java.util.function { method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer); } - public abstract interface DoubleFunction { + public abstract interface DoubleFunction<R> { method public abstract R apply(double); } @@ -61727,11 +61751,11 @@ package java.util.function { method public static java.util.function.DoubleUnaryOperator identity(); } - public abstract interface Function { - method public default java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>); + public abstract interface Function<T, R> { + method public default <V> java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>); method public abstract R apply(T); - method public default java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>); - method public static java.util.function.Function<T, T> identity(); + method public default <V> java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>); + method public static <T> java.util.function.Function<T, T> identity(); } public abstract interface IntBinaryOperator { @@ -61743,7 +61767,7 @@ package java.util.function { method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer); } - public abstract interface IntFunction { + public abstract interface IntFunction<R> { method public abstract R apply(int); } @@ -61782,7 +61806,7 @@ package java.util.function { method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer); } - public abstract interface LongFunction { + public abstract interface LongFunction<R> { method public abstract R apply(long); } @@ -61812,56 +61836,56 @@ package java.util.function { method public static java.util.function.LongUnaryOperator identity(); } - public abstract interface ObjDoubleConsumer { + public abstract interface ObjDoubleConsumer<T> { method public abstract void accept(T, double); } - public abstract interface ObjIntConsumer { + public abstract interface ObjIntConsumer<T> { method public abstract void accept(T, int); } - public abstract interface ObjLongConsumer { + public abstract interface ObjLongConsumer<T> { method public abstract void accept(T, long); } - public abstract interface Predicate { + public abstract interface Predicate<T> { method public default java.util.function.Predicate<T> and(java.util.function.Predicate<? super T>); - method public static java.util.function.Predicate<T> isEqual(java.lang.Object); + method public static <T> java.util.function.Predicate<T> isEqual(java.lang.Object); method public default java.util.function.Predicate<T> negate(); method public default java.util.function.Predicate<T> or(java.util.function.Predicate<? super T>); method public abstract boolean test(T); } - public abstract interface Supplier { + public abstract interface Supplier<T> { method public abstract T get(); } - public abstract interface ToDoubleBiFunction { + public abstract interface ToDoubleBiFunction<T, U> { method public abstract double applyAsDouble(T, U); } - public abstract interface ToDoubleFunction { + public abstract interface ToDoubleFunction<T> { method public abstract double applyAsDouble(T); } - public abstract interface ToIntBiFunction { + public abstract interface ToIntBiFunction<T, U> { method public abstract int applyAsInt(T, U); } - public abstract interface ToIntFunction { + public abstract interface ToIntFunction<T> { method public abstract int applyAsInt(T); } - public abstract interface ToLongBiFunction { + public abstract interface ToLongBiFunction<T, U> { method public abstract long applyAsLong(T, U); } - public abstract interface ToLongFunction { + public abstract interface ToLongFunction<T> { method public abstract long applyAsLong(T); } - public abstract interface UnaryOperator implements java.util.function.Function { - method public static java.util.function.UnaryOperator<T> identity(); + public abstract interface UnaryOperator<T> implements java.util.function.Function { + method public static <T> java.util.function.UnaryOperator<T> identity(); } } @@ -62449,7 +62473,7 @@ package java.util.regex { package java.util.stream { - public abstract interface BaseStream implements java.lang.AutoCloseable { + public abstract interface BaseStream<T, S extends java.util.stream.BaseStream<T, S>> implements java.lang.AutoCloseable { method public abstract void close(); method public abstract boolean isParallel(); method public abstract java.util.Iterator<T> iterator(); @@ -62460,13 +62484,13 @@ package java.util.stream { method public abstract S unordered(); } - public abstract interface Collector { + public abstract interface Collector<T, A, R> { method public abstract java.util.function.BiConsumer<A, T> accumulator(); method public abstract java.util.Set<java.util.stream.Collector.Characteristics> characteristics(); method public abstract java.util.function.BinaryOperator<A> combiner(); method public abstract java.util.function.Function<A, R> finisher(); - method public static java.util.stream.Collector<T, R, R> of(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, T>, java.util.function.BinaryOperator<R>, java.util.stream.Collector.Characteristics...); - method public static java.util.stream.Collector<T, A, R> of(java.util.function.Supplier<A>, java.util.function.BiConsumer<A, T>, java.util.function.BinaryOperator<A>, java.util.function.Function<A, R>, java.util.stream.Collector.Characteristics...); + method public static <T, R> java.util.stream.Collector<T, R, R> of(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, T>, java.util.function.BinaryOperator<R>, java.util.stream.Collector.Characteristics...); + method public static <T, A, R> java.util.stream.Collector<T, A, R> of(java.util.function.Supplier<A>, java.util.function.BiConsumer<A, T>, java.util.function.BinaryOperator<A>, java.util.function.Function<A, R>, java.util.stream.Collector.Characteristics...); method public abstract java.util.function.Supplier<A> supplier(); } @@ -62479,43 +62503,43 @@ package java.util.stream { } public final class Collectors { - method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingDouble(java.util.function.ToDoubleFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingInt(java.util.function.ToIntFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingLong(java.util.function.ToLongFunction<? super T>); - method public static java.util.stream.Collector<T, A, RR> collectingAndThen(java.util.stream.Collector<T, A, R>, java.util.function.Function<R, RR>); - method public static java.util.stream.Collector<T, ?, java.lang.Long> counting(); - method public static java.util.stream.Collector<T, ?, java.util.Map<K, java.util.List<T>>> groupingBy(java.util.function.Function<? super T, ? extends K>); - method public static java.util.stream.Collector<T, ?, java.util.Map<K, D>> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>); - method public static java.util.stream.Collector<T, ?, M> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>); - method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, java.util.List<T>>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>); - method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, D>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>); - method public static java.util.stream.Collector<T, ?, M> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingDouble(java.util.function.ToDoubleFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingInt(java.util.function.ToIntFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingLong(java.util.function.ToLongFunction<? super T>); + method public static <T, A, R, RR> java.util.stream.Collector<T, A, RR> collectingAndThen(java.util.stream.Collector<T, A, R>, java.util.function.Function<R, RR>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Long> counting(); + method public static <T, K> java.util.stream.Collector<T, ?, java.util.Map<K, java.util.List<T>>> groupingBy(java.util.function.Function<? super T, ? extends K>); + method public static <T, K, A, D> java.util.stream.Collector<T, ?, java.util.Map<K, D>> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>); + method public static <T, K, D, A, M extends java.util.Map<K, D>> java.util.stream.Collector<T, ?, M> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>); + method public static <T, K> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, java.util.List<T>>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>); + method public static <T, K, A, D> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, D>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>); + method public static <T, K, A, D, M extends java.util.concurrent.ConcurrentMap<K, D>> java.util.stream.Collector<T, ?, M> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>); method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(); method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(java.lang.CharSequence); method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(java.lang.CharSequence, java.lang.CharSequence, java.lang.CharSequence); - method public static java.util.stream.Collector<T, ?, R> mapping(java.util.function.Function<? super T, ? extends U>, java.util.stream.Collector<? super U, A, R>); - method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> maxBy(java.util.Comparator<? super T>); - method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> minBy(java.util.Comparator<? super T>); - method public static java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, java.util.List<T>>> partitioningBy(java.util.function.Predicate<? super T>); - method public static java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, D>> partitioningBy(java.util.function.Predicate<? super T>, java.util.stream.Collector<? super T, A, D>); - method public static java.util.stream.Collector<T, ?, T> reducing(T, java.util.function.BinaryOperator<T>); - method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> reducing(java.util.function.BinaryOperator<T>); - method public static java.util.stream.Collector<T, ?, U> reducing(U, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); - method public static java.util.stream.Collector<T, ?, java.util.DoubleSummaryStatistics> summarizingDouble(java.util.function.ToDoubleFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.util.IntSummaryStatistics> summarizingInt(java.util.function.ToIntFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.util.LongSummaryStatistics> summarizingLong(java.util.function.ToLongFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.lang.Double> summingDouble(java.util.function.ToDoubleFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.lang.Integer> summingInt(java.util.function.ToIntFunction<? super T>); - method public static java.util.stream.Collector<T, ?, java.lang.Long> summingLong(java.util.function.ToLongFunction<? super T>); - method public static java.util.stream.Collector<T, ?, C> toCollection(java.util.function.Supplier<C>); - method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>); - method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); - method public static java.util.stream.Collector<T, ?, M> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>); - method public static java.util.stream.Collector<T, ?, java.util.List<T>> toList(); - method public static java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>); - method public static java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); - method public static java.util.stream.Collector<T, ?, M> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>); - method public static java.util.stream.Collector<T, ?, java.util.Set<T>> toSet(); + method public static <T, U, A, R> java.util.stream.Collector<T, ?, R> mapping(java.util.function.Function<? super T, ? extends U>, java.util.stream.Collector<? super U, A, R>); + method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> maxBy(java.util.Comparator<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> minBy(java.util.Comparator<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, java.util.List<T>>> partitioningBy(java.util.function.Predicate<? super T>); + method public static <T, D, A> java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, D>> partitioningBy(java.util.function.Predicate<? super T>, java.util.stream.Collector<? super T, A, D>); + method public static <T> java.util.stream.Collector<T, ?, T> reducing(T, java.util.function.BinaryOperator<T>); + method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> reducing(java.util.function.BinaryOperator<T>); + method public static <T, U> java.util.stream.Collector<T, ?, U> reducing(U, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); + method public static <T> java.util.stream.Collector<T, ?, java.util.DoubleSummaryStatistics> summarizingDouble(java.util.function.ToDoubleFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.util.IntSummaryStatistics> summarizingInt(java.util.function.ToIntFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.util.LongSummaryStatistics> summarizingLong(java.util.function.ToLongFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> summingDouble(java.util.function.ToDoubleFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Integer> summingInt(java.util.function.ToIntFunction<? super T>); + method public static <T> java.util.stream.Collector<T, ?, java.lang.Long> summingLong(java.util.function.ToLongFunction<? super T>); + method public static <T, C extends java.util.Collection<T>> java.util.stream.Collector<T, ?, C> toCollection(java.util.function.Supplier<C>); + method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>); + method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); + method public static <T, K, U, M extends java.util.concurrent.ConcurrentMap<K, U>> java.util.stream.Collector<T, ?, M> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>); + method public static <T> java.util.stream.Collector<T, ?, java.util.List<T>> toList(); + method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>); + method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>); + method public static <T, K, U, M extends java.util.Map<K, U>> java.util.stream.Collector<T, ?, M> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>); + method public static <T> java.util.stream.Collector<T, ?, java.util.Set<T>> toSet(); } public abstract interface DoubleStream implements java.util.stream.BaseStream { @@ -62524,7 +62548,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream<java.lang.Double> boxed(); method public static java.util.stream.DoubleStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjDoubleConsumer<R>, java.util.function.BiConsumer<R, R>); + method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjDoubleConsumer<R>, java.util.function.BiConsumer<R, R>); method public static java.util.stream.DoubleStream concat(java.util.stream.DoubleStream, java.util.stream.DoubleStream); method public abstract long count(); method public abstract java.util.stream.DoubleStream distinct(); @@ -62542,7 +62566,7 @@ package java.util.stream { method public abstract java.util.stream.DoubleStream map(java.util.function.DoubleUnaryOperator); method public abstract java.util.stream.IntStream mapToInt(java.util.function.DoubleToIntFunction); method public abstract java.util.stream.LongStream mapToLong(java.util.function.DoubleToLongFunction); - method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.DoubleFunction<? extends U>); + method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.DoubleFunction<? extends U>); method public abstract java.util.OptionalDouble max(); method public abstract java.util.OptionalDouble min(); method public abstract boolean noneMatch(java.util.function.DoublePredicate); @@ -62575,7 +62599,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream<java.lang.Integer> boxed(); method public static java.util.stream.IntStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjIntConsumer<R>, java.util.function.BiConsumer<R, R>); + method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjIntConsumer<R>, java.util.function.BiConsumer<R, R>); method public static java.util.stream.IntStream concat(java.util.stream.IntStream, java.util.stream.IntStream); method public abstract long count(); method public abstract java.util.stream.IntStream distinct(); @@ -62593,7 +62617,7 @@ package java.util.stream { method public abstract java.util.stream.IntStream map(java.util.function.IntUnaryOperator); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.IntToDoubleFunction); method public abstract java.util.stream.LongStream mapToLong(java.util.function.IntToLongFunction); - method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.IntFunction<? extends U>); + method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.IntFunction<? extends U>); method public abstract java.util.OptionalInt max(); method public abstract java.util.OptionalInt min(); method public abstract boolean noneMatch(java.util.function.IntPredicate); @@ -62627,7 +62651,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream<java.lang.Long> boxed(); method public static java.util.stream.LongStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjLongConsumer<R>, java.util.function.BiConsumer<R, R>); + method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjLongConsumer<R>, java.util.function.BiConsumer<R, R>); method public static java.util.stream.LongStream concat(java.util.stream.LongStream, java.util.stream.LongStream); method public abstract long count(); method public abstract java.util.stream.LongStream distinct(); @@ -62645,7 +62669,7 @@ package java.util.stream { method public abstract java.util.stream.LongStream map(java.util.function.LongUnaryOperator); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.LongToDoubleFunction); method public abstract java.util.stream.IntStream mapToInt(java.util.function.LongToIntFunction); - method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.LongFunction<? extends U>); + method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.LongFunction<? extends U>); method public abstract java.util.OptionalLong max(); method public abstract java.util.OptionalLong min(); method public abstract boolean noneMatch(java.util.function.LongPredicate); @@ -62672,49 +62696,49 @@ package java.util.stream { method public abstract java.util.stream.LongStream build(); } - public abstract interface Stream implements java.util.stream.BaseStream { + public abstract interface Stream<T> implements java.util.stream.BaseStream { method public abstract boolean allMatch(java.util.function.Predicate<? super T>); method public abstract boolean anyMatch(java.util.function.Predicate<? super T>); - method public static java.util.stream.Stream.Builder<T> builder(); - method public abstract R collect(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, ? super T>, java.util.function.BiConsumer<R, R>); - method public abstract R collect(java.util.stream.Collector<? super T, A, R>); - method public static java.util.stream.Stream<T> concat(java.util.stream.Stream<? extends T>, java.util.stream.Stream<? extends T>); + method public static <T> java.util.stream.Stream.Builder<T> builder(); + method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, ? super T>, java.util.function.BiConsumer<R, R>); + method public abstract <R, A> R collect(java.util.stream.Collector<? super T, A, R>); + method public static <T> java.util.stream.Stream<T> concat(java.util.stream.Stream<? extends T>, java.util.stream.Stream<? extends T>); method public abstract long count(); method public abstract java.util.stream.Stream<T> distinct(); - method public static java.util.stream.Stream<T> empty(); + method public static <T> java.util.stream.Stream<T> empty(); method public abstract java.util.stream.Stream<T> filter(java.util.function.Predicate<? super T>); method public abstract java.util.Optional<T> findAny(); method public abstract java.util.Optional<T> findFirst(); - method public abstract java.util.stream.Stream<R> flatMap(java.util.function.Function<? super T, ? extends java.util.stream.Stream<? extends R>>); + method public abstract <R> java.util.stream.Stream<R> flatMap(java.util.function.Function<? super T, ? extends java.util.stream.Stream<? extends R>>); method public abstract java.util.stream.DoubleStream flatMapToDouble(java.util.function.Function<? super T, ? extends java.util.stream.DoubleStream>); method public abstract java.util.stream.IntStream flatMapToInt(java.util.function.Function<? super T, ? extends java.util.stream.IntStream>); method public abstract java.util.stream.LongStream flatMapToLong(java.util.function.Function<? super T, ? extends java.util.stream.LongStream>); method public abstract void forEach(java.util.function.Consumer<? super T>); method public abstract void forEachOrdered(java.util.function.Consumer<? super T>); - method public static java.util.stream.Stream<T> generate(java.util.function.Supplier<T>); - method public static java.util.stream.Stream<T> iterate(T, java.util.function.UnaryOperator<T>); + method public static <T> java.util.stream.Stream<T> generate(java.util.function.Supplier<T>); + method public static <T> java.util.stream.Stream<T> iterate(T, java.util.function.UnaryOperator<T>); method public abstract java.util.stream.Stream<T> limit(long); - method public abstract java.util.stream.Stream<R> map(java.util.function.Function<? super T, ? extends R>); + method public abstract <R> java.util.stream.Stream<R> map(java.util.function.Function<? super T, ? extends R>); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.ToDoubleFunction<? super T>); method public abstract java.util.stream.IntStream mapToInt(java.util.function.ToIntFunction<? super T>); method public abstract java.util.stream.LongStream mapToLong(java.util.function.ToLongFunction<? super T>); method public abstract java.util.Optional<T> max(java.util.Comparator<? super T>); method public abstract java.util.Optional<T> min(java.util.Comparator<? super T>); method public abstract boolean noneMatch(java.util.function.Predicate<? super T>); - method public static java.util.stream.Stream<T> of(T); - method public static java.util.stream.Stream<T> of(T...); + method public static <T> java.util.stream.Stream<T> of(T); + method public static <T> java.util.stream.Stream<T> of(T...); method public abstract java.util.stream.Stream<T> peek(java.util.function.Consumer<? super T>); method public abstract T reduce(T, java.util.function.BinaryOperator<T>); method public abstract java.util.Optional<T> reduce(java.util.function.BinaryOperator<T>); - method public abstract U reduce(U, java.util.function.BiFunction<U, ? super T, U>, java.util.function.BinaryOperator<U>); + method public abstract <U> U reduce(U, java.util.function.BiFunction<U, ? super T, U>, java.util.function.BinaryOperator<U>); method public abstract java.util.stream.Stream<T> skip(long); method public abstract java.util.stream.Stream<T> sorted(); method public abstract java.util.stream.Stream<T> sorted(java.util.Comparator<? super T>); method public abstract java.lang.Object[] toArray(); - method public abstract A[] toArray(java.util.function.IntFunction<A[]>); + method public abstract <A> A[] toArray(java.util.function.IntFunction<A[]>); } - public static abstract interface Stream.Builder implements java.util.function.Consumer { + public static abstract interface Stream.Builder<T> implements java.util.function.Consumer { method public abstract void accept(T); method public default java.util.stream.Stream.Builder<T> add(T); method public abstract java.util.stream.Stream<T> build(); @@ -62727,8 +62751,8 @@ package java.util.stream { method public static java.util.stream.IntStream intStream(java.util.function.Supplier<? extends java.util.Spliterator.OfInt>, int, boolean); method public static java.util.stream.LongStream longStream(java.util.Spliterator.OfLong, boolean); method public static java.util.stream.LongStream longStream(java.util.function.Supplier<? extends java.util.Spliterator.OfLong>, int, boolean); - method public static java.util.stream.Stream<T> stream(java.util.Spliterator<T>, boolean); - method public static java.util.stream.Stream<T> stream(java.util.function.Supplier<? extends java.util.Spliterator<T>>, int, boolean); + method public static <T> java.util.stream.Stream<T> stream(java.util.Spliterator<T>, boolean); + method public static <T> java.util.stream.Stream<T> stream(java.util.function.Supplier<? extends java.util.Spliterator<T>>, int, boolean); } } @@ -64901,16 +64925,16 @@ package javax.security.auth { public final class Subject implements java.io.Serializable { ctor public Subject(); ctor public Subject(boolean, java.util.Set<? extends java.security.Principal>, java.util.Set<?>, java.util.Set<?>); - method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedAction<T>); - method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; - method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction<T>, java.security.AccessControlContext); - method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException; + method public static <T> T doAs(javax.security.auth.Subject, java.security.PrivilegedAction<T>); + method public static <T> T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException; + method public static <T> T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction<T>, java.security.AccessControlContext); + method public static <T> T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException; method public java.util.Set<java.security.Principal> getPrincipals(); - method public java.util.Set<T> getPrincipals(java.lang.Class<T>); + method public <T extends java.security.Principal> java.util.Set<T> getPrincipals(java.lang.Class<T>); method public java.util.Set<java.lang.Object> getPrivateCredentials(); - method public java.util.Set<T> getPrivateCredentials(java.lang.Class<T>); + method public <T> java.util.Set<T> getPrivateCredentials(java.lang.Class<T>); method public java.util.Set<java.lang.Object> getPublicCredentials(); - method public java.util.Set<T> getPublicCredentials(java.lang.Class<T>); + method public <T> java.util.Set<T> getPublicCredentials(java.lang.Class<T>); method public static javax.security.auth.Subject getSubject(java.security.AccessControlContext); method public boolean isReadOnly(); method public void setReadOnly(); diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index 7f467f0585c8..84457b441030 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -898,7 +898,7 @@ public class WallpaperManager { * wallpaper. */ public void setResource(@RawRes int resid) throws IOException { - setResource(resid, FLAG_SYSTEM); + setResource(resid, FLAG_SYSTEM | FLAG_LOCK); } /** @@ -1003,7 +1003,7 @@ public class WallpaperManager { */ public int setBitmap(Bitmap fullImage, Rect visibleCropHint, boolean allowBackup) throws IOException { - return setBitmap(fullImage, visibleCropHint, allowBackup, FLAG_SYSTEM); + return setBitmap(fullImage, visibleCropHint, allowBackup, FLAG_SYSTEM | FLAG_LOCK); } /** @@ -1128,7 +1128,7 @@ public class WallpaperManager { */ public int setStream(InputStream bitmapData, Rect visibleCropHint, boolean allowBackup) throws IOException { - return setStream(bitmapData, visibleCropHint, allowBackup, FLAG_SYSTEM); + return setStream(bitmapData, visibleCropHint, allowBackup, FLAG_SYSTEM | FLAG_LOCK); } /** @@ -1367,7 +1367,7 @@ public class WallpaperManager { */ @SystemApi public void clearWallpaper() { - clearWallpaper(FLAG_SYSTEM, mContext.getUserId()); + clearWallpaper(FLAG_SYSTEM | FLAG_LOCK, mContext.getUserId()); } /** diff --git a/core/java/android/app/job/JobScheduler.java b/core/java/android/app/job/JobScheduler.java index 9618cd10c086..1b640d08dde2 100644 --- a/core/java/android/app/job/JobScheduler.java +++ b/core/java/android/app/job/JobScheduler.java @@ -18,6 +18,7 @@ package android.app.job; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SystemApi; import java.util.List; @@ -75,6 +76,7 @@ public abstract class JobScheduler { * @return {@link #RESULT_SUCCESS} or {@link #RESULT_FAILURE} * @hide */ + @SystemApi public abstract int scheduleAsPackage(JobInfo job, String packageName, int userId, String tag); /** diff --git a/core/java/android/net/InterfaceConfiguration.java b/core/java/android/net/InterfaceConfiguration.java index 8cdd15305018..ea53a71245a5 100644 --- a/core/java/android/net/InterfaceConfiguration.java +++ b/core/java/android/net/InterfaceConfiguration.java @@ -80,6 +80,14 @@ public class InterfaceConfiguration implements Parcelable { mFlags.add(FLAG_DOWN); } + /** + * Set flags so that no changes will be made to the up/down status. + */ + public void ignoreInterfaceUpDownStatus() { + mFlags.remove(FLAG_UP); + mFlags.remove(FLAG_DOWN); + } + public LinkAddress getLinkAddress() { return mAddr; } diff --git a/core/java/android/os/HwBlob.java b/core/java/android/os/HwBlob.java index 153c6e634ecb..88226f0a1665 100644 --- a/core/java/android/os/HwBlob.java +++ b/core/java/android/os/HwBlob.java @@ -16,6 +16,8 @@ package android.os; +import android.annotation.NonNull; + import libcore.util.NativeAllocationRegistry; /** @hide */ @@ -54,6 +56,69 @@ public class HwBlob { public native final long handle(); + public static Boolean[] wrapArray(@NonNull boolean[] array) { + final int n = array.length; + Boolean[] wrappedArray = new Boolean[n]; + for (int i = 0; i < n; ++i) { + wrappedArray[i] = array[i]; + } + return wrappedArray; + } + + public static Long[] wrapArray(@NonNull long[] array) { + final int n = array.length; + Long[] wrappedArray = new Long[n]; + for (int i = 0; i < n; ++i) { + wrappedArray[i] = array[i]; + } + return wrappedArray; + } + + public static Byte[] wrapArray(@NonNull byte[] array) { + final int n = array.length; + Byte[] wrappedArray = new Byte[n]; + for (int i = 0; i < n; ++i) { + wrappedArray[i] = array[i]; + } + return wrappedArray; + } + + public static Short[] wrapArray(@NonNull short[] array) { + final int n = array.length; + Short[] wrappedArray = new Short[n]; + for (int i = 0; i < n; ++i) { + wrappedArray[i] = array[i]; + } + return wrappedArray; + } + + public static Integer[] wrapArray(@NonNull int[] array) { + final int n = array.length; + Integer[] wrappedArray = new Integer[n]; + for (int i = 0; i < n; ++i) { + wrappedArray[i] = array[i]; + } + return wrappedArray; + } + + public static Float[] wrapArray(@NonNull float[] array) { + final int n = array.length; + Float[] wrappedArray = new Float[n]; + for (int i = 0; i < n; ++i) { + wrappedArray[i] = array[i]; + } + return wrappedArray; + } + + public static Double[] wrapArray(@NonNull double[] array) { + final int n = array.length; + Double[] wrappedArray = new Double[n]; + for (int i = 0; i < n; ++i) { + wrappedArray[i] = array[i]; + } + return wrappedArray; + } + // Returns address of the "freeFunction". private static native final long native_init(); diff --git a/core/java/android/os/HwParcel.java b/core/java/android/os/HwParcel.java index e4d57184ede9..180e8f46e93b 100644 --- a/core/java/android/os/HwParcel.java +++ b/core/java/android/os/HwParcel.java @@ -53,21 +53,13 @@ public class HwParcel { public native final void writeDouble(double val); public native final void writeString(String val); - public native final void writeBoolArray(int size, boolean[] val); public native final void writeBoolVector(boolean[] val); - public native final void writeInt8Array(int size, byte[] val); public native final void writeInt8Vector(byte[] val); - public native final void writeInt16Array(int size, short[] val); public native final void writeInt16Vector(short[] val); - public native final void writeInt32Array(int size, int[] val); public native final void writeInt32Vector(int[] val); - public native final void writeInt64Array(int size, long[] val); public native final void writeInt64Vector(long[] val); - public native final void writeFloatArray(int size, float[] val); public native final void writeFloatVector(float[] val); - public native final void writeDoubleArray(int size, double[] val); public native final void writeDoubleVector(double[] val); - public native final void writeStringArray(int size, String[] val); public native final void writeStringVector(String[] val); public native final void writeStrongBinder(IHwBinder binder); @@ -82,21 +74,13 @@ public class HwParcel { public native final double readDouble(); public native final String readString(); - public native final boolean[] readBoolArray(int size); public native final boolean[] readBoolVector(); - public native final byte[] readInt8Array(int size); public native final byte[] readInt8Vector(); - public native final short[] readInt16Array(int size); public native final short[] readInt16Vector(); - public native final int[] readInt32Array(int size); public native final int[] readInt32Vector(); - public native final long[] readInt64Array(int size); public native final long[] readInt64Vector(); - public native final float[] readFloatArray(int size); public native final float[] readFloatVector(); - public native final double[] readDoubleArray(int size); public native final double[] readDoubleVector(); - public native final String[] readStringArray(int size); public native final String[] readStringVector(); public native final IHwBinder readStrongBinder(); diff --git a/core/java/android/os/IRecoverySystem.aidl b/core/java/android/os/IRecoverySystem.aidl index 12830a4996aa..c5ceecd7c8b9 100644 --- a/core/java/android/os/IRecoverySystem.aidl +++ b/core/java/android/os/IRecoverySystem.aidl @@ -25,4 +25,5 @@ interface IRecoverySystem { boolean uncrypt(in String packageFile, IRecoverySystemProgressListener listener); boolean setupBcb(in String command); boolean clearBcb(); + void rebootRecoveryWithCommand(in String command); } diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java index 028e30ab93f0..662e14cce49b 100644 --- a/core/java/android/os/RecoverySystem.java +++ b/core/java/android/os/RecoverySystem.java @@ -93,6 +93,14 @@ public class RecoverySystem { */ public static final File UNCRYPT_PACKAGE_FILE = new File(RECOVERY_DIR, "uncrypt_file"); + /** + * UNCRYPT_STATUS_FILE stores the time cost (and error code in the case of a failure) + * of uncrypt. + * + * @hide + */ + public static final File UNCRYPT_STATUS_FILE = new File(RECOVERY_DIR, "uncrypt_status"); + // Length limits for reading files. private static final int LOG_FILE_MAX_LENGTH = 64 * 1024; @@ -663,28 +671,22 @@ public class RecoverySystem { * @throws IOException if something goes wrong. */ private static void bootCommand(Context context, String... args) throws IOException { - synchronized (sRequestLock) { - LOG_FILE.delete(); + LOG_FILE.delete(); - StringBuilder command = new StringBuilder(); - for (String arg : args) { - if (!TextUtils.isEmpty(arg)) { - command.append(arg); - command.append("\n"); - } + StringBuilder command = new StringBuilder(); + for (String arg : args) { + if (!TextUtils.isEmpty(arg)) { + command.append(arg); + command.append("\n"); } + } - // Write the command into BCB (bootloader control block). - RecoverySystem rs = (RecoverySystem) context.getSystemService( - Context.RECOVERY_SERVICE); - rs.setupBcb(command.toString()); - - // Having set up the BCB, go ahead and reboot. - PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); - pm.reboot(PowerManager.REBOOT_RECOVERY); + // Write the command into BCB (bootloader control block) and boot from + // there. Will not return unless failed. + RecoverySystem rs = (RecoverySystem) context.getSystemService(Context.RECOVERY_SERVICE); + rs.rebootRecoveryWithCommand(command.toString()); - throw new IOException("Reboot failed (no permissions?)"); - } + throw new IOException("Reboot failed (no permissions?)"); } // Read last_install; then report time (in seconds) and I/O (in MiB) for @@ -879,6 +881,17 @@ public class RecoverySystem { } /** + * Talks to RecoverySystemService via Binder to set up the BCB command and + * reboot into recovery accordingly. + */ + private void rebootRecoveryWithCommand(String command) { + try { + mService.rebootRecoveryWithCommand(command); + } catch (RemoteException ignored) { + } + } + + /** * Internally, recovery treats each line of the command file as a separate * argv, so we only need to protect against newlines and nulls. */ diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java index c36b48886f37..ff69cf6a94bc 100644 --- a/core/java/android/os/StrictMode.java +++ b/core/java/android/os/StrictMode.java @@ -191,9 +191,14 @@ public final class StrictMode { */ public static final int DETECT_RESOURCE_MISMATCH = 0x10; // for ThreadPolicy + /** + * @hide + */ + public static final int DETECT_UNBUFFERED_IO = 0x20; // for ThreadPolicy + private static final int ALL_THREAD_DETECT_BITS = DETECT_DISK_WRITE | DETECT_DISK_READ | DETECT_NETWORK | DETECT_CUSTOM | - DETECT_RESOURCE_MISMATCH; + DETECT_RESOURCE_MISMATCH | DETECT_UNBUFFERED_IO; // Byte 2: Process-policy @@ -465,6 +470,20 @@ public final class StrictMode { } /** + * Detect unbuffered input/output operations. + */ + public Builder detectUnbufferedIo() { + return enable(DETECT_UNBUFFERED_IO); + } + + /** + * Detect unbuffered input/output operations. + */ + public Builder permitUnbufferedIo() { + return disable(DETECT_UNBUFFERED_IO); + } + + /** * Enables detection of mismatches between defined resource types * and getter calls. * <p> @@ -974,6 +993,15 @@ public final class StrictMode { } /** + * @hide + */ + private static class StrictModeUnbufferedIOViolation extends StrictModeViolation { + public StrictModeUnbufferedIOViolation(int policyMask) { + super(policyMask, DETECT_UNBUFFERED_IO, null); + } + } + + /** * Returns the bitmask of the current thread's policy. * * @return the bitmask of all the DETECT_* and PENALTY_* bits currently enabled @@ -1281,6 +1309,20 @@ public final class StrictMode { startHandlingViolationException(e); } + // Part of BlockGuard.Policy; just part of StrictMode: + public void onUnbufferedIO() { + if ((mPolicyMask & DETECT_UNBUFFERED_IO) == 0) { + return; + } + if (tooManyViolationsThisLoop()) { + return; + } + BlockGuard.BlockGuardPolicyException e = + new StrictModeUnbufferedIOViolation(mPolicyMask); + e.fillInStackTrace(); + startHandlingViolationException(e); + } + // Part of BlockGuard.Policy interface: public void onReadFromDisk() { if ((mPolicyMask & DETECT_DISK_READ) == 0) { @@ -2208,6 +2250,18 @@ public final class StrictMode { /** * @hide */ + public static void noteUnbufferedIO() { + BlockGuard.Policy policy = BlockGuard.getThreadPolicy(); + if (!(policy instanceof AndroidBlockGuardPolicy)) { + // StrictMode not enabled. + return; + } + ((AndroidBlockGuardPolicy) policy).onUnbufferedIO(); + } + + /** + * @hide + */ public static void noteDiskRead() { BlockGuard.Policy policy = BlockGuard.getThreadPolicy(); if (!(policy instanceof AndroidBlockGuardPolicy)) { diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java index 11734d31388e..830df990f205 100644 --- a/core/java/android/view/WindowManagerGlobal.java +++ b/core/java/android/view/WindowManagerGlobal.java @@ -335,20 +335,17 @@ public final class WindowManagerGlobal { mViews.add(view); mRoots.add(root); mParams.add(wparams); - } - // do this last because it fires off messages to start doing things - try { - root.setView(view, wparams, panelParentView); - } catch (RuntimeException e) { - // BadTokenException or InvalidDisplayException, clean up. - synchronized (mLock) { - final int index = findViewLocked(view, false); + // do this last because it fires off messages to start doing things + try { + root.setView(view, wparams, panelParentView); + } catch (RuntimeException e) { + // BadTokenException or InvalidDisplayException, clean up. if (index >= 0) { removeViewLocked(index, true); } + throw e; } - throw e; } } diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index e0bfecb14040..97c7f049fdb9 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -839,7 +839,8 @@ extern "C" void get_malloc_leak_info(uint8_t** info, size_t* overallSize, size_t* infoSize, size_t* totalMemory, size_t* backtraceSize); extern "C" void free_malloc_leak_info(uint8_t* info); #define SIZE_FLAG_ZYGOTE_CHILD (1<<31) -#define BACKTRACE_SIZE 32 + +static size_t gNumBacktraceElements; /* * This is a qsort() callback. @@ -859,11 +860,11 @@ static int compareHeapRecords(const void* vrec1, const void* vrec2) return -1; } - intptr_t* bt1 = (intptr_t*)(rec1 + 2); - intptr_t* bt2 = (intptr_t*)(rec2 + 2); - for (size_t idx = 0; idx < BACKTRACE_SIZE; idx++) { - intptr_t addr1 = bt1[idx]; - intptr_t addr2 = bt2[idx]; + uintptr_t* bt1 = (uintptr_t*)(rec1 + 2); + uintptr_t* bt2 = (uintptr_t*)(rec2 + 2); + for (size_t idx = 0; idx < gNumBacktraceElements; idx++) { + uintptr_t addr1 = bt1[idx]; + uintptr_t addr2 = bt2[idx]; if (addr1 == addr2) { if (addr1 == 0) break; @@ -907,9 +908,10 @@ static void dumpNativeHeap(FILE* fp) if (info == NULL) { fprintf(fp, "Native heap dump not available. To enable, run these" " commands (requires root):\n"); - fprintf(fp, "$ adb shell setprop libc.debug.malloc 1\n"); - fprintf(fp, "$ adb shell stop\n"); - fprintf(fp, "$ adb shell start\n"); + fprintf(fp, "# adb shell stop\n"); + fprintf(fp, "# adb shell setprop libc.debug.malloc.options " + "backtrace\n"); + fprintf(fp, "# adb shell start\n"); return; } assert(infoSize != 0); @@ -920,13 +922,11 @@ static void dumpNativeHeap(FILE* fp) size_t recordCount = overallSize / infoSize; fprintf(fp, "Total memory: %zu\n", totalMemory); fprintf(fp, "Allocation records: %zd\n", recordCount); - if (backtraceSize != BACKTRACE_SIZE) { - fprintf(fp, "WARNING: mismatched backtrace sizes (%zu vs. %d)\n", - backtraceSize, BACKTRACE_SIZE); - } + fprintf(fp, "Backtrace size: %zd\n", backtraceSize); fprintf(fp, "\n"); /* re-sort the entries */ + gNumBacktraceElements = backtraceSize; qsort(info, recordCount, infoSize, compareHeapRecords); /* dump the entries to the file */ @@ -934,7 +934,7 @@ static void dumpNativeHeap(FILE* fp) for (size_t idx = 0; idx < recordCount; idx++) { size_t size = *(size_t*) ptr; size_t allocations = *(size_t*) (ptr + sizeof(size_t)); - intptr_t* backtrace = (intptr_t*) (ptr + sizeof(size_t) * 2); + uintptr_t* backtrace = (uintptr_t*) (ptr + sizeof(size_t) * 2); fprintf(fp, "z %d sz %8zu num %4zu bt", (size & SIZE_FLAG_ZYGOTE_CHILD) != 0, diff --git a/core/jni/android_os_HwParcel.cpp b/core/jni/android_os_HwParcel.cpp index d453b29c0663..5c879b8894a1 100644 --- a/core/jni/android_os_HwParcel.cpp +++ b/core/jni/android_os_HwParcel.cpp @@ -431,35 +431,6 @@ static void JHwParcel_native_writeString( signalExceptionForError(env, err); } -#define DEFINE_PARCEL_ARRAY_WRITER(Suffix,Type) \ -static void JHwParcel_native_write ## Suffix ## Array( \ - JNIEnv *env, jobject thiz, jint size, Type ## Array valObj) { \ - if (valObj == NULL) { \ - jniThrowException(env, "java/lang/NullPointerException", NULL); \ - return; \ - } \ - \ - jsize len = env->GetArrayLength(valObj); \ - \ - if (len != size) { \ - jniThrowException(env, "java/lang/IllegalArgumentException", NULL); \ - return; \ - } \ - \ - sp<JHwParcel> impl = JHwParcel::GetNativeContext(env, thiz); \ - \ - const Type *val = \ - impl->getStorage()->allocTemporary ## Suffix ## Array(env, valObj); \ - \ - hardware::Parcel *parcel = impl->getParcel(); \ - \ - size_t parentHandle; \ - status_t err = parcel->writeBuffer( \ - val, size * sizeof(*val), &parentHandle); \ - \ - signalExceptionForError(env, err); \ -} - #define DEFINE_PARCEL_VECTOR_WRITER(Suffix,Type) \ static void JHwParcel_native_write ## Suffix ## Vector( \ JNIEnv *env, jobject thiz, Type ## Array valObj) { \ @@ -491,13 +462,6 @@ static void JHwParcel_native_write ## Suffix ## Vector( \ signalExceptionForError(env, err); \ } -DEFINE_PARCEL_ARRAY_WRITER(Int8,jbyte) -DEFINE_PARCEL_ARRAY_WRITER(Int16,jshort) -DEFINE_PARCEL_ARRAY_WRITER(Int32,jint) -DEFINE_PARCEL_ARRAY_WRITER(Int64,jlong) -DEFINE_PARCEL_ARRAY_WRITER(Float,jfloat) -DEFINE_PARCEL_ARRAY_WRITER(Double,jdouble) - DEFINE_PARCEL_VECTOR_WRITER(Int8,jbyte) DEFINE_PARCEL_VECTOR_WRITER(Int16,jshort) DEFINE_PARCEL_VECTOR_WRITER(Int32,jint) @@ -505,43 +469,6 @@ DEFINE_PARCEL_VECTOR_WRITER(Int64,jlong) DEFINE_PARCEL_VECTOR_WRITER(Float,jfloat) DEFINE_PARCEL_VECTOR_WRITER(Double,jdouble) -static void JHwParcel_native_writeBoolArray( - JNIEnv *env, jobject thiz, jint size, jbooleanArray valObj) { - if (valObj == NULL) { - jniThrowException(env, "java/lang/NullPointerException", NULL); - return; - } - - jsize len = env->GetArrayLength(valObj); - - if (len != size) { - jniThrowException(env, "java/lang/IllegalArgumentException", NULL); - return; - } - - sp<JHwParcel> impl = JHwParcel::GetNativeContext(env, thiz); - - jboolean *src = env->GetBooleanArrayElements(valObj, nullptr); - - bool *dst = - (bool *)impl->getStorage()->allocTemporaryStorage(size * sizeof(bool)); - - for (jint i = 0; i < size; ++i) { - dst[i] = src[i]; - } - - env->ReleaseBooleanArrayElements(valObj, src, 0 /* mode */); - src = nullptr; - - hardware::Parcel *parcel = impl->getParcel(); - - size_t parentHandle; - status_t err = parcel->writeBuffer( - dst, size * sizeof(*dst), &parentHandle); - - signalExceptionForError(env, err); -} - static void JHwParcel_native_writeBoolVector( JNIEnv *env, jobject thiz, jbooleanArray valObj) { if (valObj == NULL) { @@ -651,22 +578,6 @@ static jstring JHwParcel_native_readString(JNIEnv *env, jobject thiz) { return MakeStringObjFromHidlString(env, *s); } -#define DEFINE_PARCEL_ARRAY_READER(Suffix,Type,NewType) \ -static Type ## Array JHwParcel_native_read ## Suffix ## Array( \ - JNIEnv *env, jobject thiz, jint size) { \ - hardware::Parcel *parcel = \ - JHwParcel::GetNativeContext(env, thiz)->getParcel(); \ - \ - size_t parentHandle; \ - const Type *val = static_cast<const Type *>( \ - parcel->readBuffer(&parentHandle)); \ - \ - Type ## Array valObj = env->New ## NewType ## Array(size); \ - env->Set ## NewType ## ArrayRegion(valObj, 0, size, val); \ - \ - return valObj; \ -} - #define DEFINE_PARCEL_VECTOR_READER(Suffix,Type,NewType) \ static Type ## Array JHwParcel_native_read ## Suffix ## Vector( \ JNIEnv *env, jobject thiz) { \ @@ -703,13 +614,6 @@ static Type ## Array JHwParcel_native_read ## Suffix ## Vector( \ return valObj; \ } -DEFINE_PARCEL_ARRAY_READER(Int8,jbyte,Byte) -DEFINE_PARCEL_ARRAY_READER(Int16,jshort,Short) -DEFINE_PARCEL_ARRAY_READER(Int32,jint,Int) -DEFINE_PARCEL_ARRAY_READER(Int64,jlong,Long) -DEFINE_PARCEL_ARRAY_READER(Float,jfloat,Float) -DEFINE_PARCEL_ARRAY_READER(Double,jdouble,Double) - DEFINE_PARCEL_VECTOR_READER(Int8,jbyte,Byte) DEFINE_PARCEL_VECTOR_READER(Int16,jshort,Short) DEFINE_PARCEL_VECTOR_READER(Int32,jint,Int) @@ -717,25 +621,6 @@ DEFINE_PARCEL_VECTOR_READER(Int64,jlong,Long) DEFINE_PARCEL_VECTOR_READER(Float,jfloat,Float) DEFINE_PARCEL_VECTOR_READER(Double,jdouble,Double) -static jbooleanArray JHwParcel_native_readBoolArray( - JNIEnv *env, jobject thiz, jint size) { - hardware::Parcel *parcel = - JHwParcel::GetNativeContext(env, thiz)->getParcel(); - - size_t parentHandle; - const bool *val = static_cast<const bool *>( - parcel->readBuffer(&parentHandle)); - - jbooleanArray valObj = env->NewBooleanArray(size); - - for (jint i = 0; i < size; ++i) { - jboolean x = val[i]; - env->SetBooleanArrayRegion(valObj, i, 1, &x); - } - - return valObj; -} - static jbooleanArray JHwParcel_native_readBoolVector( JNIEnv *env, jobject thiz) { hardware::Parcel *parcel = @@ -797,80 +682,6 @@ static jobjectArray MakeStringArray( return arrayObj; } -static jobjectArray JHwParcel_native_readStringArray( - JNIEnv *env, jobject thiz, jint size) { - hardware::Parcel *parcel = - JHwParcel::GetNativeContext(env, thiz)->getParcel(); - - size_t parentHandle; - const hidl_string *val = static_cast<const hidl_string *>( - parcel->readBuffer(&parentHandle)); - - if (val == NULL) { - signalExceptionForError(env, UNKNOWN_ERROR); - return NULL; - } - - status_t err = OK; - for (jint i = 0; (err == OK) && (i < size); ++i) { - err = const_cast<hidl_string *>(&val[i]) - ->readEmbeddedFromParcel( - *parcel, - parentHandle, - i * sizeof(hidl_string)); - } - - if (err != OK) { - signalExceptionForError(env, err); - return NULL; - } - - return MakeStringArray(env, val, size); -} - -static void JHwParcel_native_writeStringArray( - JNIEnv *env, jobject thiz, jint size, jobjectArray arrayObj) { - if (arrayObj == NULL) { - jniThrowException(env, "java/lang/NullPointerException", NULL); - return; - } - - jsize len = env->GetArrayLength(arrayObj); - - if (len != size) { - jniThrowException(env, "java/lang/IllegalArgumentException", NULL); - return; - } - - sp<JHwParcel> impl = JHwParcel::GetNativeContext(env, thiz); - - hidl_string *strings = impl->getStorage()->allocStringArray(len); - - for (jsize i = 0; i < len; ++i) { - ScopedLocalRef<jstring> stringObj( - env, - (jstring)env->GetObjectArrayElement(arrayObj, i)); - - const hidl_string *s = - impl->getStorage()->allocTemporaryString(env, stringObj.get()); - - strings[i].setToExternal(s->c_str(), s->size()); - } - - hardware::Parcel *parcel = impl->getParcel(); - - size_t parentHandle; - status_t err = parcel->writeBuffer( - strings, sizeof(hidl_string) * len, &parentHandle); - - for (jsize i = 0; (err == OK) && (i < len); ++i) { - err = strings[i].writeEmbeddedToParcel( - parcel, parentHandle, i * sizeof(hidl_string)); - } - - signalExceptionForError(env, err); -} - static jobjectArray JHwParcel_native_readStringVector( JNIEnv *env, jobject thiz) { typedef hidl_vec<hidl_string> string_vec; @@ -1047,26 +858,16 @@ static JNINativeMethod gMethods[] = { { "writeString", "(Ljava/lang/String;)V", (void *)JHwParcel_native_writeString }, - { "writeBoolArray", "(I[Z)V", (void *)JHwParcel_native_writeBoolArray }, { "writeBoolVector", "([Z)V", (void *)JHwParcel_native_writeBoolVector }, - { "writeInt8Array", "(I[B)V", (void *)JHwParcel_native_writeInt8Array }, { "writeInt8Vector", "([B)V", (void *)JHwParcel_native_writeInt8Vector }, - { "writeInt16Array", "(I[S)V", (void *)JHwParcel_native_writeInt16Array }, { "writeInt16Vector", "([S)V", (void *)JHwParcel_native_writeInt16Vector }, - { "writeInt32Array", "(I[I)V", (void *)JHwParcel_native_writeInt32Array }, { "writeInt32Vector", "([I)V", (void *)JHwParcel_native_writeInt32Vector }, - { "writeInt64Array", "(I[J)V", (void *)JHwParcel_native_writeInt64Array }, { "writeInt64Vector", "([J)V", (void *)JHwParcel_native_writeInt64Vector }, - { "writeFloatArray", "(I[F)V", (void *)JHwParcel_native_writeFloatArray }, { "writeFloatVector", "([F)V", (void *)JHwParcel_native_writeFloatVector }, - { "writeDoubleArray", "(I[D)V", (void *)JHwParcel_native_writeDoubleArray }, { "writeDoubleVector", "([D)V", (void *)JHwParcel_native_writeDoubleVector }, - { "writeStringArray", "(I[Ljava/lang/String;)V", - (void *)JHwParcel_native_writeStringArray }, - { "writeStringVector", "([Ljava/lang/String;)V", (void *)JHwParcel_native_writeStringVector }, @@ -1087,24 +888,14 @@ static JNINativeMethod gMethods[] = { { "readString", "()Ljava/lang/String;", (void *)JHwParcel_native_readString }, - { "readBoolArray", "(I)[Z", (void *)JHwParcel_native_readBoolArray }, { "readBoolVector", "()[Z", (void *)JHwParcel_native_readBoolVector }, - { "readInt8Array", "(I)[B", (void *)JHwParcel_native_readInt8Array }, { "readInt8Vector", "()[B", (void *)JHwParcel_native_readInt8Vector }, - { "readInt16Array", "(I)[S", (void *)JHwParcel_native_readInt16Array }, { "readInt16Vector", "()[S", (void *)JHwParcel_native_readInt16Vector }, - { "readInt32Array", "(I)[I", (void *)JHwParcel_native_readInt32Array }, { "readInt32Vector", "()[I", (void *)JHwParcel_native_readInt32Vector }, - { "readInt64Array", "(I)[J", (void *)JHwParcel_native_readInt64Array }, { "readInt64Vector", "()[J", (void *)JHwParcel_native_readInt64Vector }, - { "readFloatArray", "(I)[F", (void *)JHwParcel_native_readFloatArray }, { "readFloatVector", "()[F", (void *)JHwParcel_native_readFloatVector }, - { "readDoubleArray", "(I)[D", (void *)JHwParcel_native_readDoubleArray }, { "readDoubleVector", "()[D", (void *)JHwParcel_native_readDoubleVector }, - { "readStringArray", "(I)[Ljava/lang/String;", - (void *)JHwParcel_native_readStringArray }, - { "readStringVector", "()[Ljava/lang/String;", (void *)JHwParcel_native_readStringVector }, diff --git a/core/jni/hwbinder/EphemeralStorage.cpp b/core/jni/hwbinder/EphemeralStorage.cpp index 187beeea4de1..4996bc86cade 100644 --- a/core/jni/hwbinder/EphemeralStorage.cpp +++ b/core/jni/hwbinder/EphemeralStorage.cpp @@ -71,21 +71,6 @@ const hidl_string *EphemeralStorage::allocTemporaryString( return s; } -#define DEFINE_ALLOC_ARRAY_METHODS(Suffix,Type,NewType) \ -const Type *EphemeralStorage::allocTemporary ## Suffix ## Array( \ - JNIEnv *env, Type ## Array arrayObj) { \ - Type ## Array obj = (Type ## Array)env->NewGlobalRef(arrayObj); \ - const Type *val = env->Get ## NewType ## ArrayElements(obj, NULL); \ - \ - Item item; \ - item.mType = TYPE_ ## Suffix ## _ARRAY; \ - item.mObj = obj; \ - item.mPtr = (void *)val; \ - mItems.push_back(item); \ - \ - return val; \ -} - #define DEFINE_ALLOC_VECTOR_METHODS(Suffix,Type,NewType) \ const hidl_vec<Type> *EphemeralStorage::allocTemporary ## Suffix ## Vector( \ JNIEnv *env, Type ## Array arrayObj) { \ @@ -107,13 +92,6 @@ const hidl_vec<Type> *EphemeralStorage::allocTemporary ## Suffix ## Vector( \ return vec; \ } -DEFINE_ALLOC_ARRAY_METHODS(Int8,jbyte,Byte) -DEFINE_ALLOC_ARRAY_METHODS(Int16,jshort,Short) -DEFINE_ALLOC_ARRAY_METHODS(Int32,jint,Int) -DEFINE_ALLOC_ARRAY_METHODS(Int64,jlong,Long) -DEFINE_ALLOC_ARRAY_METHODS(Float,jfloat,Float) -DEFINE_ALLOC_ARRAY_METHODS(Double,jdouble,Double) - DEFINE_ALLOC_VECTOR_METHODS(Int8,jbyte,Byte) DEFINE_ALLOC_VECTOR_METHODS(Int16,jshort,Short) DEFINE_ALLOC_VECTOR_METHODS(Int32,jint,Int) diff --git a/core/jni/hwbinder/EphemeralStorage.h b/core/jni/hwbinder/EphemeralStorage.h index b02ed9f5ea69..f07c782bfdf7 100644 --- a/core/jni/hwbinder/EphemeralStorage.h +++ b/core/jni/hwbinder/EphemeralStorage.h @@ -26,9 +26,6 @@ namespace android { #define DECLARE_ALLOC_METHODS(Suffix,Type) \ - const Type *allocTemporary ## Suffix ## Array( \ - JNIEnv *env, Type ## Array arrayObj); \ - \ const ::android::hardware::hidl_vec<Type> * \ allocTemporary ## Suffix ## Vector( \ JNIEnv *env, Type ## Array arrayObj); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index f712c346f88a..ae560f9f8779 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -198,6 +198,8 @@ <protected-broadcast android:name="android.btopp.intent.action.OPEN" /> <protected-broadcast android:name="android.btopp.intent.action.OPEN_INBOUND" /> <protected-broadcast android:name="android.btopp.intent.action.TRANSFER_COMPLETE" /> + <protected-broadcast android:name="android.btopp.intent.action.ACCEPT" /> + <protected-broadcast android:name="com.android.bluetooth.gatt.REFRESH_BATCHED_SCAN" /> <protected-broadcast android:name="com.android.bluetooth.pbap.authchall" /> <protected-broadcast android:name="com.android.bluetooth.pbap.userconfirmtimeout" /> <protected-broadcast android:name="com.android.bluetooth.pbap.authresponse" /> @@ -287,6 +289,7 @@ <protected-broadcast android:name="android.net.wifi.WIFI_AP_STATE_CHANGED" /> <protected-broadcast android:name="android.net.wifi.WIFI_CREDENTIAL_CHANGED" /> <protected-broadcast android:name="android.net.wifi.WIFI_SCAN_AVAILABLE" /> + <protected-broadcast android:name="android.net.wifi.nan.action.WIFI_NAN_STATE_CHANGED" /> <protected-broadcast android:name="android.net.wifi.SCAN_RESULTS" /> <protected-broadcast android:name="android.net.wifi.RSSI_CHANGED" /> <protected-broadcast android:name="android.net.wifi.STATE_CHANGE" /> diff --git a/core/res/res/values-mcc204-mnc04/config.xml b/core/res/res/values-mcc204-mnc04/config.xml index 0f39e42e8b3c..ddf0e9fa9a68 100755 --- a/core/res/res/values-mcc204-mnc04/config.xml +++ b/core/res/res/values-mcc204-mnc04/config.xml @@ -25,13 +25,6 @@ --> <integer name="config_mobile_mtu">1358</integer> - <!-- service number convert map in roaming network. --> - <!-- [dialstring],[replacement][,optional gid] --> - <string-array translatable="false" name="dial_string_replace"> - <item>"*611:+19085594899,BAE0000000000000"</item> - <item>"*86:+1MDN,BAE0000000000000"</item> - </string-array> - <!-- Flag indicating whether strict threshold is used, or lenient threshold is used, when evaluating RSRP for LTE antenna bar display 0. Strict threshold diff --git a/core/res/res/values-mcc310-mnc120/config.xml b/core/res/res/values-mcc310-mnc120/config.xml index 4b616885aab6..413c6980869f 100644 --- a/core/res/res/values-mcc310-mnc120/config.xml +++ b/core/res/res/values-mcc310-mnc120/config.xml @@ -25,9 +25,6 @@ --> <integer name="config_mobile_mtu">1422</integer> - <!-- Sprint need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">70</integer> - <!-- If this value is true, The mms content-disposition field is supported correctly. If false, Content-disposition fragments are ignored --> <bool name="config_mms_content_disposition_support">false</bool> diff --git a/core/res/res/values-mcc310-mnc160/config.xml b/core/res/res/values-mcc310-mnc160/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc160/config.xml +++ b/core/res/res/values-mcc310-mnc160/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc200/config.xml b/core/res/res/values-mcc310-mnc200/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc200/config.xml +++ b/core/res/res/values-mcc310-mnc200/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc210/config.xml b/core/res/res/values-mcc310-mnc210/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc210/config.xml +++ b/core/res/res/values-mcc310-mnc210/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc220/config.xml b/core/res/res/values-mcc310-mnc220/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc220/config.xml +++ b/core/res/res/values-mcc310-mnc220/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc230/config.xml b/core/res/res/values-mcc310-mnc230/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc230/config.xml +++ b/core/res/res/values-mcc310-mnc230/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc240/config.xml b/core/res/res/values-mcc310-mnc240/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc240/config.xml +++ b/core/res/res/values-mcc310-mnc240/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc250/config.xml b/core/res/res/values-mcc310-mnc250/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc250/config.xml +++ b/core/res/res/values-mcc310-mnc250/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc260/config.xml b/core/res/res/values-mcc310-mnc260/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc260/config.xml +++ b/core/res/res/values-mcc310-mnc260/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc270/config.xml b/core/res/res/values-mcc310-mnc270/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc270/config.xml +++ b/core/res/res/values-mcc310-mnc270/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc300/config.xml b/core/res/res/values-mcc310-mnc300/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc300/config.xml +++ b/core/res/res/values-mcc310-mnc300/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc310/config.xml b/core/res/res/values-mcc310-mnc310/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc310/config.xml +++ b/core/res/res/values-mcc310-mnc310/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc410/config.xml b/core/res/res/values-mcc310-mnc410/config.xml index cddd5e331b13..9accdf02537f 100644 --- a/core/res/res/values-mcc310-mnc410/config.xml +++ b/core/res/res/values-mcc310-mnc410/config.xml @@ -67,7 +67,4 @@ <item>"#8"</item> <item>"#9"</item> </string-array> - <!-- Flag indicating whether radio is to be restarted on the error of - PDP_FAIL_REGULAR_DEACTIVATION/0x24 --> - <bool name="config_restart_radio_on_pdp_fail_regular_deactivation">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc490/config.xml b/core/res/res/values-mcc310-mnc490/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc490/config.xml +++ b/core/res/res/values-mcc310-mnc490/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc530/config.xml b/core/res/res/values-mcc310-mnc530/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc530/config.xml +++ b/core/res/res/values-mcc310-mnc530/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc580/config.xml b/core/res/res/values-mcc310-mnc580/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc580/config.xml +++ b/core/res/res/values-mcc310-mnc580/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc590/config.xml b/core/res/res/values-mcc310-mnc590/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc590/config.xml +++ b/core/res/res/values-mcc310-mnc590/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc640/config.xml b/core/res/res/values-mcc310-mnc640/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc640/config.xml +++ b/core/res/res/values-mcc310-mnc640/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc660/config.xml b/core/res/res/values-mcc310-mnc660/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc660/config.xml +++ b/core/res/res/values-mcc310-mnc660/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc310-mnc800/config.xml b/core/res/res/values-mcc310-mnc800/config.xml index 2cae7cc0376b..5a6a84bd06b3 100644 --- a/core/res/res/values-mcc310-mnc800/config.xml +++ b/core/res/res/values-mcc310-mnc800/config.xml @@ -32,9 +32,4 @@ <!-- Flag specifying whether VoLTE TTY is supported --> <bool name="config_carrier_volte_tty_supported">false</bool> - - <!-- Flag specifying whether WFC over IMS should be available for carrier: independent of - carrier provisioning. If false: hard disabled. If true: then depends on carrier - provisioning, availability etc --> - <bool name="config_carrier_wfc_ims_available">true</bool> </resources> diff --git a/core/res/res/values-mcc311-mnc220/config.xml b/core/res/res/values-mcc311-mnc220/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc220/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc221/config.xml b/core/res/res/values-mcc311-mnc221/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc221/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc222/config.xml b/core/res/res/values-mcc311-mnc222/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc222/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc223/config.xml b/core/res/res/values-mcc311-mnc223/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc223/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc224/config.xml b/core/res/res/values-mcc311-mnc224/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc224/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc225/config.xml b/core/res/res/values-mcc311-mnc225/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc225/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc226/config.xml b/core/res/res/values-mcc311-mnc226/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc226/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc227/config.xml b/core/res/res/values-mcc311-mnc227/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc227/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc228/config.xml b/core/res/res/values-mcc311-mnc228/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc228/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc229/config.xml b/core/res/res/values-mcc311-mnc229/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc229/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc480/config.xml b/core/res/res/values-mcc311-mnc480/config.xml index 39ea2bf1f5aa..8d7fd6177500 100755 --- a/core/res/res/values-mcc311-mnc480/config.xml +++ b/core/res/res/values-mcc311-mnc480/config.xml @@ -52,11 +52,6 @@ <bool name="config_carrier_volte_provisioned">true</bool> <bool name="config_auto_attach_data_on_creation">false</bool> - <!-- service number convert map in roaming network. --> - <string-array translatable="false" name="dial_string_replace"> - <item>"*611:+19085594899,"</item> - <item>"*86:+1MDN,"</item> - </string-array> <!-- Flag indicating whether strict threshold is used, or lenient threshold is used, when evaluating RSRP for LTE antenna bar display diff --git a/core/res/res/values-mcc311-mnc490/config.xml b/core/res/res/values-mcc311-mnc490/config.xml index d481c9717e23..836abdf39ab8 100644 --- a/core/res/res/values-mcc311-mnc490/config.xml +++ b/core/res/res/values-mcc311-mnc490/config.xml @@ -21,9 +21,6 @@ for different hardware and product builds. --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- Sprint need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">70</integer> - <!-- An array of CDMA roaming indicators which means international roaming --> <integer-array translatable="false" name="config_cdma_international_roaming_indicators" > <item>2</item> diff --git a/core/res/res/values-mcc311-mnc580/config.xml b/core/res/res/values-mcc311-mnc580/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc580/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc581/config.xml b/core/res/res/values-mcc311-mnc581/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc581/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc582/config.xml b/core/res/res/values-mcc311-mnc582/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc582/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc583/config.xml b/core/res/res/values-mcc311-mnc583/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc583/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc584/config.xml b/core/res/res/values-mcc311-mnc584/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc584/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc585/config.xml b/core/res/res/values-mcc311-mnc585/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc585/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc586/config.xml b/core/res/res/values-mcc311-mnc586/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc586/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc587/config.xml b/core/res/res/values-mcc311-mnc587/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc587/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc588/config.xml b/core/res/res/values-mcc311-mnc588/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc588/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc589/config.xml b/core/res/res/values-mcc311-mnc589/config.xml deleted file mode 100644 index 811e9c73d2e1..000000000000 --- a/core/res/res/values-mcc311-mnc589/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2014, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You my 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- USC need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">300</integer> -</resources> diff --git a/core/res/res/values-mcc311-mnc870/config.xml b/core/res/res/values-mcc311-mnc870/config.xml index 98cb72ee50f5..f6aed1335d66 100644 --- a/core/res/res/values-mcc311-mnc870/config.xml +++ b/core/res/res/values-mcc311-mnc870/config.xml @@ -25,9 +25,6 @@ --> <integer name="config_mobile_mtu">1422</integer> - <!-- Sprint need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">70</integer> - <!-- An array of CDMA roaming indicators which means international roaming --> <integer-array translatable="false" name="config_cdma_international_roaming_indicators" > <item>2</item> diff --git a/core/res/res/values-mcc312-mnc530/config.xml b/core/res/res/values-mcc312-mnc530/config.xml index 98cb72ee50f5..f6aed1335d66 100644 --- a/core/res/res/values-mcc312-mnc530/config.xml +++ b/core/res/res/values-mcc312-mnc530/config.xml @@ -25,9 +25,6 @@ --> <integer name="config_mobile_mtu">1422</integer> - <!-- Sprint need a 70 ms delay for 3way call --> - <integer name="config_cdma_3waycall_flash_delay">70</integer> - <!-- An array of CDMA roaming indicators which means international roaming --> <integer-array translatable="false" name="config_cdma_international_roaming_indicators" > <item>2</item> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 05d9a28333b7..f90969561011 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2212,6 +2212,21 @@ <!-- Sprint need a 70 ms delay for 3way call --> <integer name="config_cdma_3waycall_flash_delay">0</integer> + <!-- If there is no preload VM number in the sim card, carriers such as + Verizon require to load a default vm number from the configurantion. + Define config_default_vm_number for this purpose. And there are two + optional formats for this configuration as below: + (1)<item>voicemail number</item> + (2)<item>voicemail number;gid</item> + The logic to pick up the correct voicemail number: + (1) If the config_default_vm_number array has no gid special item, the last one will be + picked + (2) If the config_default_vm_number array has gid special item and it matches the current + sim's gid, it will be picked. + (3) If the config_default_vm_number array has gid special item but it doesn't match the + current sim's gid, the last one without gid will be picked --> + <string-array translatable="false" name="config_default_vm_number" /> + <!--SIM does not save, but the voice mail number to be changed. --> <bool name="editable_voicemailnumber">false</bool> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 5018e2fb63c0..9a394373059a 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2237,6 +2237,7 @@ <java-symbol type="layout" name="resolver_different_item_header" /> <java-symbol type="array" name="config_default_vm_number" /> <java-symbol type="integer" name="config_cdma_3waycall_flash_delay"/> + <java-symbol type="array" name="config_default_vm_number" /> <java-symbol type="attr" name="windowBackgroundFallback" /> <java-symbol type="id" name="textSpacerNoButtons" /> <java-symbol type="array" name="dial_string_replace" /> diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/WifiAssociationTest.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/WifiAssociationTest.java index 68f3179f96c1..23135dd15690 100644 --- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/WifiAssociationTest.java +++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/WifiAssociationTest.java @@ -63,11 +63,6 @@ public class WifiAssociationTest extends ConnectivityManagerTestBase { String password = arguments.getString("password"); - String freqStr = arguments.getString("frequency-band"); - if (freqStr != null) { - setFrequencyBand(freqStr); - } - assertTrue("enable Wifi failed", enableWifi()); WifiInfo wi = mWifiManager.getConnectionInfo(); logv("%s", wi); @@ -80,28 +75,6 @@ public class WifiAssociationTest extends ConnectivityManagerTestBase { } /** - * Set the frequency band and verify that it has been set. - */ - private void setFrequencyBand(String frequencyBandStr) { - int frequencyBand = -1; - if ("2.4".equals(frequencyBandStr)) { - frequencyBand = WifiManager.WIFI_FREQUENCY_BAND_2GHZ; - } else if ("5.0".equals(frequencyBandStr)) { - frequencyBand = WifiManager.WIFI_FREQUENCY_BAND_5GHZ; - } else if ("auto".equals(frequencyBandStr)) { - frequencyBand = WifiManager.WIFI_FREQUENCY_BAND_AUTO; - } else { - fail("Invalid frequency-band"); - } - if (mWifiManager.getFrequencyBand() != frequencyBand) { - logv("Set frequency band to %s", frequencyBandStr); - mWifiManager.setFrequencyBand(frequencyBand, true); - } - assertEquals("Specified frequency band does not match operational band", - frequencyBand, mWifiManager.getFrequencyBand()); - } - - /** * Get the {@link WifiConfiguration} based on ssid, security, and password. */ private WifiConfiguration getConfig(String ssid, SecurityType securityType, String password) { diff --git a/data/etc/platform.xml b/data/etc/platform.xml index 627f3601de2f..e46f1666282e 100644 --- a/data/etc/platform.xml +++ b/data/etc/platform.xml @@ -43,7 +43,7 @@ </permission> <permission name="android.permission.BLUETOOTH_STACK" > - <group gid="net_bt_stack" /> + <group gid="bluetooth" /> <group gid="wakelock" /> </permission> diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h index a1dadc83dfa9..881bd5f57714 100644 --- a/libs/hwui/Properties.h +++ b/libs/hwui/Properties.h @@ -149,7 +149,7 @@ enum DebugLevel { * This will disable the use of EGL_EXT_buffer_age and BUFFER_PRESERVED. * Default is "true" */ -#define PROPERTY_ENABLE_PARTIAL_UPDATES "debug.hwui.enable_partial_updates" +#define PROPERTY_ENABLE_PARTIAL_UPDATES "debug.hwui.use_partial_updates" #define PROPERTY_FILTER_TEST_OVERHEAD "debug.hwui.filter_test_overhead" diff --git a/native/android/Android.bp b/native/android/Android.bp new file mode 100644 index 000000000000..33c9655d647e --- /dev/null +++ b/native/android/Android.bp @@ -0,0 +1,20 @@ +// Copyright (C) 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. + +// The headers module is in frameworks/native/Android.bp. +ndk_library { + name: "libandroid.ndk", + symbol_file: "libandroid.map.txt", + first_version: "9", +} diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt new file mode 100644 index 000000000000..5758a3ce2a25 --- /dev/null +++ b/native/android/libandroid.map.txt @@ -0,0 +1,194 @@ +LIBANDROID { + global: + AAssetDir_close; + AAssetDir_getNextFileName; + AAssetDir_rewind; + AAssetManager_fromJava; + AAssetManager_open; + AAssetManager_openDir; + AAsset_close; + AAsset_getBuffer; + AAsset_getLength; + AAsset_getLength64; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21 + AAsset_getRemainingLength; + AAsset_getRemainingLength64; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21 + AAsset_isAllocated; + AAsset_openFileDescriptor; + AAsset_openFileDescriptor64; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21 + AAsset_read; + AAsset_seek; + AAsset_seek64; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21 + AChoreographer_getInstance; # introduced=24 + AChoreographer_postFrameCallback; # introduced=24 + AChoreographer_postFrameCallbackDelayed; # introduced=24 + AConfiguration_copy; + AConfiguration_delete; + AConfiguration_diff; + AConfiguration_fromAssetManager; + AConfiguration_getCountry; + AConfiguration_getDensity; + AConfiguration_getKeyboard; + AConfiguration_getKeysHidden; + AConfiguration_getLanguage; + AConfiguration_getLayoutDirection; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21 + AConfiguration_getMcc; + AConfiguration_getMnc; + AConfiguration_getNavHidden; + AConfiguration_getNavigation; + AConfiguration_getOrientation; + AConfiguration_getScreenHeightDp; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21 + AConfiguration_getScreenLong; + AConfiguration_getScreenSize; + AConfiguration_getScreenWidthDp; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21 + AConfiguration_getSdkVersion; + AConfiguration_getSmallestScreenWidthDp; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21 + AConfiguration_getTouchscreen; + AConfiguration_getUiModeNight; + AConfiguration_getUiModeType; + AConfiguration_isBetterThan; + AConfiguration_match; + AConfiguration_new; + AConfiguration_setCountry; + AConfiguration_setDensity; + AConfiguration_setKeyboard; + AConfiguration_setKeysHidden; + AConfiguration_setLanguage; + AConfiguration_setLayoutDirection; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21 + AConfiguration_setMcc; + AConfiguration_setMnc; + AConfiguration_setNavHidden; + AConfiguration_setNavigation; + AConfiguration_setOrientation; + AConfiguration_setScreenHeightDp; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21 + AConfiguration_setScreenLong; + AConfiguration_setScreenSize; + AConfiguration_setScreenWidthDp; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21 + AConfiguration_setSdkVersion; + AConfiguration_setSmallestScreenWidthDp; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21 + AConfiguration_setTouchscreen; + AConfiguration_setUiModeNight; + AConfiguration_setUiModeType; + AInputEvent_getDeviceId; + AInputEvent_getSource; + AInputEvent_getType; + AInputQueue_attachLooper; + AInputQueue_detachLooper; + AInputQueue_finishEvent; + AInputQueue_getEvent; + AInputQueue_hasEvents; + AInputQueue_preDispatchEvent; + AKeyEvent_getAction; + AKeyEvent_getDownTime; + AKeyEvent_getEventTime; + AKeyEvent_getFlags; + AKeyEvent_getKeyCode; + AKeyEvent_getMetaState; + AKeyEvent_getRepeatCount; + AKeyEvent_getScanCode; + ALooper_acquire; + ALooper_addFd; + ALooper_forThread; + ALooper_pollAll; + ALooper_pollOnce; + ALooper_prepare; + ALooper_release; + ALooper_removeFd; + ALooper_wake; + AMotionEvent_getAction; + AMotionEvent_getAxisValue; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21 + AMotionEvent_getButtonState; # introduced-arm=14 introduced-arm64=21 introduced-mips=14 introduced-mips64=21 introduced-x86=14 introduced-x86_64=21 + AMotionEvent_getDownTime; + AMotionEvent_getEdgeFlags; + AMotionEvent_getEventTime; + AMotionEvent_getFlags; + AMotionEvent_getHistoricalAxisValue; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21 + AMotionEvent_getHistoricalEventTime; + AMotionEvent_getHistoricalOrientation; + AMotionEvent_getHistoricalPressure; + AMotionEvent_getHistoricalRawX; + AMotionEvent_getHistoricalRawY; + AMotionEvent_getHistoricalSize; + AMotionEvent_getHistoricalToolMajor; + AMotionEvent_getHistoricalToolMinor; + AMotionEvent_getHistoricalTouchMajor; + AMotionEvent_getHistoricalTouchMinor; + AMotionEvent_getHistoricalX; + AMotionEvent_getHistoricalY; + AMotionEvent_getHistorySize; + AMotionEvent_getMetaState; + AMotionEvent_getOrientation; + AMotionEvent_getPointerCount; + AMotionEvent_getPointerId; + AMotionEvent_getPressure; + AMotionEvent_getRawX; + AMotionEvent_getRawY; + AMotionEvent_getSize; + AMotionEvent_getToolMajor; + AMotionEvent_getToolMinor; + AMotionEvent_getToolType; # introduced-arm=14 introduced-arm64=21 introduced-mips=14 introduced-mips64=21 introduced-x86=14 introduced-x86_64=21 + AMotionEvent_getTouchMajor; + AMotionEvent_getTouchMinor; + AMotionEvent_getX; + AMotionEvent_getXOffset; + AMotionEvent_getXPrecision; + AMotionEvent_getY; + AMotionEvent_getYOffset; + AMotionEvent_getYPrecision; + ANativeActivity_finish; + ANativeActivity_hideSoftInput; + ANativeActivity_setWindowFlags; + ANativeActivity_setWindowFormat; + ANativeActivity_showSoftInput; + ANativeWindow_acquire; + ANativeWindow_fromSurface; + ANativeWindow_fromSurfaceTexture; # introduced-arm=13 introduced-mips=13 introduced-x86=13 + ANativeWindow_getFormat; + ANativeWindow_getHeight; + ANativeWindow_getWidth; + ANativeWindow_lock; + ANativeWindow_release; + ANativeWindow_setBuffersGeometry; + ANativeWindow_unlockAndPost; + AObbInfo_delete; + AObbInfo_getFlags; + AObbInfo_getPackageName; + AObbInfo_getVersion; + AObbScanner_getObbInfo; + ASensorEventQueue_disableSensor; + ASensorEventQueue_enableSensor; + ASensorEventQueue_getEvents; + ASensorEventQueue_hasEvents; + ASensorEventQueue_setEventRate; + ASensorManager_createEventQueue; + ASensorManager_destroyEventQueue; + ASensorManager_getDefaultSensor; + ASensorManager_getDefaultSensorEx; # introduced=21 + ASensorManager_getInstance; + ASensorManager_getSensorList; + ASensor_getFifoMaxEventCount; # introduced=21 + ASensor_getFifoReservedEventCount; # introduced=21 + ASensor_getMinDelay; + ASensor_getName; + ASensor_getReportingMode; # introduced=21 + ASensor_getResolution; + ASensor_getStringType; # introduced=21 + ASensor_getType; + ASensor_getVendor; + ASensor_isWakeUpSensor; # introduced=21 + AStorageManager_delete; + AStorageManager_getMountedObbPath; + AStorageManager_isObbMounted; + AStorageManager_mountObb; + AStorageManager_new; + AStorageManager_unmountObb; + ATrace_beginSection; # introduced=23 + ATrace_endSection; # introduced=23 + ATrace_isEnabled; # introduced=23 + android_getTtsEngine; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21 + android_getaddrinfofornetwork; # introduced=23 + android_setprocnetwork; # introduced=23 + android_setsocknetwork; # introduced=23 + getTtsEngine; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21 + local: + *; +}; diff --git a/native/graphics/jni/Android.bp b/native/graphics/jni/Android.bp new file mode 100644 index 000000000000..e09b0b4443cd --- /dev/null +++ b/native/graphics/jni/Android.bp @@ -0,0 +1,20 @@ +// Copyright (C) 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. + +// The headers module is in frameworks/native/Android.bp. +ndk_library { + name: "libjnigraphics.ndk", + symbol_file: "libjnigraphics.map.txt", + first_version: "9", +} diff --git a/native/graphics/jni/libjnigraphics.map.txt b/native/graphics/jni/libjnigraphics.map.txt new file mode 100644 index 000000000000..a601d8af2830 --- /dev/null +++ b/native/graphics/jni/libjnigraphics.map.txt @@ -0,0 +1,8 @@ +LIBJNIGRAPHICS { + global: + AndroidBitmap_getInfo; + AndroidBitmap_lockPixels; + AndroidBitmap_unlockPixels; + local: + *; +}; diff --git a/services/core/Android.mk b/services/core/Android.mk index b965ce39e7d5..a5b1069974f2 100644 --- a/services/core/Android.mk +++ b/services/core/Android.mk @@ -11,7 +11,7 @@ LOCAL_SRC_FILES += \ java/com/android/server/EventLogTags.logtags \ java/com/android/server/am/EventLogTags.logtags \ ../../../../system/netd/server/binder/android/net/INetd.aidl \ - ../../../../system/netd/server/binder/android/net/metrics/IDnsEventListener.aidl \ + ../../../../system/netd/server/binder/android/net/metrics/INetdEventListener.aidl \ LOCAL_AIDL_INCLUDES += \ system/netd/server/binder diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index 172025b38337..6575a2a86cb9 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -689,6 +689,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { if (mUnbinding) return; mUnbinding = true; mHandler.removeMessages(MESSAGE_BLUETOOTH_STATE_CHANGE); + mHandler.removeMessages(MESSAGE_BIND_PROFILE_SERVICE); if (mBluetooth != null) { //Unregister callback object try { diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index b383633b06ed..f16376dfd348 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -760,7 +760,7 @@ public class ConnectivityService extends IConnectivityManager.Stub mTestMode = SystemProperties.get("cm.test.mode").equals("true") && SystemProperties.get("ro.build.type").equals("eng"); - mTethering = new Tethering(mContext, mNetd, statsService); + mTethering = new Tethering(mContext, mNetd, statsService, mPolicyManager); mPermissionMonitor = new PermissionMonitor(mContext, mNetd); @@ -2688,12 +2688,6 @@ public class ConnectivityService extends IConnectivityManager.Stub ConnectivityManager.enforceTetherChangePermission(mContext); if (isTetheringSupported()) { final int status = mTethering.tether(iface); - if (status == ConnectivityManager.TETHER_ERROR_NO_ERROR) { - try { - mPolicyManager.onTetheringChanged(iface, true); - } catch (RemoteException e) { - } - } return status; } else { return ConnectivityManager.TETHER_ERROR_UNSUPPORTED; @@ -2706,12 +2700,6 @@ public class ConnectivityService extends IConnectivityManager.Stub if (isTetheringSupported()) { final int status = mTethering.untether(iface); - if (status == ConnectivityManager.TETHER_ERROR_NO_ERROR) { - try { - mPolicyManager.onTetheringChanged(iface, false); - } catch (RemoteException e) { - } - } return status; } else { return ConnectivityManager.TETHER_ERROR_UNSUPPORTED; diff --git a/services/core/java/com/android/server/RecoverySystemService.java b/services/core/java/com/android/server/RecoverySystemService.java index 276687f844da..3c8c699a65bb 100644 --- a/services/core/java/com/android/server/RecoverySystemService.java +++ b/services/core/java/com/android/server/RecoverySystemService.java @@ -21,6 +21,7 @@ import android.net.LocalSocket; import android.net.LocalSocketAddress; import android.os.IRecoverySystem; import android.os.IRecoverySystemProgressListener; +import android.os.PowerManager; import android.os.RecoverySystem; import android.os.RemoteException; import android.os.SystemProperties; @@ -50,8 +51,15 @@ public final class RecoverySystemService extends SystemService { // The socket at /dev/socket/uncrypt to communicate with uncrypt. private static final String UNCRYPT_SOCKET = "uncrypt"; + // The init services that communicate with /system/bin/uncrypt. + private static final String INIT_SERVICE_UNCRYPT = "init.svc.uncrypt"; + private static final String INIT_SERVICE_SETUP_BCB = "init.svc.setup-bcb"; + private static final String INIT_SERVICE_CLEAR_BCB = "init.svc.clear-bcb"; + private static final int SOCKET_CONNECTION_MAX_RETRY = 30; + private static final Object sRequestLock = new Object(); + private Context mContext; public RecoverySystemService(Context context) { @@ -69,95 +77,155 @@ public final class RecoverySystemService extends SystemService { public boolean uncrypt(String filename, IRecoverySystemProgressListener listener) { if (DEBUG) Slog.d(TAG, "uncrypt: " + filename); - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null); + synchronized (sRequestLock) { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null); - // Write the filename into UNCRYPT_PACKAGE_FILE to be read by - // uncrypt. - RecoverySystem.UNCRYPT_PACKAGE_FILE.delete(); + final boolean available = checkAndWaitForUncryptService(); + if (!available) { + Slog.e(TAG, "uncrypt service is unavailable."); + return false; + } - try (FileWriter uncryptFile = new FileWriter(RecoverySystem.UNCRYPT_PACKAGE_FILE)) { - uncryptFile.write(filename + "\n"); - } catch (IOException e) { - Slog.e(TAG, "IOException when writing \"" + RecoverySystem.UNCRYPT_PACKAGE_FILE + - "\": ", e); - return false; - } + // Write the filename into UNCRYPT_PACKAGE_FILE to be read by + // uncrypt. + RecoverySystem.UNCRYPT_PACKAGE_FILE.delete(); - // Trigger uncrypt via init. - SystemProperties.set("ctl.start", "uncrypt"); + try (FileWriter uncryptFile = new FileWriter(RecoverySystem.UNCRYPT_PACKAGE_FILE)) { + uncryptFile.write(filename + "\n"); + } catch (IOException e) { + Slog.e(TAG, "IOException when writing \"" + + RecoverySystem.UNCRYPT_PACKAGE_FILE + "\":", e); + return false; + } - // Connect to the uncrypt service socket. - LocalSocket socket = connectService(); - if (socket == null) { - Slog.e(TAG, "Failed to connect to uncrypt socket"); - return false; - } + // Trigger uncrypt via init. + SystemProperties.set("ctl.start", "uncrypt"); - // Read the status from the socket. - DataInputStream dis = null; - DataOutputStream dos = null; - try { - dis = new DataInputStream(socket.getInputStream()); - dos = new DataOutputStream(socket.getOutputStream()); - int lastStatus = Integer.MIN_VALUE; - while (true) { - int status = dis.readInt(); - // Avoid flooding the log with the same message. - if (status == lastStatus && lastStatus != Integer.MIN_VALUE) { - continue; - } - lastStatus = status; - - if (status >= 0 && status <= 100) { - // Update status - Slog.i(TAG, "uncrypt read status: " + status); - if (listener != null) { - try { - listener.onProgress(status); - } catch (RemoteException ignored) { - Slog.w(TAG, "RemoteException when posting progress"); - } + // Connect to the uncrypt service socket. + LocalSocket socket = connectService(); + if (socket == null) { + Slog.e(TAG, "Failed to connect to uncrypt socket"); + return false; + } + + // Read the status from the socket. + DataInputStream dis = null; + DataOutputStream dos = null; + try { + dis = new DataInputStream(socket.getInputStream()); + dos = new DataOutputStream(socket.getOutputStream()); + int lastStatus = Integer.MIN_VALUE; + while (true) { + int status = dis.readInt(); + // Avoid flooding the log with the same message. + if (status == lastStatus && lastStatus != Integer.MIN_VALUE) { + continue; } - if (status == 100) { - Slog.i(TAG, "uncrypt successfully finished."); - // Ack receipt of the final status code. uncrypt - // waits for the ack so the socket won't be - // destroyed before we receive the code. + lastStatus = status; + + if (status >= 0 && status <= 100) { + // Update status + Slog.i(TAG, "uncrypt read status: " + status); + if (listener != null) { + try { + listener.onProgress(status); + } catch (RemoteException ignored) { + Slog.w(TAG, "RemoteException when posting progress"); + } + } + if (status == 100) { + Slog.i(TAG, "uncrypt successfully finished."); + // Ack receipt of the final status code. uncrypt + // waits for the ack so the socket won't be + // destroyed before we receive the code. + dos.writeInt(0); + break; + } + } else { + // Error in /system/bin/uncrypt. + Slog.e(TAG, "uncrypt failed with status: " + status); + // Ack receipt of the final status code. uncrypt waits + // for the ack so the socket won't be destroyed before + // we receive the code. dos.writeInt(0); - break; + return false; } - } else { - // Error in /system/bin/uncrypt. - Slog.e(TAG, "uncrypt failed with status: " + status); - // Ack receipt of the final status code. uncrypt waits - // for the ack so the socket won't be destroyed before - // we receive the code. - dos.writeInt(0); - return false; } + } catch (IOException e) { + Slog.e(TAG, "IOException when reading status: ", e); + return false; + } finally { + IoUtils.closeQuietly(dis); + IoUtils.closeQuietly(dos); + IoUtils.closeQuietly(socket); } - } catch (IOException e) { - Slog.e(TAG, "IOException when reading status: ", e); - return false; - } finally { - IoUtils.closeQuietly(dis); - IoUtils.closeQuietly(dos); - IoUtils.closeQuietly(socket); - } - return true; + return true; + } } @Override // Binder call public boolean clearBcb() { if (DEBUG) Slog.d(TAG, "clearBcb"); - return setupOrClearBcb(false, null); + synchronized (sRequestLock) { + return setupOrClearBcb(false, null); + } } @Override // Binder call public boolean setupBcb(String command) { if (DEBUG) Slog.d(TAG, "setupBcb: [" + command + "]"); - return setupOrClearBcb(true, command); + synchronized (sRequestLock) { + return setupOrClearBcb(true, command); + } + } + + @Override // Binder call + public void rebootRecoveryWithCommand(String command) { + if (DEBUG) Slog.d(TAG, "rebootRecoveryWithCommand: [" + command + "]"); + synchronized (sRequestLock) { + if (!setupOrClearBcb(true, command)) { + return; + } + + // Having set up the BCB, go ahead and reboot. + PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); + pm.reboot(PowerManager.REBOOT_RECOVERY); + } + } + + /** + * Check if any of the init services is still running. If so, we cannot + * start a new uncrypt/setup-bcb/clear-bcb service right away; otherwise + * it may break the socket communication since init creates / deletes + * the socket (/dev/socket/uncrypt) on service start / exit. + */ + private boolean checkAndWaitForUncryptService() { + for (int retry = 0; retry < SOCKET_CONNECTION_MAX_RETRY; retry++) { + final String uncryptService = SystemProperties.get(INIT_SERVICE_UNCRYPT); + final String setupBcbService = SystemProperties.get(INIT_SERVICE_SETUP_BCB); + final String clearBcbService = SystemProperties.get(INIT_SERVICE_CLEAR_BCB); + final boolean busy = "running".equals(uncryptService) || + "running".equals(setupBcbService) || "running".equals(clearBcbService); + if (DEBUG) { + Slog.i(TAG, "retry: " + retry + " busy: " + busy + + " uncrypt: [" + uncryptService + "]" + + " setupBcb: [" + setupBcbService + "]" + + " clearBcb: [" + clearBcbService + "]"); + } + + if (!busy) { + return true; + } + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + Slog.w(TAG, "Interrupted:", e); + } + } + + return false; } private LocalSocket connectService() { @@ -176,7 +244,7 @@ public final class RecoverySystemService extends SystemService { try { Thread.sleep(1000); } catch (InterruptedException e) { - Slog.w(TAG, "Interrupted: ", e); + Slog.w(TAG, "Interrupted:", e); } } } @@ -190,6 +258,12 @@ public final class RecoverySystemService extends SystemService { private boolean setupOrClearBcb(boolean isSetup, String command) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null); + final boolean available = checkAndWaitForUncryptService(); + if (!available) { + Slog.e(TAG, "uncrypt service is unavailable."); + return false; + } + if (isSetup) { SystemProperties.set("ctl.start", "setup-bcb"); } else { @@ -232,7 +306,7 @@ public final class RecoverySystemService extends SystemService { return false; } } catch (IOException e) { - Slog.e(TAG, "IOException when communicating with uncrypt: ", e); + Slog.e(TAG, "IOException when communicating with uncrypt:", e); return false; } finally { IoUtils.closeQuietly(dis); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 867168a07a03..eb5bf228b852 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -6098,6 +6098,8 @@ public final class ActivityManagerService extends ActivityManagerNative ProcessList.INVALID_ADJ, callerWillRestart, true, doit, evenPersistent, packageName == null ? ("stop user " + userId) : ("stop " + packageName)); + didSomething |= mActivityStarter.clearPendingActivityLaunchesLocked(packageName); + if (mStackSupervisor.finishDisabledPackageActivitiesLocked( packageName, null, doit, evenPersistent, userId)) { if (!doit) { @@ -6427,6 +6429,8 @@ public final class ActivityManagerService extends ActivityManagerNative app.debugging = false; app.cached = false; app.killedByAm = false; + app.killed = false; + // We carefully use the same state that PackageManager uses for // filtering, since we use this flag to decide if we need to install @@ -11429,6 +11433,7 @@ public final class ActivityManagerService extends ActivityManagerNative && userId == UserHandle.USER_SYSTEM && (info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) { r.persistent = true; + r.maxAdj = ProcessList.PERSISTENT_PROC_ADJ; } addProcessNameLocked(r); return r; diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 7b3f65a728bf..85fa139906dd 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -2006,4 +2006,18 @@ class ActivityStarter { } } } + + boolean clearPendingActivityLaunchesLocked(String packageName) { + boolean didSomething = false; + + for (int palNdx = mPendingActivityLaunches.size() - 1; palNdx >= 0; --palNdx) { + PendingActivityLaunch pal = mPendingActivityLaunches.get(palNdx); + ActivityRecord r = pal.r; + if (r != null && r.packageName.equals(packageName)) { + mPendingActivityLaunches.remove(palNdx); + didSomething = true; + } + } + return didSomething; + } } diff --git a/services/core/java/com/android/server/connectivity/MetricsLoggerService.java b/services/core/java/com/android/server/connectivity/MetricsLoggerService.java index 69ef30fbe66a..3675b3e217d2 100644 --- a/services/core/java/com/android/server/connectivity/MetricsLoggerService.java +++ b/services/core/java/com/android/server/connectivity/MetricsLoggerService.java @@ -55,8 +55,8 @@ public class MetricsLoggerService extends SystemService { if (DBG) Log.d(TAG, "onBootPhase: PHASE_SYSTEM_SERVICES_READY"); publishBinderService(ConnectivityMetricsLogger.CONNECTIVITY_METRICS_LOGGER_SERVICE, mBinder); - mDnsListener = new DnsEventListenerService(getContext()); - publishBinderService(mDnsListener.SERVICE_NAME, mDnsListener); + mNetdListener = new NetdEventListenerService(getContext()); + publishBinderService(mNetdListener.SERVICE_NAME, mNetdListener); } } @@ -91,7 +91,7 @@ public class MetricsLoggerService extends SystemService { private final ArrayDeque<ConnectivityMetricsEvent> mEvents = new ArrayDeque<>(); - private DnsEventListenerService mDnsListener; + private NetdEventListenerService mNetdListener; private void enforceConnectivityInternalPermission() { getContext().enforceCallingOrSelfPermission( @@ -223,7 +223,7 @@ public class MetricsLoggerService extends SystemService { } pw.println(); - mDnsListener.dump(pw); + mNetdListener.dump(pw); } public long logEvent(ConnectivityMetricsEvent event) { diff --git a/services/core/java/com/android/server/connectivity/DnsEventListenerService.java b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java index 18ab73100b81..98f34ca11f71 100644 --- a/services/core/java/com/android/server/connectivity/DnsEventListenerService.java +++ b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java @@ -22,7 +22,7 @@ import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; import android.net.Network; import android.net.NetworkRequest; -import android.net.metrics.IDnsEventListener; +import android.net.metrics.INetdEventListener; import android.util.Log; import com.android.internal.annotations.GuardedBy; @@ -35,13 +35,13 @@ import java.util.TreeMap; /** - * Implementation of the IDnsEventListener interface. + * Implementation of the INetdEventListener interface. */ -public class DnsEventListenerService extends IDnsEventListener.Stub { +public class NetdEventListenerService extends INetdEventListener.Stub { - public static final String SERVICE_NAME = "dns_listener"; + public static final String SERVICE_NAME = "netd_listener"; - private static final String TAG = DnsEventListenerService.class.getSimpleName(); + private static final String TAG = NetdEventListenerService.class.getSimpleName(); private static final boolean DBG = true; private static final boolean VDBG = false; @@ -106,7 +106,7 @@ public class DnsEventListenerService extends IDnsEventListener.Stub { private final NetworkCallback mNetworkCallback = new NetworkCallback() { @Override public void onLost(Network network) { - synchronized (DnsEventListenerService.this) { + synchronized (NetdEventListenerService.this) { DnsEventBatch batch = mEventBatches.remove(network.netId); if (batch != null) { batch.logAndClear(); @@ -115,7 +115,7 @@ public class DnsEventListenerService extends IDnsEventListener.Stub { } }; - public DnsEventListenerService(Context context) { + public NetdEventListenerService(Context context) { // We are started when boot is complete, so ConnectivityService should already be running. final NetworkRequest request = new NetworkRequest.Builder() .clearCapabilities() diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index e9b66902d491..b3d5efa65267 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -33,6 +33,7 @@ import android.content.res.Resources; import android.hardware.usb.UsbManager; import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; +import android.net.INetworkPolicyManager; import android.net.INetworkStatsService; import android.net.LinkProperties; import android.net.Network; @@ -49,6 +50,7 @@ import android.os.INetworkManagementService; import android.os.Looper; import android.os.Message; import android.os.Parcel; +import android.os.RemoteException; import android.os.ResultReceiver; import android.os.SystemProperties; import android.os.UserHandle; @@ -122,6 +124,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private final INetworkManagementService mNMService; private final INetworkStatsService mStatsService; + private final INetworkPolicyManager mPolicyManager; private final Looper mLooper; private static class TetherState { @@ -176,10 +179,11 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private boolean mWifiTetherRequested; public Tethering(Context context, INetworkManagementService nmService, - INetworkStatsService statsService) { + INetworkStatsService statsService, INetworkPolicyManager policyManager) { mContext = context; mNMService = nmService; mStatsService = statsService; + mPolicyManager = policyManager; mPublicSync = new Object(); @@ -621,12 +625,9 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } public void untetherAll() { - synchronized (mPublicSync) { - if (DBG) Log.d(TAG, "Untethering " + mTetherStates.keySet()); - for (int i = 0; i < mTetherStates.size(); i++) { - untether(mTetherStates.keyAt(i)); - } - } + stopTethering(ConnectivityManager.TETHERING_WIFI); + stopTethering(ConnectivityManager.TETHERING_USB); + stopTethering(ConnectivityManager.TETHERING_BLUETOOTH); } public int getLastTetherError(String iface) { @@ -1755,6 +1756,15 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering " with error " + error); } + try { + // Notify that we're tethering (or not) this interface. + // This is how data saver for instance knows if the user explicitly + // turned on tethering (thus keeping us from being in data saver mode). + mPolicyManager.onTetheringChanged(iface, state == IControlsTethering.STATE_TETHERED); + } catch (RemoteException e) { + // Not really very much we can do here. + } + switch (state) { case IControlsTethering.STATE_UNAVAILABLE: case IControlsTethering.STATE_AVAILABLE: diff --git a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java index 50bb022ef3f0..76ad9d75bb2d 100644 --- a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java +++ b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java @@ -136,10 +136,17 @@ public class TetherInterfaceStateMachine extends StateMachine { if (ifcg != null) { InetAddress addr = NetworkUtils.numericToInetAddress(ipAsString); ifcg.setLinkAddress(new LinkAddress(addr, prefixLen)); - if (enabled) { - ifcg.setInterfaceUp(); + if (mInterfaceType == ConnectivityManager.TETHERING_WIFI) { + // The WiFi stack has ownership of the interface up/down state. + // It is unclear whether the bluetooth or USB stacks will manage their own + // state. + ifcg.ignoreInterfaceUpDownStatus(); } else { - ifcg.setInterfaceDown(); + if (enabled) { + ifcg.setInterfaceUp(); + } else { + ifcg.setInterfaceDown(); + } } ifcg.clearFlag("running"); mNMService.setInterfaceConfig(mIfaceName, ifcg); diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java index cc556c7e45b3..a12a92cc7a6a 100644 --- a/services/core/java/com/android/server/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java @@ -178,6 +178,7 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe public void binderDied() { Slog.v(TAG, "fingerprintd died"); mDaemon = null; + mCurrentUserId = UserHandle.USER_CURRENT; handleError(mHalDeviceId, FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE); } diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index 72c549f7bec6..2e18b1c417fe 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -230,6 +230,11 @@ public final class Installer extends SystemService { mInstaller.execute("move_ab", apkPath, instructionSet, outputPath); } + public void deleteOdex(String apkPath, String instructionSet, String outputPath) + throws InstallerException { + mInstaller.execute("delete_odex", apkPath, instructionSet, outputPath); + } + private static void assertValidInstructionSet(String instructionSet) throws InstallerException { for (String abi : Build.SUPPORTED_ABIS) { diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java index bff6d2d4786e..689917cd670a 100644 --- a/services/core/java/com/android/server/pm/OtaDexoptService.java +++ b/services/core/java/com/android/server/pm/OtaDexoptService.java @@ -31,7 +31,7 @@ import android.os.ServiceManager; import android.os.storage.StorageManager; import android.util.Log; import android.util.Slog; - +import com.android.internal.logging.MetricsLogger; import com.android.internal.os.InstallerConnection; import com.android.internal.os.InstallerConnection.InstallerException; @@ -40,6 +40,7 @@ import java.io.FileDescriptor; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.concurrent.TimeUnit; /** * A service for A/B OTA dexopting. @@ -53,6 +54,10 @@ public class OtaDexoptService extends IOtaDexopt.Stub { // The synthetic library dependencies denoting "no checks." private final static String[] NO_LIBRARIES = new String[] { "&" }; + // The amount of "available" (free - low threshold) space necessary at the start of an OTA to + // not bulk-delete unused apps' odex files. + private final static long BULK_DELETE_THRESHOLD = 1024 * 1024 * 1024; // 1GB. + private final Context mContext; private final PackageManagerService mPackageManagerService; @@ -65,6 +70,25 @@ public class OtaDexoptService extends IOtaDexopt.Stub { private int completeSize; + // MetricsLogger properties. + + // Space before and after. + private long availableSpaceBefore; + private long availableSpaceAfterBulkDelete; + private long availableSpaceAfterDexopt; + + // Packages. + private int importantPackageCount; + private int otherPackageCount; + + // Number of dexopt commands. This may be different from the count of packages. + private int dexoptCommandCountTotal; + private int dexoptCommandCountExecuted; + + // For spent time. + private long otaDexoptTimeStart; + + public OtaDexoptService(Context context, PackageManagerService packageManagerService) { this.mContext = context; this.mPackageManagerService = packageManagerService; @@ -128,6 +152,18 @@ public class OtaDexoptService extends IOtaDexopt.Stub { generatePackageDexopts(p, PackageManagerService.REASON_FIRST_BOOT)); } completeSize = mDexoptCommands.size(); + + long spaceAvailable = getAvailableSpace(); + if (spaceAvailable < BULK_DELETE_THRESHOLD) { + Log.i(TAG, "Low on space, deleting oat files in an attempt to free up space: " + + PackageManagerServiceUtils.packagesToString(others)); + for (PackageParser.Package pkg : others) { + deleteOatArtifactsOfPackage(pkg); + } + } + long spaceAvailableNow = getAvailableSpace(); + + prepareMetricsLogging(important.size(), others.size(), spaceAvailable, spaceAvailableNow); } @Override @@ -136,6 +172,9 @@ public class OtaDexoptService extends IOtaDexopt.Stub { Log.i(TAG, "Cleaning up OTA Dexopt state."); } mDexoptCommands = null; + availableSpaceAfterDexopt = getAvailableSpace(); + + performMetricsLogging(); } @Override @@ -169,28 +208,67 @@ public class OtaDexoptService extends IOtaDexopt.Stub { String next = mDexoptCommands.remove(0); - if (IsFreeSpaceAvailable()) { + if (getAvailableSpace() > 0) { + dexoptCommandCountExecuted++; + return next; } else { + if (DEBUG_DEXOPT) { + Log.w(TAG, "Not enough space for OTA dexopt, stopping with " + + (mDexoptCommands.size() + 1) + " commands left."); + } mDexoptCommands.clear(); return "(no free space)"; } } - /** - * Check for low space. Returns true if there's space left. - */ - private boolean IsFreeSpaceAvailable() { - // TODO: If apps are not installed in the internal /data partition, we should compare - // against that storage's free capacity. + private long getMainLowSpaceThreshold() { File dataDir = Environment.getDataDirectory(); @SuppressWarnings("deprecation") long lowThreshold = StorageManager.from(mContext).getStorageLowBytes(dataDir); if (lowThreshold == 0) { throw new IllegalStateException("Invalid low memory threshold"); } + return lowThreshold; + } + + /** + * Returns the difference of free space to the low-storage-space threshold. Positive values + * indicate free bytes. + */ + private long getAvailableSpace() { + // TODO: If apps are not installed in the internal /data partition, we should compare + // against that storage's free capacity. + long lowThreshold = getMainLowSpaceThreshold(); + + File dataDir = Environment.getDataDirectory(); long usableSpace = dataDir.getUsableSpace(); - return (usableSpace >= lowThreshold); + + return usableSpace - lowThreshold; + } + + private static String getOatDir(PackageParser.Package pkg) { + if (!pkg.canHaveOatDir()) { + return null; + } + File codePath = new File(pkg.codePath); + if (codePath.isDirectory()) { + return PackageDexOptimizer.getOatDir(codePath).getAbsolutePath(); + } + return null; + } + + private void deleteOatArtifactsOfPackage(PackageParser.Package pkg) { + String[] instructionSets = getAppDexInstructionSets(pkg.applicationInfo); + for (String codePath : pkg.getAllCodePaths()) { + for (String isa : instructionSets) { + try { + mPackageManagerService.mInstaller.deleteOdex(codePath, isa, getOatDir(pkg)); + } catch (InstallerException e) { + Log.e(TAG, "Failed deleting oat files for " + codePath, e); + } + } + } } /** @@ -271,6 +349,55 @@ public class OtaDexoptService extends IOtaDexopt.Stub { } } + /** + * Initialize logging fields. + */ + private void prepareMetricsLogging(int important, int others, long spaceBegin, long spaceBulk) { + availableSpaceBefore = spaceBegin; + availableSpaceAfterBulkDelete = spaceBulk; + availableSpaceAfterDexopt = 0; + + importantPackageCount = important; + otherPackageCount = others; + + dexoptCommandCountTotal = mDexoptCommands.size(); + dexoptCommandCountExecuted = 0; + + otaDexoptTimeStart = System.nanoTime(); + } + + private static int inMegabytes(long value) { + long in_mega_bytes = value / (1024 * 1024); + if (in_mega_bytes > Integer.MAX_VALUE) { + Log.w(TAG, "Recording " + in_mega_bytes + "MB of free space, overflowing range"); + return Integer.MAX_VALUE; + } + return (int)in_mega_bytes; + } + + private void performMetricsLogging() { + long finalTime = System.nanoTime(); + + MetricsLogger.histogram(mContext, "ota_dexopt_available_space_before_mb", + inMegabytes(availableSpaceBefore)); + MetricsLogger.histogram(mContext, "ota_dexopt_available_space_after_bulk_delete_mb", + inMegabytes(availableSpaceAfterBulkDelete)); + MetricsLogger.histogram(mContext, "ota_dexopt_available_space_after_dexopt_mb", + inMegabytes(availableSpaceAfterDexopt)); + + MetricsLogger.histogram(mContext, "ota_dexopt_num_important_packages", + importantPackageCount); + MetricsLogger.histogram(mContext, "ota_dexopt_num_other_packages", otherPackageCount); + + MetricsLogger.histogram(mContext, "ota_dexopt_num_commands", dexoptCommandCountTotal); + MetricsLogger.histogram(mContext, "ota_dexopt_num_commands_executed", + dexoptCommandCountExecuted); + + final int elapsedTimeSeconds = + (int) TimeUnit.NANOSECONDS.toSeconds(finalTime - otaDexoptTimeStart); + MetricsLogger.histogram(mContext, "ota_dexopt_time_s", elapsedTimeSeconds); + } + private static class OTADexoptPackageDexOptimizer extends PackageDexOptimizer.ForcedUpdatePackageDexOptimizer { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 76d987b54e44..85cc12427cef 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4578,6 +4578,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public String[] getPackagesForUid(int uid) { + final int userId = UserHandle.getUserId(uid); uid = UserHandle.getAppId(uid); // reader synchronized (mPackages) { @@ -4585,9 +4586,16 @@ public class PackageManagerService extends IPackageManager.Stub { if (obj instanceof SharedUserSetting) { final SharedUserSetting sus = (SharedUserSetting) obj; final int N = sus.packages.size(); - final String[] res = new String[N]; - for (int i = 0; i < N; i++) { - res[i] = sus.packages.valueAt(i).name; + String[] res = new String[N]; + final Iterator<PackageSetting> it = sus.packages.iterator(); + int i = 0; + while (it.hasNext()) { + PackageSetting ps = it.next(); + if (ps.getInstalled(userId)) { + res[i++] = ps.name; + } else { + res = ArrayUtils.removeElement(String.class, res, res[i]); + } } return res; } else if (obj instanceof PackageSetting) { diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java index 751c5858446b..cfd0af7635e8 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java @@ -19,6 +19,7 @@ package com.android.server.pm; import static com.android.server.pm.PackageManagerService.DEBUG_DEXOPT; import static com.android.server.pm.PackageManagerService.TAG; +import android.annotation.NonNull; import android.app.AppGlobals; import android.content.Intent; import android.content.pm.PackageParser; @@ -35,13 +36,9 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import java.util.Set; +import java.util.function.Predicate; /** * Class containing helper methods for the PackageManagerService. @@ -67,34 +64,51 @@ public class PackageManagerServiceUtils { return pkgNames; } - private static void filterRecentlyUsedApps(Collection<PackageParser.Package> pkgs, - long estimatedPreviousSystemUseTime, - long dexOptLRUThresholdInMills) { - // Filter out packages that aren't recently used. - int total = pkgs.size(); - int skipped = 0; - for (Iterator<PackageParser.Package> i = pkgs.iterator(); i.hasNext();) { - PackageParser.Package pkg = i.next(); - long then = pkg.getLatestForegroundPackageUseTimeInMills(); - if (then < estimatedPreviousSystemUseTime - dexOptLRUThresholdInMills) { - if (DEBUG_DEXOPT) { - Log.i(TAG, "Skipping dexopt of " + pkg.packageName + - " last used in foreground: " + - ((then == 0) ? "never" : new Date(then))); - } - i.remove(); - skipped++; - } else { - if (DEBUG_DEXOPT) { - Log.i(TAG, "Will dexopt " + pkg.packageName + - " last used in foreground: " + - ((then == 0) ? "never" : new Date(then))); - } + // Sort a list of apps by their last usage, most recently used apps first. The order of + // packages without usage data is undefined (but they will be sorted after the packages + // that do have usage data). + public static void sortPackagesByUsageDate(List<PackageParser.Package> pkgs, + PackageManagerService packageManagerService) { + if (!packageManagerService.isHistoricalPackageUsageAvailable()) { + return; + } + + Collections.sort(pkgs, (pkg1, pkg2) -> + Long.compare(pkg2.getLatestForegroundPackageUseTimeInMills(), + pkg1.getLatestForegroundPackageUseTimeInMills())); + } + + // Apply the given {@code filter} to all packages in {@code packages}. If tested positive, the + // package will be removed from {@code packages} and added to {@code result} with its + // dependencies. If usage data is available, the positive packages will be sorted by usage + // data (with {@code sortTemp} as temporary storage). + private static void applyPackageFilter(Predicate<PackageParser.Package> filter, + Collection<PackageParser.Package> result, + Collection<PackageParser.Package> packages, + @NonNull List<PackageParser.Package> sortTemp, + PackageManagerService packageManagerService) { + for (PackageParser.Package pkg : packages) { + if (filter.test(pkg)) { + sortTemp.add(pkg); } } - if (DEBUG_DEXOPT) { - Log.i(TAG, "Skipped dexopt " + skipped + " of " + total); + + sortPackagesByUsageDate(sortTemp, packageManagerService); + packages.removeAll(sortTemp); + + for (PackageParser.Package pkg : sortTemp) { + result.add(pkg); + + Collection<PackageParser.Package> deps = + packageManagerService.findSharedNonSystemLibraries(pkg); + if (!deps.isEmpty()) { + deps.removeAll(result); + result.addAll(deps); + packages.removeAll(deps); + } } + + sortTemp.clear(); } // Sort apps by importance for dexopt ordering. Important apps are given @@ -104,46 +118,25 @@ public class PackageManagerServiceUtils { PackageManagerService packageManagerService) { ArrayList<PackageParser.Package> remainingPkgs = new ArrayList<>(packages); LinkedList<PackageParser.Package> result = new LinkedList<>(); + ArrayList<PackageParser.Package> sortTemp = new ArrayList<>(remainingPkgs.size()); // Give priority to core apps. - for (PackageParser.Package pkg : remainingPkgs) { - if (pkg.coreApp) { - if (DEBUG_DEXOPT) { - Log.i(TAG, "Adding core app " + result.size() + ": " + pkg.packageName); - } - result.add(pkg); - } - } - remainingPkgs.removeAll(result); + applyPackageFilter((pkg) -> pkg.coreApp, result, remainingPkgs, sortTemp, + packageManagerService); // Give priority to system apps that listen for pre boot complete. Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED); - ArraySet<String> pkgNames = getPackageNamesForIntent(intent, UserHandle.USER_SYSTEM); - for (PackageParser.Package pkg : remainingPkgs) { - if (pkgNames.contains(pkg.packageName)) { - if (DEBUG_DEXOPT) { - Log.i(TAG, "Adding pre boot system app " + result.size() + ": " + - pkg.packageName); - } - result.add(pkg); - } - } - remainingPkgs.removeAll(result); + final ArraySet<String> pkgNames = getPackageNamesForIntent(intent, UserHandle.USER_SYSTEM); + applyPackageFilter((pkg) -> pkgNames.contains(pkg.packageName), result, remainingPkgs, + sortTemp, packageManagerService); // Give priority to apps used by other apps. - for (PackageParser.Package pkg : remainingPkgs) { - if (PackageDexOptimizer.isUsedByOtherApps(pkg)) { - if (DEBUG_DEXOPT) { - Log.i(TAG, "Adding app used by other apps " + result.size() + ": " + - pkg.packageName); - } - result.add(pkg); - } - } - remainingPkgs.removeAll(result); + applyPackageFilter((pkg) -> PackageDexOptimizer.isUsedByOtherApps(pkg), result, + remainingPkgs, sortTemp, packageManagerService); // Filter out packages that aren't recently used, add all remaining apps. // TODO: add a property to control this? + Predicate<PackageParser.Package> remainingPredicate; if (!remainingPkgs.isEmpty() && packageManagerService.isHistoricalPackageUsageAvailable()) { if (DEBUG_DEXOPT) { Log.i(TAG, "Looking at historical package use"); @@ -159,34 +152,24 @@ public class PackageManagerServiceUtils { lastUsed.getLatestForegroundPackageUseTimeInMills(); // Be defensive if for some reason package usage has bogus data. if (estimatedPreviousSystemUseTime != 0) { - filterRecentlyUsedApps(remainingPkgs, estimatedPreviousSystemUseTime, - SEVEN_DAYS_IN_MILLISECONDS); + final long cutoffTime = estimatedPreviousSystemUseTime - SEVEN_DAYS_IN_MILLISECONDS; + remainingPredicate = + (pkg) -> pkg.getLatestForegroundPackageUseTimeInMills() >= cutoffTime; + } else { + // No meaningful historical info. Take all. + remainingPredicate = (pkg) -> true; } + sortPackagesByUsageDate(remainingPkgs, packageManagerService); + } else { + // No historical info. Take all. + remainingPredicate = (pkg) -> true; } - result.addAll(remainingPkgs); - - // Now go ahead and also add the libraries required for these packages. - // TODO: Think about interleaving things. - Set<PackageParser.Package> dependencies = new HashSet<>(); - for (PackageParser.Package p : result) { - dependencies.addAll(packageManagerService.findSharedNonSystemLibraries(p)); - } - if (!dependencies.isEmpty()) { - // We might have packages already in `result` that are dependencies - // of other packages. Make sure we don't add those to the list twice. - dependencies.removeAll(result); - } - result.addAll(dependencies); + applyPackageFilter(remainingPredicate, result, remainingPkgs, sortTemp, + packageManagerService); if (DEBUG_DEXOPT) { - StringBuilder sb = new StringBuilder(); - for (PackageParser.Package pkg : result) { - if (sb.length() > 0) { - sb.append(", "); - } - sb.append(pkg.packageName); - } - Log.i(TAG, "Packages to be dexopted: " + sb.toString()); + Log.i(TAG, "Packages to be dexopted: " + packagesToString(result)); + Log.i(TAG, "Packages skipped from dexopt: " + packagesToString(remainingPkgs)); } return result; @@ -203,4 +186,15 @@ public class PackageManagerServiceUtils { throw ee.rethrowAsIOException(); } } + + public static String packagesToString(Collection<PackageParser.Package> c) { + StringBuilder sb = new StringBuilder(); + for (PackageParser.Package pkg : c) { + if (sb.length() > 0) { + sb.append(", "); + } + sb.append(pkg.packageName); + } + return sb.toString(); + } } diff --git a/services/core/java/com/android/server/power/ShutdownThread.java b/services/core/java/com/android/server/power/ShutdownThread.java index 5b9d139a3e0e..f7f79f324ecc 100644 --- a/services/core/java/com/android/server/power/ShutdownThread.java +++ b/services/core/java/com/android/server/power/ShutdownThread.java @@ -716,6 +716,14 @@ public final class ShutdownThread extends Thread { } if (!done[0]) { Log.w(TAG, "Timed out waiting for uncrypt."); + final int uncryptTimeoutError = 100; + String timeoutMessage = String.format("uncrypt_time: %d\n" + "uncrypt_error: %d\n", + MAX_UNCRYPT_WAIT_TIME / 1000, uncryptTimeoutError); + try { + FileUtils.stringToFile(RecoverySystem.UNCRYPT_STATUS_FILE, timeoutMessage); + } catch (IOException e) { + Log.e(TAG, "Failed to write timeout message to uncrypt status", e); + } } } } diff --git a/services/core/jni/com_android_server_AlarmManagerService.cpp b/services/core/jni/com_android_server_AlarmManagerService.cpp index 8f6f6136a49a..3a0273d8c3c8 100644 --- a/services/core/jni/com_android_server_AlarmManagerService.cpp +++ b/services/core/jni/com_android_server_AlarmManagerService.cpp @@ -39,39 +39,26 @@ #include <linux/ioctl.h> #include <linux/rtc.h> +#include <array> #include <memory> -//-------------------------------------------------------------------------- -// The android_alarm.h header has been deleted from the kernel headers. -// Add only the parts still needed, this should be deleted in the future. -#include <linux/ioctl.h> - -enum android_alarm_type { - ANDROID_ALARM_RTC_WAKEUP, - ANDROID_ALARM_RTC, - ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP, - ANDROID_ALARM_ELAPSED_REALTIME, - ANDROID_ALARM_SYSTEMTIME, - ANDROID_ALARM_TYPE_COUNT, -}; - -enum android_alarm_return_flags { - ANDROID_ALARM_RTC_WAKEUP_MASK = 1U << ANDROID_ALARM_RTC_WAKEUP, - ANDROID_ALARM_RTC_MASK = 1U << ANDROID_ALARM_RTC, - ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP_MASK = 1U << ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP, - ANDROID_ALARM_ELAPSED_REALTIME_MASK = 1U << ANDROID_ALARM_ELAPSED_REALTIME, - ANDROID_ALARM_SYSTEMTIME_MASK = 1U << ANDROID_ALARM_SYSTEMTIME, - ANDROID_ALARM_TIME_CHANGE_MASK = 1U << 16 -}; - -#define ALARM_IOW(c,type,size) _IOW('a', (c) | ((type) << 4), size) -#define ANDROID_ALARM_WAIT _IO('a', 1) -#define ANDROID_ALARM_SET(type) ALARM_IOW(2, type, struct timespec) -#define ANDROID_ALARM_SET_RTC _IOW('a', 5, struct timespec) -//-------------------------------------------------------------------------- - namespace android { +static constexpr int ANDROID_ALARM_TIME_CHANGE_MASK = 1 << 16; + +/** + * The AlarmManager alarm constants: + * + * RTC_WAKEUP + * RTC + * REALTIME_WAKEUP + * REALTIME + * SYSTEMTIME (only defined in old alarm driver header, possibly unused?) + * + * We also need an extra CLOCK_REALTIME fd which exists specifically to be + * canceled on RTC changes. + */ +static const size_t ANDROID_ALARM_TYPE_COUNT = 5; static const size_t N_ANDROID_TIMERFDS = ANDROID_ALARM_TYPE_COUNT + 1; static const clockid_t android_alarm_to_clockid[N_ANDROID_TIMERFDS] = { CLOCK_REALTIME_ALARM, @@ -81,98 +68,39 @@ static const clockid_t android_alarm_to_clockid[N_ANDROID_TIMERFDS] = { CLOCK_MONOTONIC, CLOCK_REALTIME, }; -/* to match the legacy alarm driver implementation, we need an extra - CLOCK_REALTIME fd which exists specifically to be canceled on RTC changes */ - -class AlarmImpl -{ -public: - AlarmImpl(int *fds, size_t n_fds); - virtual ~AlarmImpl(); - - virtual int set(int type, struct timespec *ts) = 0; - virtual int setTime(struct timeval *tv) = 0; - virtual int waitForAlarm() = 0; - -protected: - int *fds; - size_t n_fds; -}; -class AlarmImplAlarmDriver : public AlarmImpl -{ -public: - explicit AlarmImplAlarmDriver(int fd) : AlarmImpl(&fd, 1) { } +typedef std::array<int, N_ANDROID_TIMERFDS> TimerFds; - int set(int type, struct timespec *ts); - int setTime(struct timeval *tv); - int waitForAlarm(); -}; - -class AlarmImplTimerFd : public AlarmImpl +class AlarmImpl { public: - AlarmImplTimerFd(int fds[N_ANDROID_TIMERFDS], int epollfd, int rtc_id) : - AlarmImpl(fds, N_ANDROID_TIMERFDS), epollfd(epollfd), rtc_id(rtc_id) { } - ~AlarmImplTimerFd(); + AlarmImpl(const TimerFds &fds, int epollfd, int rtc_id) : + fds{fds}, epollfd{epollfd}, rtc_id{rtc_id} { } + ~AlarmImpl(); int set(int type, struct timespec *ts); int setTime(struct timeval *tv); int waitForAlarm(); private: - int epollfd; - int rtc_id; + const TimerFds fds; + const int epollfd; + const int rtc_id; }; -AlarmImpl::AlarmImpl(int *fds_, size_t n_fds) : fds(new int[n_fds]), - n_fds(n_fds) -{ - memcpy(fds, fds_, n_fds * sizeof(fds[0])); -} - AlarmImpl::~AlarmImpl() { - for (size_t i = 0; i < n_fds; i++) { - close(fds[i]); + for (auto fd : fds) { + epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, nullptr); + close(fd); } - delete [] fds; -} - -int AlarmImplAlarmDriver::set(int type, struct timespec *ts) -{ - return ioctl(fds[0], ANDROID_ALARM_SET(type), ts); -} - -int AlarmImplAlarmDriver::setTime(struct timeval *tv) -{ - struct timespec ts; - int res; - - ts.tv_sec = tv->tv_sec; - ts.tv_nsec = tv->tv_usec * 1000; - res = ioctl(fds[0], ANDROID_ALARM_SET_RTC, &ts); - if (res < 0) - ALOGV("ANDROID_ALARM_SET_RTC ioctl failed: %s\n", strerror(errno)); - return res; -} -int AlarmImplAlarmDriver::waitForAlarm() -{ - return ioctl(fds[0], ANDROID_ALARM_WAIT); -} - -AlarmImplTimerFd::~AlarmImplTimerFd() -{ - for (size_t i = 0; i < N_ANDROID_TIMERFDS; i++) { - epoll_ctl(epollfd, EPOLL_CTL_DEL, fds[i], NULL); - } close(epollfd); } -int AlarmImplTimerFd::set(int type, struct timespec *ts) +int AlarmImpl::set(int type, struct timespec *ts) { - if (type > ANDROID_ALARM_TYPE_COUNT) { + if (static_cast<size_t>(type) > ANDROID_ALARM_TYPE_COUNT) { errno = EINVAL; return -1; } @@ -190,7 +118,7 @@ int AlarmImplTimerFd::set(int type, struct timespec *ts) return timerfd_settime(fds[type], TFD_TIMER_ABSTIME, &spec, NULL); } -int AlarmImplTimerFd::setTime(struct timeval *tv) +int AlarmImpl::setTime(struct timeval *tv) { struct rtc_time rtc; struct tm tm, *gmtime_res; @@ -241,7 +169,7 @@ done: return res; } -int AlarmImplTimerFd::waitForAlarm() +int AlarmImpl::waitForAlarm() { epoll_event events[N_ANDROID_TIMERFDS]; @@ -311,25 +239,12 @@ static jint android_server_AlarmManagerService_setKernelTimezone(JNIEnv*, jobjec return 0; } -static jlong init_alarm_driver() -{ - int fd = open("/dev/alarm", O_RDWR); - if (fd < 0) { - ALOGV("opening alarm driver failed: %s", strerror(errno)); - return 0; - } - - AlarmImpl *ret = new AlarmImplAlarmDriver(fd); - return reinterpret_cast<jlong>(ret); -} - static const char rtc_sysfs[] = "/sys/class/rtc"; static bool rtc_is_hctosys(unsigned int rtc_id) { android::String8 hctosys_path = String8::format("%s/rtc%u/hctosys", rtc_sysfs, rtc_id); - FILE *file = fopen(hctosys_path.string(), "re"); if (!file) { ALOGE("failed to open %s: %s", hctosys_path.string(), strerror(errno)); @@ -383,23 +298,48 @@ static int wall_clock_rtc() return -1; } -static jlong init_timerfd() +static void log_timerfd_create_error(clockid_t id) +{ + if (errno == EINVAL) { + switch (id) { + case CLOCK_REALTIME_ALARM: + case CLOCK_BOOTTIME_ALARM: + ALOGE("kernel missing required commits:"); + ALOGE("https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=6cffe00f7d4e24679eae6b7aae4caaf915288256"); + ALOGE("https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=11ffa9d6065f344a9bd769a2452f26f2f671e5f8"); + LOG_ALWAYS_FATAL("kernel does not support timerfd_create() with alarm timers"); + break; + + case CLOCK_BOOTTIME: + ALOGE("kernel missing required commit:"); + ALOGE("https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=4a2378a943f09907fb1ae35c15de917f60289c14"); + LOG_ALWAYS_FATAL("kernel does not support timerfd_create(CLOCK_BOOTTIME)"); + break; + + default: + break; + } + } + + ALOGE("timerfd_create(%u) failed: %s", id, strerror(errno)); +} + +static jlong android_server_AlarmManagerService_init(JNIEnv*, jobject) { int epollfd; - int fds[N_ANDROID_TIMERFDS]; + TimerFds fds; - epollfd = epoll_create(N_ANDROID_TIMERFDS); + epollfd = epoll_create(fds.size()); if (epollfd < 0) { - ALOGV("epoll_create(%zu) failed: %s", N_ANDROID_TIMERFDS, + ALOGE("epoll_create(%zu) failed: %s", fds.size(), strerror(errno)); return 0; } - for (size_t i = 0; i < N_ANDROID_TIMERFDS; i++) { + for (size_t i = 0; i < fds.size(); i++) { fds[i] = timerfd_create(android_alarm_to_clockid[i], 0); if (fds[i] < 0) { - ALOGV("timerfd_create(%u) failed: %s", android_alarm_to_clockid[i], - strerror(errno)); + log_timerfd_create_error(android_alarm_to_clockid[i]); close(epollfd); for (size_t j = 0; j < i; j++) { close(fds[j]); @@ -408,16 +348,16 @@ static jlong init_timerfd() } } - AlarmImpl *ret = new AlarmImplTimerFd(fds, epollfd, wall_clock_rtc()); + AlarmImpl *ret = new AlarmImpl(fds, epollfd, wall_clock_rtc()); - for (size_t i = 0; i < N_ANDROID_TIMERFDS; i++) { + for (size_t i = 0; i < fds.size(); i++) { epoll_event event; event.events = EPOLLIN | EPOLLWAKEUP; event.data.u32 = i; int err = epoll_ctl(epollfd, EPOLL_CTL_ADD, fds[i], &event); if (err < 0) { - ALOGV("epoll_ctl(EPOLL_CTL_ADD) failed: %s", strerror(errno)); + ALOGE("epoll_ctl(EPOLL_CTL_ADD) failed: %s", strerror(errno)); delete ret; return 0; } @@ -431,7 +371,7 @@ static jlong init_timerfd() int err = timerfd_settime(fds[ANDROID_ALARM_TYPE_COUNT], TFD_TIMER_ABSTIME | TFD_TIMER_CANCEL_ON_SET, &spec, NULL); if (err < 0) { - ALOGV("timerfd_settime() failed: %s", strerror(errno)); + ALOGE("timerfd_settime() failed: %s", strerror(errno)); delete ret; return 0; } @@ -439,16 +379,6 @@ static jlong init_timerfd() return reinterpret_cast<jlong>(ret); } -static jlong android_server_AlarmManagerService_init(JNIEnv*, jobject) -{ - jlong ret = init_alarm_driver(); - if (ret) { - return ret; - } - - return init_timerfd(); -} - static void android_server_AlarmManagerService_close(JNIEnv*, jobject, jlong nativeData) { AlarmImpl *impl = reinterpret_cast<AlarmImpl *>(nativeData); diff --git a/services/tests/servicestests/Android.mk b/services/tests/servicestests/Android.mk index d1bd5051cfad..8e3128c8f828 100644 --- a/services/tests/servicestests/Android.mk +++ b/services/tests/servicestests/Android.mk @@ -67,6 +67,7 @@ LOCAL_SRC_FILES := $(call all-cpp-files-under) LOCAL_SHARED_LIBRARIES := \ libbinder \ + liblog \ libcutils \ libnativehelper \ libnetdaidl diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index ff7ca6201b55..3fc945a83617 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -86,6 +86,15 @@ public class CarrierConfigManager { KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL = "require_entitlement_checks_bool"; /** + * Flag indicating whether radio is to be restarted on error PDP_FAIL_REGULAR_DEACTIVATION + * This is false by default. + * @hide + */ + public static final String + KEY_RESTART_RADIO_ON_PDP_FAIL_REGULAR_DEACTIVATION_BOOL = + "restart_radio_on_pdp_fail_regular_deactivation_bool"; + + /** * If true, enable vibration (haptic feedback) for key presses in the EmergencyDialer activity. * The pattern is set on a per-platform basis using config_virtualKeyVibePattern. To be * consistent with the regular Dialer, this value should agree with the corresponding values @@ -252,6 +261,17 @@ public class CarrierConfigManager { public static final String KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL = "carrier_wfc_ims_available_bool"; /** + * Specifies a map from dialstrings to replacements for roaming network service numbers which + * cannot be replaced on the carrier side. + * <p> + * Individual entries have the format: + * [dialstring to replace]:[replacement] + * @hide + */ + public static final String KEY_DIAL_STRING_REPLACE_STRING_ARRAY = + "dial_string_replace_string_array"; + + /** * Flag specifying whether WFC over IMS supports the "wifi only" option. If false, the wifi * calling settings will not include an option for "wifi only". If true, the wifi calling * settings will include an option for "wifi only" @@ -701,6 +721,15 @@ public class CarrierConfigManager { "duration_blocking_disabled_after_emergency_int"; /** + * For carriers which require an empty flash to be sent before sending the normal 3-way calling + * flash, the duration in milliseconds of the empty flash to send. When {@code 0}, no empty + * flash is sent. + * @hide + */ + public static final String KEY_CDMA_3WAYCALL_FLASH_DELAY_INT = "cdma_3waycall_flash_delay_int"; + + + /** * @hide * The default value for preferred CDMA roaming mode (aka CDMA system select.) * CDMA_ROAMING_MODE_RADIO_DEFAULT = the default roaming mode from the radio @@ -768,6 +797,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_VOICE_PRIVACY_DISABLE_UI_BOOL, false); sDefaults.putBoolean(KEY_WORLD_PHONE_BOOL, false); sDefaults.putBoolean(KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL, true); + sDefaults.putBoolean(KEY_RESTART_RADIO_ON_PDP_FAIL_REGULAR_DEACTIVATION_BOOL, false); sDefaults.putInt(KEY_VOLTE_REPLACEMENT_RAT_INT, 0); sDefaults.putString(KEY_DEFAULT_SIM_CALL_MANAGER_STRING, ""); sDefaults.putString(KEY_VVM_DESTINATION_NUMBER_STRING, ""); @@ -803,10 +833,12 @@ public class CarrierConfigManager { sDefaults.putStringArray(KEY_GSM_NONROAMING_NETWORKS_STRING_ARRAY, null); sDefaults.putStringArray(KEY_CDMA_ROAMING_NETWORKS_STRING_ARRAY, null); sDefaults.putStringArray(KEY_CDMA_NONROAMING_NETWORKS_STRING_ARRAY, null); + sDefaults.putStringArray(KEY_DIAL_STRING_REPLACE_STRING_ARRAY, null); sDefaults.putBoolean(KEY_FORCE_HOME_NETWORK_BOOL, false); sDefaults.putInt(KEY_GSM_DTMF_TONE_DELAY_INT, 0); sDefaults.putInt(KEY_IMS_DTMF_TONE_DELAY_INT, 0); sDefaults.putInt(KEY_CDMA_DTMF_TONE_DELAY_INT, 100); + sDefaults.putInt(KEY_CDMA_3WAYCALL_FLASH_DELAY_INT , 0); sDefaults.putBoolean(KEY_SUPPORT_CONFERENCE_CALL_BOOL, true); sDefaults.putBoolean(KEY_EDITABLE_ENHANCED_4G_LTE_BOOL, true); sDefaults.putBoolean(KEY_HIDE_IMS_APN_BOOL, false); diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp index 34fdf6cba3e2..cf7f0e8788ca 100644 --- a/tools/aapt/Resource.cpp +++ b/tools/aapt/Resource.cpp @@ -23,12 +23,8 @@ // STATUST: mingw does seem to redefine UNKNOWN_ERROR from our enum value, so a cast is necessary. #if !defined(_WIN32) -# define ZD "%zd" -# define ZD_TYPE ssize_t # define STATUST(x) x #else -# define ZD "%ld" -# define ZD_TYPE long # define STATUST(x) (status_t)x #endif diff --git a/tools/aapt/StringPool.cpp b/tools/aapt/StringPool.cpp index 37a493329ade..866291a3b678 100644 --- a/tools/aapt/StringPool.cpp +++ b/tools/aapt/StringPool.cpp @@ -14,12 +14,8 @@ // SSIZE: mingw does not have signed size_t == ssize_t. #if !defined(_WIN32) -# define ZD "%zd" -# define ZD_TYPE ssize_t # define SSIZE(x) x #else -# define ZD "%ld" -# define ZD_TYPE long # define SSIZE(x) (signed size_t)x #endif diff --git a/tools/aapt/StringPool.h b/tools/aapt/StringPool.h index 625b0bfb3832..253bcca4f507 100644 --- a/tools/aapt/StringPool.h +++ b/tools/aapt/StringPool.h @@ -12,7 +12,6 @@ #include <androidfw/ResourceTypes.h> #include <utils/String16.h> -#include <utils/TypeHelpers.h> #include <sys/types.h> #include <sys/stat.h> @@ -179,13 +178,5 @@ private: Vector<size_t> mOriginalPosToNewPos; }; -// The entry types are trivially movable because all fields they contain, including -// the vectors and strings, are trivially movable. -namespace android { - ANDROID_TRIVIAL_MOVE_TRAIT(StringPool::entry); - ANDROID_TRIVIAL_MOVE_TRAIT(StringPool::entry_style_span); - ANDROID_TRIVIAL_MOVE_TRAIT(StringPool::entry_style); -}; - #endif diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl index 706b29495c21..a91c9491c60a 100644 --- a/wifi/java/android/net/wifi/IWifiManager.aidl +++ b/wifi/java/android/net/wifi/IWifiManager.aidl @@ -97,10 +97,6 @@ interface IWifiManager String getCountryCode(); - void setFrequencyBand(int band, boolean persist); - - int getFrequencyBand(); - boolean isDualBandSupported(); boolean saveConfiguration(); diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java index 67cf10732b9d..465addfc1469 100644 --- a/wifi/java/android/net/wifi/ScanResult.java +++ b/wifi/java/android/net/wifi/ScanResult.java @@ -139,12 +139,6 @@ public class ScanResult implements Parcelable { public long seen; /** - * If the scan result is a valid autojoin candidate - * {@hide} - */ - public int isAutoJoinCandidate; - - /** * @hide * Update RSSI of the scan result * @param previousRssi @@ -452,7 +446,6 @@ public class ScanResult implements Parcelable { numConnection = source.numConnection; numUsage = source.numUsage; numIpConfigFailures = source.numIpConfigFailures; - isAutoJoinCandidate = source.isAutoJoinCandidate; venueName = source.venueName; operatorFriendlyName = source.operatorFriendlyName; flags = source.flags; @@ -530,7 +523,6 @@ public class ScanResult implements Parcelable { dest.writeInt(numConnection); dest.writeInt(numUsage); dest.writeInt(numIpConfigFailures); - dest.writeInt(isAutoJoinCandidate); dest.writeString((venueName != null) ? venueName.toString() : ""); dest.writeString((operatorFriendlyName != null) ? operatorFriendlyName.toString() : ""); dest.writeLong(this.flags); @@ -600,7 +592,6 @@ public class ScanResult implements Parcelable { sr.numConnection = in.readInt(); sr.numUsage = in.readInt(); sr.numIpConfigFailures = in.readInt(); - sr.isAutoJoinCandidate = in.readInt(); sr.venueName = in.readString(); sr.operatorFriendlyName = in.readString(); sr.flags = in.readLong(); diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 955161cf538b..d04a60ecdfd2 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -1376,40 +1376,6 @@ public class WifiManager { } /** - * Set the operational frequency band. - * @param band One of - * {@link #WIFI_FREQUENCY_BAND_AUTO}, - * {@link #WIFI_FREQUENCY_BAND_5GHZ}, - * {@link #WIFI_FREQUENCY_BAND_2GHZ}, - * @param persist {@code true} if this needs to be remembered - * @hide - */ - public void setFrequencyBand(int band, boolean persist) { - try { - mService.setFrequencyBand(band, persist); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - - /** - * Get the operational frequency band. - * @return One of - * {@link #WIFI_FREQUENCY_BAND_AUTO}, - * {@link #WIFI_FREQUENCY_BAND_5GHZ}, - * {@link #WIFI_FREQUENCY_BAND_2GHZ} or - * {@code -1} on failure. - * @hide - */ - public int getFrequencyBand() { - try { - return mService.getFrequencyBand(); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - - /** * Check if the chipset supports dual frequency band (2.4 GHz and 5 GHz) * @return {@code true} if supported, {@code false} otherwise. * @hide diff --git a/wifi/java/android/net/wifi/WifiScanner.java b/wifi/java/android/net/wifi/WifiScanner.java index 06e1b681fbef..5847f798712d 100644 --- a/wifi/java/android/net/wifi/WifiScanner.java +++ b/wifi/java/android/net/wifi/WifiScanner.java @@ -34,9 +34,10 @@ import com.android.internal.util.AsyncChannel; import com.android.internal.util.Preconditions; import com.android.internal.util.Protocol; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; - /** * This class provides a way to scan the Wifi universe around the device * Get an instance of this class by calling @@ -822,6 +823,22 @@ public class WifiScanner { mAsyncChannel.sendMessage(CMD_STOP_SINGLE_SCAN, 0, key); } + /** + * Retrieve the most recent scan results from a single scan request. + * {@hide} + */ + public List<ScanResult> getSingleScanResults() { + validateChannel(); + Message reply = mAsyncChannel.sendMessageSynchronously(CMD_GET_SINGLE_SCAN_RESULTS, 0); + if (reply.what == WifiScanner.CMD_OP_SUCCEEDED) { + return Arrays.asList(((ParcelableScanResults) reply.obj).getResults()); + } + OperationResult result = (OperationResult) reply.obj; + Log.e(TAG, "Error retrieving SingleScan results reason: " + result.reason + + " description: " + result.description); + return new ArrayList<ScanResult>(); + } + private void startPnoScan(ScanSettings scanSettings, PnoSettings pnoSettings, int key) { // Bundle up both the settings and send it across. Bundle pnoParams = new Bundle(); @@ -1201,6 +1218,8 @@ public class WifiScanner { public static final int CMD_REGISTER_SCAN_LISTENER = BASE + 27; /** @hide */ public static final int CMD_DEREGISTER_SCAN_LISTENER = BASE + 28; + /** @hide */ + public static final int CMD_GET_SINGLE_SCAN_RESULTS = BASE + 29; private Context mContext; private IWifiScanner mService; diff --git a/wifi/java/android/net/wifi/nan/ConfigRequest.java b/wifi/java/android/net/wifi/nan/ConfigRequest.java index 78e40526ba5b..bcd79322e563 100644 --- a/wifi/java/android/net/wifi/nan/ConfigRequest.java +++ b/wifi/java/android/net/wifi/nan/ConfigRequest.java @@ -16,87 +16,65 @@ package android.net.wifi.nan; -import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; /** * Defines a request object to configure a Wi-Fi NAN network. Built using * {@link ConfigRequest.Builder}. Configuration is requested using - * {@link WifiNanManager#connect(android.os.Handler, ConfigRequest, WifiNanEventCallback)}. + * {@link WifiNanManager#attach(android.os.Handler, WifiNanAttachCallback)}. * Note that the actual achieved configuration may be different from the * requested configuration - since different applications may request different * configurations. * - * @hide PROPOSED_NAN_API + * @hide */ public final class ConfigRequest implements Parcelable { /** * Lower range of possible cluster ID. - * - * @hide */ public static final int CLUSTER_ID_MIN = 0; /** * Upper range of possible cluster ID. - * - * @hide */ public static final int CLUSTER_ID_MAX = 0xFFFF; /** * Indicates whether 5G band support is requested. - * - * @hide */ public final boolean mSupport5gBand; /** * Specifies the desired master preference. - * - * @hide */ public final int mMasterPreference; /** * Specifies the desired lower range of the cluster ID. Must be lower then * {@link ConfigRequest#mClusterHigh}. - * - * @hide */ public final int mClusterLow; /** * Specifies the desired higher range of the cluster ID. Must be higher then * {@link ConfigRequest#mClusterLow}. - * - * @hide */ public final int mClusterHigh; - /** - * Indicates whether we want to get callbacks when our identity is changed. - * - * @hide - */ - public final boolean mEnableIdentityChangeCallback; - private ConfigRequest(boolean support5gBand, int masterPreference, int clusterLow, - int clusterHigh, boolean enableIdentityChangeCallback) { + int clusterHigh) { mSupport5gBand = support5gBand; mMasterPreference = masterPreference; mClusterLow = clusterLow; mClusterHigh = clusterHigh; - mEnableIdentityChangeCallback = enableIdentityChangeCallback; } @Override public String toString() { return "ConfigRequest [mSupport5gBand=" + mSupport5gBand + ", mMasterPreference=" + mMasterPreference + ", mClusterLow=" + mClusterLow + ", mClusterHigh=" - + mClusterHigh + ", mEnableIdentityChangeCallback=" + mEnableIdentityChangeCallback - + "]"; + + mClusterHigh + "]"; } @Override @@ -110,7 +88,6 @@ public final class ConfigRequest implements Parcelable { dest.writeInt(mMasterPreference); dest.writeInt(mClusterLow); dest.writeInt(mClusterHigh); - dest.writeInt(mEnableIdentityChangeCallback ? 1 : 0); } public static final Creator<ConfigRequest> CREATOR = new Creator<ConfigRequest>() { @@ -125,9 +102,7 @@ public final class ConfigRequest implements Parcelable { int masterPreference = in.readInt(); int clusterLow = in.readInt(); int clusterHigh = in.readInt(); - boolean enableIdentityChangeCallback = in.readInt() != 0; - return new ConfigRequest(support5gBand, masterPreference, clusterLow, clusterHigh, - enableIdentityChangeCallback); + return new ConfigRequest(support5gBand, masterPreference, clusterLow, clusterHigh); } }; @@ -144,43 +119,15 @@ public final class ConfigRequest implements Parcelable { ConfigRequest lhs = (ConfigRequest) o; return mSupport5gBand == lhs.mSupport5gBand && mMasterPreference == lhs.mMasterPreference - && mClusterLow == lhs.mClusterLow && mClusterHigh == lhs.mClusterHigh - && mEnableIdentityChangeCallback == lhs.mEnableIdentityChangeCallback; - } - - /** - * Checks for equality of two configuration - but only considering their - * on-the-air NAN configuration impact. - * - * @param o Object to compare to. - * @return true if configuration objects have the same on-the-air - * configuration, false otherwise. - * - * @hide - */ - public boolean equalsOnTheAir(Object o) { - if (this == o) { - return true; - } - - if (!(o instanceof ConfigRequest)) { - return false; - } - - ConfigRequest lhs = (ConfigRequest) o; - - return mSupport5gBand == lhs.mSupport5gBand && mMasterPreference == lhs.mMasterPreference && mClusterLow == lhs.mClusterLow && mClusterHigh == lhs.mClusterHigh; } /** - * Checks whether the configuration's settings which impact on-air behavior are non-default. - * - * @return true if any of the on-air-impacting settings are non-default. + * Checks whether the configuration's settings are non-default. * - * @hide + * @return true if any of the settings are non-default. */ - public boolean isNonDefaultOnTheAir() { + public boolean isNonDefault() { return mSupport5gBand || mMasterPreference != 0 || mClusterLow != CLUSTER_ID_MIN || mClusterHigh != CLUSTER_ID_MAX; } @@ -193,7 +140,6 @@ public final class ConfigRequest implements Parcelable { result = 31 * result + mMasterPreference; result = 31 * result + mClusterLow; result = 31 * result + mClusterHigh; - result = 31 * result + (mEnableIdentityChangeCallback ? 1 : 0); return result; } @@ -201,8 +147,6 @@ public final class ConfigRequest implements Parcelable { /** * Verifies that the contents of the ConfigRequest are valid. Otherwise * throws an IllegalArgumentException. - * - * @hide */ public void validate() throws IllegalArgumentException { if (mMasterPreference < 0) { @@ -239,7 +183,6 @@ public final class ConfigRequest implements Parcelable { private int mMasterPreference = 0; private int mClusterLow = CLUSTER_ID_MIN; private int mClusterHigh = CLUSTER_ID_MAX; - private boolean mEnableIdentityChangeCallback = false; /** * Specify whether 5G band support is required in this request. Disabled by default. @@ -248,8 +191,6 @@ public final class ConfigRequest implements Parcelable { * * @return The builder to facilitate chaining * {@code builder.setXXX(..).setXXX(..)}. - * - * @hide PROPOSED_NAN_SYSTEM_API */ public Builder setSupport5gBand(boolean support5gBand) { mSupport5gBand = support5gBand; @@ -264,8 +205,6 @@ public final class ConfigRequest implements Parcelable { * * @return The builder to facilitate chaining * {@code builder.setXXX(..).setXXX(..)}. - * - * @hide PROPOSED_NAN_SYSTEM_API */ public Builder setMasterPreference(int masterPreference) { if (masterPreference < 0) { @@ -293,8 +232,6 @@ public final class ConfigRequest implements Parcelable { * * @return The builder to facilitate chaining * {@code builder.setClusterLow(..).setClusterHigh(..)}. - * - * @hide PROPOSED_NAN_SYSTEM_API */ public Builder setClusterLow(int clusterLow) { if (clusterLow < CLUSTER_ID_MIN) { @@ -320,8 +257,6 @@ public final class ConfigRequest implements Parcelable { * * @return The builder to facilitate chaining * {@code builder.setClusterLow(..).setClusterHigh(..)}. - * - * @hide PROPOSED_NAN_SYSTEM_API */ public Builder setClusterHigh(int clusterHigh) { if (clusterHigh < CLUSTER_ID_MIN) { @@ -336,27 +271,6 @@ public final class ConfigRequest implements Parcelable { } /** - * Indicate whether or not we want to enable the - * {@link WifiNanEventCallback#onIdentityChanged(byte[])} callback. A - * device identity is its Discovery MAC address which is randomized at regular intervals. - * An application may need to know the MAC address, e.g. when using OOB (out-of-band) - * discovery together with NAN connections. - * <p> - * The callbacks are disabled by default since it may result in additional wake-ups - * of the host - - * increasing power. - * - * @param enableIdentityChangeCallback Enable the callback informing - * listener when identity is changed. - * @return The builder to facilitate chaining - * {@code builder.setXXX(..).setXXX(..)}. - */ - public Builder setEnableIdentityChangeCallback(boolean enableIdentityChangeCallback) { - mEnableIdentityChangeCallback = enableIdentityChangeCallback; - return this; - } - - /** * Build {@link ConfigRequest} given the current requests made on the * builder. */ @@ -366,8 +280,7 @@ public final class ConfigRequest implements Parcelable { "Invalid argument combination - must have Cluster Low <= Cluster High"); } - return new ConfigRequest(mSupport5gBand, mMasterPreference, mClusterLow, mClusterHigh, - mEnableIdentityChangeCallback); + return new ConfigRequest(mSupport5gBand, mMasterPreference, mClusterLow, mClusterHigh); } } } diff --git a/wifi/java/android/net/wifi/nan/IWifiNanSessionCallback.aidl b/wifi/java/android/net/wifi/nan/IWifiNanDiscoverySessionCallback.aidl index ff2c409c1dd5..f2e371dd74f9 100644 --- a/wifi/java/android/net/wifi/nan/IWifiNanSessionCallback.aidl +++ b/wifi/java/android/net/wifi/nan/IWifiNanDiscoverySessionCallback.aidl @@ -21,9 +21,9 @@ package android.net.wifi.nan; * * {@hide} */ -oneway interface IWifiNanSessionCallback +oneway interface IWifiNanDiscoverySessionCallback { - void onSessionStarted(int sessionId); + void onSessionStarted(int discoverySessionId); void onSessionConfigSuccess(); void onSessionConfigFail(int reason); void onSessionTerminated(int reason); diff --git a/wifi/java/android/net/wifi/nan/IWifiNanEventCallback.aidl b/wifi/java/android/net/wifi/nan/IWifiNanEventCallback.aidl index a4e590beca59..9ac7bf24e18e 100644 --- a/wifi/java/android/net/wifi/nan/IWifiNanEventCallback.aidl +++ b/wifi/java/android/net/wifi/nan/IWifiNanEventCallback.aidl @@ -26,7 +26,7 @@ import android.net.wifi.RttManager; */ oneway interface IWifiNanEventCallback { - void onConnectSuccess(); + void onConnectSuccess(int clientId); void onConnectFail(int reason); void onIdentityChanged(in byte[] mac); diff --git a/wifi/java/android/net/wifi/nan/IWifiNanManager.aidl b/wifi/java/android/net/wifi/nan/IWifiNanManager.aidl index 17ec1bc240e0..56baba9141aa 100644 --- a/wifi/java/android/net/wifi/nan/IWifiNanManager.aidl +++ b/wifi/java/android/net/wifi/nan/IWifiNanManager.aidl @@ -19,8 +19,8 @@ package android.net.wifi.nan; import android.app.PendingIntent; import android.net.wifi.nan.ConfigRequest; +import android.net.wifi.nan.IWifiNanDiscoverySessionCallback; import android.net.wifi.nan.IWifiNanEventCallback; -import android.net.wifi.nan.IWifiNanSessionCallback; import android.net.wifi.nan.PublishConfig; import android.net.wifi.nan.SubscribeConfig; import android.net.wifi.RttManager; @@ -38,19 +38,20 @@ interface IWifiNanManager boolean isUsageEnabled(); // client API - int connect(in IBinder binder, in String callingPackage, in IWifiNanEventCallback callback, - in ConfigRequest configRequest); + void connect(in IBinder binder, in String callingPackage, in IWifiNanEventCallback callback, + in ConfigRequest configRequest, boolean notifyOnIdentityChanged); void disconnect(int clientId, in IBinder binder); - void publish(int clientId, in PublishConfig publishConfig, in IWifiNanSessionCallback callback); + void publish(int clientId, in PublishConfig publishConfig, + in IWifiNanDiscoverySessionCallback callback); void subscribe(int clientId, in SubscribeConfig subscribeConfig, - in IWifiNanSessionCallback callback); + in IWifiNanDiscoverySessionCallback callback); // session API - void updatePublish(int clientId, int sessionId, in PublishConfig publishConfig); - void updateSubscribe(int clientId, int sessionId, in SubscribeConfig subscribeConfig); - void sendMessage(int clientId, int sessionId, int peerId, in byte[] message, int messageId, - int retryCount); - void terminateSession(int clientId, int sessionId); - int startRanging(int clientId, int sessionId, in RttManager.ParcelableRttParams parms); + void updatePublish(int clientId, int discoverySessionId, in PublishConfig publishConfig); + void updateSubscribe(int clientId, int discoverySessionId, in SubscribeConfig subscribeConfig); + void sendMessage(int clientId, int discoverySessionId, int peerId, in byte[] message, + int messageId, int retryCount); + void terminateSession(int clientId, int discoverySessionId); + int startRanging(int clientId, int discoverySessionId, in RttManager.ParcelableRttParams parms); } diff --git a/wifi/java/android/net/wifi/nan/PublishConfig.java b/wifi/java/android/net/wifi/nan/PublishConfig.java index 6203f9539e7c..4b67f9ac0ef9 100644 --- a/wifi/java/android/net/wifi/nan/PublishConfig.java +++ b/wifi/java/android/net/wifi/nan/PublishConfig.java @@ -32,8 +32,9 @@ import java.util.Arrays; /** * Defines the configuration of a NAN publish session. Built using * {@link PublishConfig.Builder}. A publish session is created using - * {@link WifiNanManager#publish(PublishConfig, WifiNanSessionCallback)} or updated using - * {@link WifiNanPublishSession#updatePublish(PublishConfig)}. + * {@link WifiNanSession#publish(android.os.Handler, PublishConfig, WifiNanDiscoverySessionCallback)} + * or updated using + * {@link WifiNanPublishDiscoverySession#updatePublish(PublishConfig)}. * * @hide PROPOSED_NAN_API */ @@ -256,25 +257,6 @@ public final class PublishConfig implements Parcelable { } /** - * Specify service specific information for the publish session - a simple wrapper - * of {@link PublishConfig.Builder#setServiceSpecificInfo(byte[])} - * obtaining the data from a String. - * <p> - * Optional. Empty by default. - * - * @param serviceSpecificInfoStr The service specific information string - * to be included (as a byte array) in the publish - * information. - * - * @return The builder to facilitate chaining - * {@code builder.setXXX(..).setXXX(..)}. - */ - public Builder setServiceSpecificInfo(@NonNull String serviceSpecificInfoStr) { - mServiceSpecificInfo = serviceSpecificInfoStr.getBytes(); - return this; - } - - /** * The match filter for a publish session. Used to determine whether a service * discovery occurred - in addition to relying on the service name. * <p> @@ -318,12 +300,13 @@ public final class PublishConfig implements Parcelable { * Sets the number of times an unsolicited (configured using * {@link PublishConfig.Builder#setPublishType(int)}) publish session * will be broadcast. When the count is reached an event will be - * generated for {@link WifiNanSessionCallback#onSessionTerminated(int)} - * with {@link WifiNanSessionCallback#TERMINATE_REASON_DONE} [unless - * {@link #setEnableTerminateNotification(boolean)} disables the callback]. + * generated for {@link WifiNanDiscoverySessionCallback#onSessionTerminated(int)} + * with {@link WifiNanDiscoverySessionCallback#TERMINATE_REASON_DONE} [unless + * {@link #setTerminateNotificationEnabled(boolean)} disables the callback]. * <p> * Optional. 0 by default - indicating the session doesn't terminate on its own. - * Session will be terminated when {@link WifiNanSession#terminate()} is called. + * Session will be terminated when {@link WifiNanDiscoveryBaseSession#destroy()} is + * called. * * @param publishCount Number of publish packets to broadcast. * @@ -343,12 +326,13 @@ public final class PublishConfig implements Parcelable { * {@link PublishConfig.Builder#setPublishType(int)}) publish session * will be alive - broadcasting a packet. When the TTL is reached * an event will be generated for - * {@link WifiNanSessionCallback#onSessionTerminated(int)} with - * {@link WifiNanSessionCallback#TERMINATE_REASON_DONE} [unless - * {@link #setEnableTerminateNotification(boolean)} disables the callback]. + * {@link WifiNanDiscoverySessionCallback#onSessionTerminated(int)} with + * {@link WifiNanDiscoverySessionCallback#TERMINATE_REASON_DONE} [unless + * {@link #setTerminateNotificationEnabled(boolean)} disables the callback]. * <p> * Optional. 0 by default - indicating the session doesn't terminate on its own. - * Session will be terminated when {@link WifiNanSession#terminate()} is called. + * Session will be terminated when {@link WifiNanDiscoveryBaseSession#destroy()} is + * called. * * @param ttlSec Lifetime of a publish session in seconds. * @@ -365,7 +349,7 @@ public final class PublishConfig implements Parcelable { /** * Configure whether a publish terminate notification - * {@link WifiNanSessionCallback#onSessionTerminated(int)} is reported + * {@link WifiNanDiscoverySessionCallback#onSessionTerminated(int)} is reported * back to the callback. * * @param enable If true the terminate callback will be called when the @@ -374,7 +358,7 @@ public final class PublishConfig implements Parcelable { * @return The builder to facilitate chaining * {@code builder.setXXX(..).setXXX(..)}. */ - public Builder setEnableTerminateNotification(boolean enable) { + public Builder setTerminateNotificationEnabled(boolean enable) { mEnableTerminateNotification = enable; return this; } diff --git a/wifi/java/android/net/wifi/nan/SubscribeConfig.java b/wifi/java/android/net/wifi/nan/SubscribeConfig.java index 5a2c76272f78..4352fcf6a3cf 100644 --- a/wifi/java/android/net/wifi/nan/SubscribeConfig.java +++ b/wifi/java/android/net/wifi/nan/SubscribeConfig.java @@ -32,8 +32,9 @@ import java.util.Arrays; /** * Defines the configuration of a NAN subscribe session. Built using * {@link SubscribeConfig.Builder}. Subscribe is done using - * {@link WifiNanManager#subscribe(SubscribeConfig, WifiNanSessionCallback)} or - * {@link WifiNanSubscribeSession#updateSubscribe(SubscribeConfig)}. + * {@link WifiNanSession#subscribe(android.os.Handler, SubscribeConfig, WifiNanDiscoverySessionCallback)} + * or + * {@link WifiNanSubscribeDiscoverySession#updateSubscribe(SubscribeConfig)}. * * @hide PROPOSED_NAN_API */ @@ -288,25 +289,6 @@ public final class SubscribeConfig implements Parcelable { } /** - * Specify service specific information for the subscribe session - a simple wrapper - * of {@link SubscribeConfig.Builder#setServiceSpecificInfo(byte[])} - * obtaining the data from a String. - * <p> - * Optional. Empty by default. - * - * @param serviceSpecificInfoStr The service specific information string - * to be included (as a byte array) in the subscribe - * information. - * - * @return The builder to facilitate chaining - * {@code builder.setXXX(..).setXXX(..)}. - */ - public Builder setServiceSpecificInfo(@NonNull String serviceSpecificInfoStr) { - mServiceSpecificInfo = serviceSpecificInfoStr.getBytes(); - return this; - } - - /** * The match filter for a subscribe session. Used to determine whether a service * discovery occurred - in addition to relying on the service name. * <p> @@ -350,11 +332,12 @@ public final class SubscribeConfig implements Parcelable { * Sets the number of times an active ( * {@link SubscribeConfig.Builder#setSubscribeType(int)}) subscribe session * will broadcast. When the count is reached an event will be - * generated for {@link WifiNanSessionCallback#onSessionTerminated(int)} - * with {@link WifiNanSessionCallback#TERMINATE_REASON_DONE}. + * generated for {@link WifiNanDiscoverySessionCallback#onSessionTerminated(int)} + * with {@link WifiNanDiscoverySessionCallback#TERMINATE_REASON_DONE}. * <p> * Optional. 0 by default - indicating the session doesn't terminate on its own. - * Session will be terminated when {@link WifiNanSession#terminate()} is called. + * Session will be terminated when {@link WifiNanDiscoveryBaseSession#destroy()} is + * called. * * @param subscribeCount Number of subscribe packets to broadcast. * @@ -374,11 +357,12 @@ public final class SubscribeConfig implements Parcelable { * {@link SubscribeConfig.Builder#setSubscribeType(int)}) subscribe session * will be alive - i.e. broadcasting a packet. When the TTL is reached * an event will be generated for - * {@link WifiNanSessionCallback#onSessionTerminated(int)} with - * {@link WifiNanSessionCallback#TERMINATE_REASON_DONE}. + * {@link WifiNanDiscoverySessionCallback#onSessionTerminated(int)} with + * {@link WifiNanDiscoverySessionCallback#TERMINATE_REASON_DONE}. * <p> * Optional. 0 by default - indicating the session doesn't terminate on its own. - * Session will be terminated when {@link WifiNanSession#terminate()} is called. + * Session will be terminated when {@link WifiNanDiscoveryBaseSession#destroy()} is + * called. * * @param ttlSec Lifetime of a subscribe session in seconds. * @@ -397,7 +381,7 @@ public final class SubscribeConfig implements Parcelable { * Sets the match style of the subscription - how are matches from a * single match session (corresponding to the same publish action on the * peer) reported to the host (using the - * {@link WifiNanSessionCallback#onMatch(int, byte[], byte[])} + * {@link WifiNanDiscoverySessionCallback#onServiceDiscovered(Object, byte[], byte[])} * ). The options are: only report the first match and ignore the rest * {@link SubscribeConfig#MATCH_STYLE_FIRST_ONLY} or report every single * match {@link SubscribeConfig#MATCH_STYLE_ALL} (the default). @@ -417,7 +401,7 @@ public final class SubscribeConfig implements Parcelable { /** * Configure whether a subscribe terminate notification - * {@link WifiNanSessionCallback#onSessionTerminated(int)} is reported + * {@link WifiNanDiscoverySessionCallback#onSessionTerminated(int)} is reported * back to the callback. * * @param enable If true the terminate callback will be called when the @@ -426,7 +410,7 @@ public final class SubscribeConfig implements Parcelable { * @return The builder to facilitate chaining * {@code builder.setXXX(..).setXXX(..)}. */ - public Builder setEnableTerminateNotification(boolean enable) { + public Builder setTerminateNotificationEnabled(boolean enable) { mEnableTerminateNotification = enable; return this; } diff --git a/wifi/java/android/net/wifi/nan/WifiNanAttachCallback.java b/wifi/java/android/net/wifi/nan/WifiNanAttachCallback.java new file mode 100644 index 000000000000..d8c310b36452 --- /dev/null +++ b/wifi/java/android/net/wifi/nan/WifiNanAttachCallback.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 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. + */ + +package android.net.wifi.nan; + +/** + * Base class for NAN attach callbacks. Should be extended by applications and set when calling + * {@link WifiNanManager#attach(android.os.Handler, WifiNanAttachCallback)}. These are callbacks + * applying to the NAN connection as a whole - not to specific publish or subscribe sessions - + * for that see {@link WifiNanDiscoverySessionCallback}. + * + * @hide PROPOSED_NAN_API + */ +public class WifiNanAttachCallback { + /** + * Called when NAN attach operation + * {@link WifiNanManager#attach(android.os.Handler, WifiNanAttachCallback)} + * is completed and that we can now start discovery sessions or connections. + * + * @param session The NAN object on which we can execute further NAN operations - e.g. + * discovery, connections. + */ + public void onAttached(WifiNanSession session) { + /* empty */ + } + + /** + * Called when NAN attach operation + * {@link WifiNanManager#attach(android.os.Handler, WifiNanAttachCallback)} failed. + */ + public void onAttachFailed() { + /* empty */ + } +} diff --git a/wifi/java/android/net/wifi/nan/WifiNanDiscoveryBaseSession.java b/wifi/java/android/net/wifi/nan/WifiNanDiscoveryBaseSession.java new file mode 100644 index 000000000000..17e974b14657 --- /dev/null +++ b/wifi/java/android/net/wifi/nan/WifiNanDiscoveryBaseSession.java @@ -0,0 +1,289 @@ +/* + * Copyright (C) 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. + */ + +package android.net.wifi.nan; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.SystemApi; +import android.net.wifi.RttManager; +import android.util.Log; + +import dalvik.system.CloseGuard; + +import java.lang.ref.WeakReference; + +/** + * A class representing a single publish or subscribe NAN session. This object + * will not be created directly - only its child classes are available: + * {@link WifiNanPublishDiscoverySession} and {@link WifiNanSubscribeDiscoverySession}. This + * class provides functionality common to both publish and subscribe discovery sessions: + * <ul> + * <li>Sending messages: {@link #sendMessage(Object, int, byte[])} or + * {@link #sendMessage(Object, int, byte[], int)} methods. + * <li>Creating a network-specifier when requesting a NAN connection: + * {@link #createNetworkSpecifier(int, Object, byte[])}. + * </ul> + * The {@link #destroy()} method must be called to destroy discovery sessions once they are + * no longer needed. + * + * @hide PROPOSED_NAN_API + */ +public class WifiNanDiscoveryBaseSession { + private static final String TAG = "WifiNanDiscoveryBaseSsn"; + private static final boolean DBG = false; + private static final boolean VDBG = false; // STOPSHIP if true + + private static final int MAX_SEND_RETRY_COUNT = 5; + + /** @hide */ + protected WeakReference<WifiNanManager> mMgr; + /** @hide */ + protected final int mClientId; + /** @hide */ + protected final int mSessionId; + /** @hide */ + protected boolean mTerminated = false; + + private final CloseGuard mCloseGuard = CloseGuard.get(); + + /** + * Return the maximum permitted retry count when sending messages using + * {@link #sendMessage(Object, int, byte[], int)}. + * + * @return Maximum retry count when sending messages. + */ + public static int getMaxSendRetryCount() { + return MAX_SEND_RETRY_COUNT; + } + + /** @hide */ + public WifiNanDiscoveryBaseSession(WifiNanManager manager, int clientId, int sessionId) { + if (VDBG) { + Log.v(TAG, "New discovery session created: manager=" + manager + ", clientId=" + + clientId + ", sessionId=" + sessionId); + } + + mMgr = new WeakReference<>(manager); + mClientId = clientId; + mSessionId = sessionId; + + mCloseGuard.open("destroy"); + } + + /** + * Destroy the publish or subscribe session - free any resources, and stop + * transmitting packets on-air (for an active session) or listening for + * matches (for a passive session). The session may not be used for any + * additional operations after its destruction. + * <p> + * This operation must be done on a session which is no longer needed. Otherwise system + * resources will continue to be utilized until the application exits. The only + * exception is a session for which we received a termination callback, + * {@link WifiNanDiscoverySessionCallback#onSessionTerminated(int)}. + */ + public void destroy() { + WifiNanManager mgr = mMgr.get(); + if (mgr == null) { + Log.w(TAG, "destroy: called post GC on WifiNanManager"); + return; + } + mgr.terminateSession(mClientId, mSessionId); + mTerminated = true; + mMgr.clear(); + mCloseGuard.close(); + } + + /** + * Sets the status of the session to terminated - i.e. an indication that + * already terminated rather than executing a termination. + * + * @hide + */ + public void setTerminated() { + if (mTerminated) { + Log.w(TAG, "terminate: already terminated."); + return; + } + mTerminated = true; + mMgr.clear(); + mCloseGuard.close(); + } + + /** @hide */ + @Override + protected void finalize() throws Throwable { + try { + if (!mTerminated) { + mCloseGuard.warnIfOpen(); + destroy(); + } + } finally { + super.finalize(); + } + } + + /** + * Sends a message to the specified destination. NAN messages are transmitted in the context + * of a discovery session - executed subsequent to a publish/subscribe + * {@link WifiNanDiscoverySessionCallback#onServiceDiscovered(Object, byte[], byte[])} event. + * <p> + * NAN messages are not guaranteed delivery. Callbacks on + * {@link WifiNanDiscoverySessionCallback} indicate message was transmitted successfully, + * {@link WifiNanDiscoverySessionCallback#onMessageSent(int)}, or transmission failed + * (possibly after several retries) - + * {@link WifiNanDiscoverySessionCallback#onMessageSendFailed(int)}. + * <p> + * The peer will get a callback indicating a message was received using + * {@link WifiNanDiscoverySessionCallback#onMessageReceived(Object, byte[])}. + * + * @param peerHandle The peer's handle for the message. Must be a result of an + * {@link WifiNanDiscoverySessionCallback#onServiceDiscovered(Object, byte[], byte[])} + * or + * {@link WifiNanDiscoverySessionCallback#onMessageReceived(Object, byte[])} events. + * @param messageId An arbitrary integer used by the caller to identify the message. The same + * integer ID will be returned in the callbacks indicating message send success or + * failure. The {@code messageId} is not used internally by the NAN service - it + * can be arbitrary and non-unique. + * @param message The message to be transmitted. + * @param retryCount An integer specifying how many additional service-level (as opposed to PHY + * or MAC level) retries should be attempted if there is no ACK from the receiver + * (note: no retransmissions are attempted in other failure cases). A value of 0 + * indicates no retries. Max permitted value is {@link #getMaxSendRetryCount()}. + */ + public void sendMessage(@NonNull Object peerHandle, int messageId, @Nullable byte[] message, + int retryCount) { + if (mTerminated) { + Log.w(TAG, "sendMessage: called on terminated session"); + return; + } else { + WifiNanManager mgr = mMgr.get(); + if (mgr == null) { + Log.w(TAG, "sendMessage: called post GC on WifiNanManager"); + return; + } + + mgr.sendMessage(mClientId, mSessionId, peerHandle, message, messageId, retryCount); + } + } + + /** + * Sends a message to the specified destination. NAN messages are transmitted in the context + * of a discovery session - executed subsequent to a publish/subscribe + * {@link WifiNanDiscoverySessionCallback#onServiceDiscovered(Object, byte[], byte[])} event. + * <p> + * NAN messages are not guaranteed delivery. Callbacks on + * {@link WifiNanDiscoverySessionCallback} indicate message was transmitted successfully, + * {@link WifiNanDiscoverySessionCallback#onMessageSent(int)}, or transmission failed + * (possibly after several retries) - + * {@link WifiNanDiscoverySessionCallback#onMessageSendFailed(int)}. + * <p> + * The peer will get a callback indicating a message was received using + * {@link WifiNanDiscoverySessionCallback#onMessageReceived(Object, byte[])}. + * Equivalent to {@link #sendMessage(Object, int, byte[], int)} with a {@code retryCount} of + * 0. + * + * @param peerHandle The peer's handle for the message. Must be a result of an + * {@link WifiNanDiscoverySessionCallback#onServiceDiscovered(Object, byte[], byte[])} + * or + * {@link WifiNanDiscoverySessionCallback#onMessageReceived(Object, byte[])} events. + * @param messageId An arbitrary integer used by the caller to identify the message. The same + * integer ID will be returned in the callbacks indicating message send success or + * failure. The {@code messageId} is not used internally by the NAN service - it + * can be arbitrary and non-unique. + * @param message The message to be transmitted. + */ + public void sendMessage(@NonNull Object peerHandle, int messageId, @Nullable byte[] message) { + sendMessage(peerHandle, messageId, message, 0); + } + + /** + * Start a ranging operation with the specified peers. The peer IDs are obtained from an + * {@link WifiNanDiscoverySessionCallback#onServiceDiscovered(Object, byte[], byte[])} or + * {@link WifiNanDiscoverySessionCallback#onMessageReceived(Object, byte[])} operation - can + * only range devices which are part of an ongoing discovery session. + * + * @param params RTT parameters - each corresponding to a specific peer ID (the array sizes + * must be identical). The + * {@link android.net.wifi.RttManager.RttParams#bssid} member must be set to + * a peer ID - not to a MAC address. + * @param listener The listener to receive the results of the ranging session. + * @hide PROPOSED_NAN_SYSTEM_API [TODO: b/28847998 - track RTT API & visilibity] + */ + public void startRanging(RttManager.RttParams[] params, RttManager.RttListener listener) { + if (mTerminated) { + Log.w(TAG, "startRanging: called on terminated session"); + return; + } else { + WifiNanManager mgr = mMgr.get(); + if (mgr == null) { + Log.w(TAG, "startRanging: called post GC on WifiNanManager"); + return; + } + + mgr.startRanging(mClientId, mSessionId, params, listener); + } + } + + /** + * Create a {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(String)} for a + * WiFi NAN connection to the specified peer. The + * {@link android.net.NetworkRequest.Builder#addTransportType(int)} should be set to + * {@link android.net.NetworkCapabilities#TRANSPORT_WIFI_NAN}. + * <p> + * This method should be used when setting up a connection with a peer discovered through NAN + * discovery or communication (in such scenarios the MAC address of the peer is shielded by + * an opaque peer ID handle). If a NAN connection is needed to a peer discovered using other + * OOB (out-of-band) mechanism then use the alternative + * {@link WifiNanSession#createNetworkSpecifier(int, byte[], byte[])} method - which uses the + * peer's MAC address. + * + * @param role The role of this device: + * {@link WifiNanManager#WIFI_NAN_DATA_PATH_ROLE_INITIATOR} or + * {@link WifiNanManager#WIFI_NAN_DATA_PATH_ROLE_RESPONDER} + * @param peerHandle The peer's handle obtained through + * {@link WifiNanDiscoverySessionCallback#onServiceDiscovered(Object, byte[], byte[])} or + * {@link WifiNanDiscoverySessionCallback#onMessageReceived(Object, byte[])}. On a RESPONDER + * this value is used to gate the acceptance of a connection request from only + * that peer. A RESPONDER may specified a null - indicating that it will accept + * connection requests from any device. + * @param token An arbitrary token (message) to be used to match connection initiation request + * to a responder setup. A RESPONDER is set up with a {@code token} which must + * be matched by the token provided by the INITIATOR. A null token is permitted + * on the RESPONDER and matches any peer token. An empty ({@code ""}) token is + * not the same as a null token and requires the peer token to be empty as well. + * + * @return A string to be used to construct + * {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(String)} to pass to + * {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest,android.net.ConnectivityManager.NetworkCallback)} + * [or other varieties of that API]. + */ + public String createNetworkSpecifier(@WifiNanManager.DataPathRole int role, + @Nullable Object peerHandle, @Nullable byte[] token) { + if (mTerminated) { + Log.w(TAG, "createNetworkSpecifier: called on terminated session"); + return null; + } else { + WifiNanManager mgr = mMgr.get(); + if (mgr == null) { + Log.w(TAG, "createNetworkSpecifier: called post GC on WifiNanManager"); + return null; + } + + return mgr.createNetworkSpecifier(mClientId, role, mSessionId, peerHandle, token); + } + } +} diff --git a/wifi/java/android/net/wifi/nan/WifiNanDiscoverySessionCallback.java b/wifi/java/android/net/wifi/nan/WifiNanDiscoverySessionCallback.java new file mode 100644 index 000000000000..271f420272e5 --- /dev/null +++ b/wifi/java/android/net/wifi/nan/WifiNanDiscoverySessionCallback.java @@ -0,0 +1,182 @@ +/* + * Copyright (C) 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. + */ + +package android.net.wifi.nan; + +import android.annotation.IntDef; +import android.annotation.NonNull; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Base class for NAN session events callbacks. Should be extended by + * applications wanting notifications. The callbacks are set when a + * publish or subscribe session is created using + * {@link WifiNanSession#publish(android.os.Handler, PublishConfig, WifiNanDiscoverySessionCallback)} + * or + * {@link WifiNanSession#subscribe(android.os.Handler, SubscribeConfig, WifiNanDiscoverySessionCallback)} . + * <p> + * A single callback is set at session creation - it cannot be replaced. + * + * @hide PROPOSED_NAN_API + */ +public class WifiNanDiscoverySessionCallback { + /** @hide */ + @IntDef({ + TERMINATE_REASON_DONE, TERMINATE_REASON_FAIL }) + @Retention(RetentionPolicy.SOURCE) + public @interface SessionTerminateCodes { + } + + /** + * Indicates that publish or subscribe session is done - all the + * requested operations (per {@link PublishConfig} or + * {@link SubscribeConfig}) have been executed. Failure reason flag for + * {@link WifiNanDiscoverySessionCallback#onSessionTerminated(int)} callback. + */ + public static final int TERMINATE_REASON_DONE = 100; + + /** + * Indicates that publish or subscribe session is terminated due to a + * failure. + * Failure reason flag for + * {@link WifiNanDiscoverySessionCallback#onSessionTerminated(int)} callback. + */ + public static final int TERMINATE_REASON_FAIL = 101; + + /** + * Called when a publish operation is started successfully in response to a + * {@link WifiNanSession#publish(android.os.Handler, PublishConfig, WifiNanDiscoverySessionCallback)} + * operation. + * + * @param session The {@link WifiNanPublishDiscoverySession} used to control the + * discovery session. + */ + public void onPublishStarted(@NonNull WifiNanPublishDiscoverySession session) { + /* empty */ + } + + /** + * Called when a subscribe operation is started successfully in response to a + * {@link WifiNanSession#subscribe(android.os.Handler, SubscribeConfig, WifiNanDiscoverySessionCallback)} + * operation. + * + * @param session The {@link WifiNanSubscribeDiscoverySession} used to control the + * discovery session. + */ + public void onSubscribeStarted(@NonNull WifiNanSubscribeDiscoverySession session) { + /* empty */ + } + + /** + * Called when a publish or subscribe discovery session configuration update request + * succeeds. Called in response to + * {@link WifiNanPublishDiscoverySession#updatePublish(PublishConfig)} or + * {@link WifiNanSubscribeDiscoverySession#updateSubscribe(SubscribeConfig)}. + */ + public void onSessionConfigUpdated() { + /* empty */ + } + + /** + * Called when a publish or subscribe discovery session cannot be created: + * {@link WifiNanSession#publish(android.os.Handler, PublishConfig, WifiNanDiscoverySessionCallback)} + * or + * {@link WifiNanSession#subscribe(android.os.Handler, SubscribeConfig, WifiNanDiscoverySessionCallback)}, + * or when a configuration update fails: + * {@link WifiNanPublishDiscoverySession#updatePublish(PublishConfig)} or + * {@link WifiNanSubscribeDiscoverySession#updateSubscribe(SubscribeConfig)}. + * <p> + * For discovery session updates failure leaves the session running with its previous + * configuration - the discovery session is not terminated. + */ + public void onSessionConfigFailed() { + /* empty */ + } + + /** + * Called when a discovery session (publish or subscribe) terminates. Termination may be due + * to user-request (either directly through {@link WifiNanDiscoveryBaseSession#destroy()} or + * application-specified expiration, e.g. {@link PublishConfig.Builder#setPublishCount(int)} + * or {@link SubscribeConfig.Builder#setTtlSec(int)}) or due to a failure. + * + * @param reason The termination reason using + * {@code WifiNanDiscoverySessionCallback.TERMINATE_*} codes. + */ + public void onSessionTerminated(@SessionTerminateCodes int reason) { + /* empty */ + } + + /** + * Called when a discovery (publish or subscribe) operation results in a + * service discovery. + * + * @param peerHandle An opaque handle to the peer matching our discovery operation. + * @param serviceSpecificInfo The service specific information (arbitrary + * byte array) provided by the peer as part of its discovery + * configuration. + * @param matchFilter The filter (Tx on advertiser and Rx on listener) which + * resulted in this service discovery. + */ + public void onServiceDiscovered(Object peerHandle, byte[] serviceSpecificInfo, + byte[] matchFilter) { + /* empty */ + } + + /** + * Called in response to {@link WifiNanDiscoveryBaseSession#sendMessage(Object, int, byte[])} + * when a message is transmitted successfully - i.e. when it was received successfully by the + * peer (corresponds to an ACK being received). + * <p> + * Note that either this callback or + * {@link WifiNanDiscoverySessionCallback#onMessageSendFailed(int)} will be + * received - never both. + * + * @param messageId The arbitrary message ID specified when sending the message. + */ + public void onMessageSent(@SuppressWarnings("unused") int messageId) { + /* empty */ + } + + /** + * Called when message transmission fails - when no ACK is received from the peer. + * Retries when ACKs are not received are done by hardware, MAC, and in the NAN stack (using + * the {@link WifiNanDiscoveryBaseSession#sendMessage(Object, int, byte[], int)} method) - this + * event is received after all retries are exhausted. + * <p> + * Note that either this callback or + * {@link WifiNanDiscoverySessionCallback#onMessageSent(int)} will be received + * - never both. + * + * @param messageId The arbitrary message ID specified when sending the message. + */ + public void onMessageSendFailed(@SuppressWarnings("unused") int messageId) { + /* empty */ + } + + /** + * Called when a message is received from a discovery session peer - in response to the + * peer's {@link WifiNanDiscoveryBaseSession#sendMessage(Object, int, byte[])} or + * {@link WifiNanDiscoveryBaseSession#sendMessage(Object, int, byte[], int)}. + * + * @param peerHandle An opaque handle to the peer matching our discovery operation. + * @param message A byte array containing the message. + */ + public void onMessageReceived(Object peerHandle, byte[] message) { + /* empty */ + } +} diff --git a/wifi/java/android/net/wifi/nan/WifiNanEventCallback.java b/wifi/java/android/net/wifi/nan/WifiNanEventCallback.java deleted file mode 100644 index 029e36a41be6..000000000000 --- a/wifi/java/android/net/wifi/nan/WifiNanEventCallback.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 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. - */ - -package android.net.wifi.nan; - -import android.annotation.IntDef; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * Base class for NAN events callbacks. Should be extended by applications and set when calling - * {@link WifiNanManager#connect(android.os.Handler, WifiNanEventCallback)}. These are callbacks - * applying to the NAN connection as a whole - not to specific publish or subscribe sessions - - * for that see {@link WifiNanSessionCallback}. - * - * @hide PROPOSED_NAN_API - */ -public class WifiNanEventCallback { - /** @hide */ - @IntDef({ - REASON_INVALID_ARGS, REASON_ALREADY_CONNECTED_INCOMPAT_CONFIG, REASON_OTHER - }) - @Retention(RetentionPolicy.SOURCE) - public @interface EventReasonCodes { - } - - /** - * Indicates invalid argument in the requested operation. Failure reason flag for - * {@link WifiNanEventCallback#onConnectFail(int)}. - */ - public static final int REASON_INVALID_ARGS = 1000; - - /** - * Indicates that a {@link ConfigRequest} passed in - * {@link WifiNanManager#connect(android.os.Handler, ConfigRequest, WifiNanEventCallback)} - * couldn't be applied since other connections already exist with an incompatible - * configurations. Failure reason flag for {@link WifiNanEventCallback#onConnectFail(int)}. - */ - public static final int REASON_ALREADY_CONNECTED_INCOMPAT_CONFIG = 1001; - - /** - * Indicates an unspecified error occurred during the operation. Failure reason flag for - * {@link WifiNanEventCallback#onConnectFail(int)}. - */ - public static final int REASON_OTHER = 1002; - - /** - * Called when NAN connect operation - * {@link WifiNanManager#connect(android.os.Handler, WifiNanEventCallback)} - * is completed and that we can now start discovery sessions or connections. - */ - public void onConnectSuccess() { - /* empty */ - } - - /** - * Called when NAN connect operation - * {@link WifiNanManager#connect(android.os.Handler, WifiNanEventCallback)} failed. - * - * @param reason Failure reason code, see - * {@code WifiNanEventCallback.REASON_*}. - */ - public void onConnectFail(@EventReasonCodes int reason) { - /* empty */ - } - - /** - * Called when NAN identity (the MAC address representing our NAN discovery interface) has - * changed. Change may be due to device joining a cluster, starting a cluster, or discovery - * interface change (addresses are randomized at regular intervals). The implication is that - * peers you've been communicating with may no longer recognize you and you need to - * re-establish your identity - e.g. by starting a discovery session. This actual MAC address - * of the interface may also be useful if the application uses alternative (non-NAN) - * discovery but needs to set up a NAN connection. The provided NAN discovery interface MAC - * address can then be used in - * {@link WifiNanManager#createNetworkSpecifier(int, byte[], byte[])}. - * <p> - * This callback is only called if the NAN connection enables it using - * {@link ConfigRequest.Builder#setEnableIdentityChangeCallback(boolean)} in - * {@link WifiNanManager#connect(android.os.Handler, ConfigRequest, WifiNanEventCallback)} - * . It is disabled by default since it may result in additional wake-ups of the host - - * increasing power. - * - * @param mac The MAC address of the NAN discovery interface. The application must have the - * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION} to get the actual MAC address, - * otherwise all 0's will be provided. - */ - public void onIdentityChanged(byte[] mac) { - /* empty */ - } -} diff --git a/wifi/java/android/net/wifi/nan/WifiNanIdentityChangedListener.java b/wifi/java/android/net/wifi/nan/WifiNanIdentityChangedListener.java new file mode 100644 index 000000000000..7cb928fd578c --- /dev/null +++ b/wifi/java/android/net/wifi/nan/WifiNanIdentityChangedListener.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 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. + */ + +package android.net.wifi.nan; + +/** + * Base class for a listener which is called with the MAC address of the NAN interface whenever + * it is changed. Change may be due to device joining a cluster, starting a cluster, or discovery + * interface change (addresses are randomized at regular intervals). The implication is that + * peers you've been communicating with may no longer recognize you and you need to re-establish + * your identity - e.g. by starting a discovery session. This actual MAC address of the + * interface may also be useful if the application uses alternative (non-NAN) discovery but needs + * to set up a NAN connection. The provided NAN discovery interface MAC address can then be used + * in {@link WifiNanSession#createNetworkSpecifier(int, byte[], byte[])}. + * + * @hide PROPOSED_NAN_API + */ +public class WifiNanIdentityChangedListener { + /** + * @param mac The MAC address of the NAN discovery interface. The application must have the + * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION} to get the actual MAC address, + * otherwise all 0's will be provided. + */ + public void onIdentityChanged(byte[] mac) { + /* empty */ + } +} diff --git a/wifi/java/android/net/wifi/nan/WifiNanManager.java b/wifi/java/android/net/wifi/nan/WifiNanManager.java index 24ee640a63df..bb1543418c6d 100644 --- a/wifi/java/android/net/wifi/nan/WifiNanManager.java +++ b/wifi/java/android/net/wifi/nan/WifiNanManager.java @@ -21,7 +21,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; -import android.annotation.SystemApi; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkRequest; @@ -29,7 +28,6 @@ import android.net.wifi.RttManager; import android.os.Binder; import android.os.Bundle; import android.os.Handler; -import android.os.IBinder; import android.os.Looper; import android.os.Message; import android.os.RemoteException; @@ -39,8 +37,6 @@ import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; -import dalvik.system.CloseGuard; - import libcore.util.HexEncoding; import org.json.JSONException; @@ -60,48 +56,50 @@ import java.util.Arrays; * The class provides access to: * <ul> * <li>Initialize a NAN cluster (peer-to-peer synchronization). Refer to - * {@link #connect(Handler, WifiNanEventCallback)}. - * <li>Create discovery sessions (publish or subscribe sessions). - * Refer to {@link #publish(PublishConfig, WifiNanSessionCallback)} and - * {@link #subscribe(SubscribeConfig, WifiNanSessionCallback)}. + * {@link #attach(Handler, WifiNanAttachCallback)}. + * <li>Create discovery sessions (publish or subscribe sessions). Refer to + * {@link WifiNanSession#publish(Handler, PublishConfig, WifiNanDiscoverySessionCallback)} and + * {@link WifiNanSession#subscribe(Handler, SubscribeConfig, WifiNanDiscoverySessionCallback)}. * <li>Create a NAN network specifier to be used with * {@link ConnectivityManager#requestNetwork(NetworkRequest, ConnectivityManager.NetworkCallback)} * to set-up a NAN connection with a peer. Refer to - * {@link WifiNanSession#createNetworkSpecifier(int, int, byte[])} and - * {@link #createNetworkSpecifier(int, byte[], byte[])}. + * {@link WifiNanDiscoveryBaseSession#createNetworkSpecifier(int, Object, byte[])} and + * {@link WifiNanSession#createNetworkSpecifier(int, byte[], byte[])}. * </ul> * <p> * NAN may not be usable when Wi-Fi is disabled (and other conditions). To validate that - * the functionality is available use the {@link #isUsageEnabled()} function. To track + * the functionality is available use the {@link #isAvailable()} function. To track * changes in NAN usability register for the {@link #ACTION_WIFI_NAN_STATE_CHANGED} broadcast. * Note that this broadcast is not sticky - you should register for it and then check the * above API to avoid a race condition. * <p> - * An application must use {@link #connect(Handler, WifiNanEventCallback)} to initialize a NAN + * An application must use {@link #attach(Handler, WifiNanAttachCallback)} to initialize a NAN * cluster - before making any other NAN operation. NAN cluster membership is a device-wide * operation - the API guarantees that the device is in a cluster or joins a NAN cluster (or - * starts one if none can be found). Information about connection success (or failure) are - * returned in callbacks of {@link WifiNanEventCallback}. Proceed with NAN discovery or - * connection setup only after receiving confirmation that NAN connection succeeded - - * {@link WifiNanEventCallback#onConnectSuccess()}. - * When an application is finished using NAN it <b>must</b> use the {@link #disconnect()} API - * to indicate to the NAN service that the device may disconnect from the NAN cluster. The - * device will actually disconnect from the NAN cluster once the last application disconnects. + * starts one if none can be found). Information about attach success (or failure) are + * returned in callbacks of {@link WifiNanAttachCallback}. Proceed with NAN discovery or + * connection setup only after receiving confirmation that NAN attach succeeded - + * {@link WifiNanAttachCallback#onAttached(WifiNanSession)}. When an application is + * finished using NAN it <b>must</b> use the {@link WifiNanSession#destroy()} API + * to indicate to the NAN service that the device may detach from the NAN cluster. The + * device will actually disable NAN once the last application detaches. * <p> - * Once a NAN connection is confirmed use the - * {@link #publish(PublishConfig, WifiNanSessionCallback)} or - * {@link #subscribe(SubscribeConfig, WifiNanSessionCallback)} to create publish or subscribe - * NAN discovery sessions. Events are called on the provided callback object - * {@link WifiNanSessionCallback}. Specifically, the - * {@link WifiNanSessionCallback#onPublishStarted(WifiNanPublishSession)} and - * {@link WifiNanSessionCallback#onSubscribeStarted(WifiNanSubscribeSession)} return - * {@link WifiNanPublishSession} and {@link WifiNanSubscribeSession} objects respectively on - * which additional session operations can be performed, e.g. updating the session - * {@link WifiNanPublishSession#updatePublish(PublishConfig)} and - * {@link WifiNanSubscribeSession#updateSubscribe(SubscribeConfig)}. Sessions can also be - * used to send messages using the {@link WifiNanSession#sendMessage(int, byte[], int)} APIs. - * When an application is finished with a discovery session it <b>must</b> terminate it using - * the {@link WifiNanSession#terminate()} API. + * Once a NAN attach is confirmed use the + * {@link WifiNanSession#publish(Handler, PublishConfig, WifiNanDiscoverySessionCallback)} or + * {@link WifiNanSession#subscribe(Handler, SubscribeConfig, WifiNanDiscoverySessionCallback)} + * to create publish or subscribe NAN discovery sessions. Events are called on the provided + * callback object {@link WifiNanDiscoverySessionCallback}. Specifically, the + * {@link WifiNanDiscoverySessionCallback#onPublishStarted(WifiNanPublishDiscoverySession)} + * and + * {@link WifiNanDiscoverySessionCallback#onSubscribeStarted(WifiNanSubscribeDiscoverySession)} + * return {@link WifiNanPublishDiscoverySession} and {@link WifiNanSubscribeDiscoverySession} + * objects respectively on which additional session operations can be performed, e.g. updating + * the session {@link WifiNanPublishDiscoverySession#updatePublish(PublishConfig)} and + * {@link WifiNanSubscribeDiscoverySession#updateSubscribe(SubscribeConfig)}. Sessions can also + * be used to send messages using the + * {@link WifiNanDiscoveryBaseSession#sendMessage(Object, int, byte[])} APIs. When an + * application is finished with a discovery session it <b>must</b> terminate it using the + * {@link WifiNanDiscoveryBaseSession#destroy()} API. * <p> * Creating connections between NAN devices is managed by the standard * {@link ConnectivityManager#requestNetwork(NetworkRequest, ConnectivityManager.NetworkCallback)}. @@ -110,8 +108,8 @@ import java.util.Arrays; * <li>{@link NetworkRequest.Builder#addTransportType(int)} of * {@link android.net.NetworkCapabilities#TRANSPORT_WIFI_NAN}. * <li>{@link NetworkRequest.Builder#setNetworkSpecifier(String)} using - * {@link #createNetworkSpecifier(int, byte[], byte[])} or - * {@link WifiNanSession#createNetworkSpecifier(int, int, byte[])}. + * {@link WifiNanSession#createNetworkSpecifier(int, byte[], byte[])} or + * {@link WifiNanDiscoveryBaseSession#createNetworkSpecifier(int, Object, byte[])}. * </ul> * * @hide PROPOSED_NAN_API @@ -121,8 +119,6 @@ public class WifiNanManager { private static final boolean DBG = false; private static final boolean VDBG = false; // STOPSHIP if true - private static final int INVALID_CLIENT_ID = 0; - /** * Keys used to generate a Network Specifier for the NAN network request. The network specifier * is formatted as a JSON string. @@ -201,43 +197,17 @@ public class WifiNanManager { public static final String NETWORK_SPECIFIER_KEY_TOKEN = "token"; /** - * Broadcast intent action to indicate whether Wi-Fi NAN is enabled or - * disabled. An extra {@link #EXTRA_WIFI_STATE} provides the state - * information as int using {@link #WIFI_NAN_STATE_DISABLED} and - * {@link #WIFI_NAN_STATE_ENABLED} constants. This broadcast is <b>not</b> sticky, - * use the {@link #isUsageEnabled()} API after registering the broadcast to check the current - * state of Wi-Fi NAN. - * - * @see #EXTRA_WIFI_STATE + * Broadcast intent action to indicate that the state of Wi-Fi NAN availability has changed. + * Use the {@link #isAvailable()} to query the current status. + * This broadcast is <b>not</b> sticky, use the {@link #isAvailable()} API after registering + * the broadcast to check the current state of Wi-Fi NAN. + * <p>Note: The broadcast is only delivered to registered receivers - no manifest registered + * components will be launched. */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_WIFI_NAN_STATE_CHANGED = "android.net.wifi.nan.action.WIFI_NAN_STATE_CHANGED"; - /** - * The lookup key for an int value indicating whether Wi-Fi NAN is enabled or - * disabled. Retrieve it with - * {@link android.content.Intent#getIntExtra(String,int)}. - * - * @see #WIFI_NAN_STATE_DISABLED - * @see #WIFI_NAN_STATE_ENABLED - */ - public static final String EXTRA_WIFI_STATE = "android.net.wifi.nan.extra.WIFI_STATE"; - - /** - * Wi-Fi NAN is disabled. - * - * @see #ACTION_WIFI_NAN_STATE_CHANGED - */ - public static final int WIFI_NAN_STATE_DISABLED = 1; - - /** - * Wi-Fi NAN is enabled. - * - * @see #ACTION_WIFI_NAN_STATE_CHANGED - */ - public static final int WIFI_NAN_STATE_ENABLED = 2; - /** @hide */ @IntDef({ WIFI_NAN_DATA_PATH_ROLE_INITIATOR, WIFI_NAN_DATA_PATH_ROLE_RESPONDER}) @@ -249,8 +219,8 @@ public class WifiNanManager { * Connection creation role is that of INITIATOR. Used to create a network specifier string * when requesting a NAN network. * - * @see WifiNanSession#createNetworkSpecifier(int, int, byte[]) - * @see #createNetworkSpecifier(int, byte[], byte[]) + * @see WifiNanDiscoveryBaseSession#createNetworkSpecifier(int, Object, byte[]) + * @see WifiNanSession#createNetworkSpecifier(int, byte[], byte[]) */ public static final int WIFI_NAN_DATA_PATH_ROLE_INITIATOR = 0; @@ -258,27 +228,17 @@ public class WifiNanManager { * Connection creation role is that of RESPONDER. Used to create a network specifier string * when requesting a NAN network. * - * @see WifiNanSession#createNetworkSpecifier(int, int, byte[]) - * @see #createNetworkSpecifier(int, byte[], byte[]) + * @see WifiNanDiscoveryBaseSession#createNetworkSpecifier(int, Object, byte[]) + * @see WifiNanSession#createNetworkSpecifier(int, byte[], byte[]) */ public static final int WIFI_NAN_DATA_PATH_ROLE_RESPONDER = 1; private final Context mContext; private final IWifiNanManager mService; - private final CloseGuard mCloseGuard = CloseGuard.get(); private final Object mLock = new Object(); // lock access to the following vars @GuardedBy("mLock") - private final IBinder mBinder = new Binder(); - - @GuardedBy("mLock") - private int mClientId = INVALID_CLIENT_ID; - - @GuardedBy("mLock") - private Looper mLooper; - - @GuardedBy("mLock") private SparseArray<RttManager.RttListener> mRangingListeners = new SparseArray<>(); /** @hide */ @@ -288,9 +248,9 @@ public class WifiNanManager { } /** - * Enable the usage of the NAN API. Doesn't actually turn on NAN cluster formation - that only - * happens when a connection is made. {@link #ACTION_WIFI_NAN_STATE_CHANGED} broadcast will be - * triggered. + * Enable the usage of the NAN API. Doesn't actually turn on NAN cluster formation - that + * only happens when an attach is attempted. {@link #ACTION_WIFI_NAN_STATE_CHANGED} broadcast + * will be triggered. * * @hide */ @@ -303,7 +263,7 @@ public class WifiNanManager { } /** - * Disable the usage of the NAN API. All attempts to connect() will be rejected. All open + * Disable the usage of the NAN API. All attempts to attach() will be rejected. All open * connections and sessions will be terminated. {@link #ACTION_WIFI_NAN_STATE_CHANGED} broadcast * will be triggered. * @@ -318,13 +278,13 @@ public class WifiNanManager { } /** - * Returns the current status of NAN API: whether or not usage is enabled. To track changes + * Returns the current status of NAN API: whether or not NAN is available. To track changes * in the state of NAN API register for the {@link #ACTION_WIFI_NAN_STATE_CHANGED} broadcast. * - * @return A boolean indicating whether the app can use the NAN API (true) - * or not (false). + * @return A boolean indicating whether the app can use the NAN API at this time (true) or + * not (false). */ - public boolean isUsageEnabled() { + public boolean isAvailable() { try { return mService.isUsageEnabled(); } catch (RemoteException e) { @@ -333,97 +293,89 @@ public class WifiNanManager { } /** - * Connect to the Wi-Fi NAN service - enabling the application to create discovery session or - * create connection to peers. The device will connect to an existing cluster if it can find + * Attach to the Wi-Fi NAN service - enabling the application to create discovery sessions or + * create connections to peers. The device will attach to an existing cluster if it can find * one or create a new cluster (if it is the first to enable NAN in its vicinity). Results - * (e.g. successful connection to a cluster) are provided to the {@code callback} object. - * An application <b>must</b> call {@link #disconnect()} when done with the Wi-Fi NAN - * connection. + * (e.g. successful attach to a cluster) are provided to the {@code attachCallback} object. + * An application <b>must</b> call {@link WifiNanSession#destroy()} when done with the + * Wi-Fi NAN object. * <p> - * Note: a NAN cluster is a shared resource - if the device is already connected to a cluster - * than this function will simply indicate success immediately. + * Note: a NAN cluster is a shared resource - if the device is already attached to a cluster + * then this function will simply indicate success immediately using the same {@code + * attachCallback}. * - * @param handler The Handler on whose thread to execute all callbacks related to the - * connection - including all sessions opened as part of this - * connection. If a null is provided then the application's main thread will be used. - * @param callback A callback extended from {@link WifiNanEventCallback}. + * @param handler The Handler on whose thread to execute the callbacks of the {@code + * attachCallback} object. If a null is provided then the application's main thread will be + * used. + * @param attachCallback A callback for attach events, extended from + * {@link WifiNanAttachCallback}. */ - public void connect(@Nullable Handler handler, @NonNull WifiNanEventCallback callback) { - connect(handler, null, callback); + public void attach(@Nullable Handler handler, @NonNull WifiNanAttachCallback attachCallback) { + attach(handler, null, attachCallback, null); } /** - * Connect to the Wi-Fi NAN service - enabling the application to create discovery session or - * create connection to peers. The device will connect to an existing cluster if it can find + * Attach to the Wi-Fi NAN service - enabling the application to create discovery sessions or + * create connections to peers. The device will attach to an existing cluster if it can find * one or create a new cluster (if it is the first to enable NAN in its vicinity). Results - * (e.g. successful connection to a cluster) are provided to the {@code callback} object. - * An application <b>must</b> call {@link #disconnect()} when done with the Wi-Fi NAN - * connection. Allows requesting a specific configuration using {@link ConfigRequest}. If not - * necessary (default configuration should usually work) use the - * {@link #connect(Handler, WifiNanEventCallback)} method instead. + * (e.g. successful attach to a cluster) are provided to the {@code attachCallback} object. + * An application <b>must</b> call {@link WifiNanSession#destroy()} when done with the + * Wi-Fi NAN object. * <p> - * Note: a NAN cluster is a shared resource - if the device is already connected to a cluster - * than this function will simply indicate success immediately. + * Note: a NAN cluster is a shared resource - if the device is already attached to a cluster + * then this function will simply indicate success immediately using the same {@code + * attachCallback}. + * <p> + * This version of the API attaches a listener to receive the MAC address of the NAN interface + * on startup and whenever it is updated (it is randomized at regular intervals for privacy). + * The application must have the {@link android.Manifest.permission#ACCESS_COARSE_LOCATION} + * permission to execute this attach request. Otherwise, use the + * {@link #attach(Handler, WifiNanAttachCallback)} version. Note that aside from permission + * requirements this listener will wake up the host at regular intervals causing higher power + * consumption, do not use it unless the information is necessary (e.g. for OOB discovery). * - * @param handler The Handler on whose thread to execute all callbacks related to the - * connection - including all sessions opened as part of this - * connection. If a null is provided then the application's main thread will be used. - * @param configRequest The requested NAN configuration. - * @param callback A callback extended from {@link WifiNanEventCallback}. + * @param handler The Handler on whose thread to execute the callbacks of the {@code + * attachCallback} and {@code identityChangedListener} objects. If a null is provided then the + * application's main thread will be used. + * @param attachCallback A callback for attach events, extended from + * {@link WifiNanAttachCallback}. + * @param identityChangedListener A listener for changed identity, extended from + * {@link WifiNanIdentityChangedListener}. */ - public void connect(@Nullable Handler handler, @Nullable ConfigRequest configRequest, - @NonNull WifiNanEventCallback callback) { + public void attach(@Nullable Handler handler, @NonNull WifiNanAttachCallback attachCallback, + @NonNull WifiNanIdentityChangedListener identityChangedListener) { + attach(handler, null, attachCallback, identityChangedListener); + } + + /** @hide */ + public void attach(Handler handler, ConfigRequest configRequest, + WifiNanAttachCallback attachCallback, + WifiNanIdentityChangedListener identityChangedListener) { if (VDBG) { - Log.v(TAG, - "connect(): handler=" + handler + ", callback=" + callback + ", configRequest=" - + configRequest); + Log.v(TAG, "attach(): handler=" + handler + ", callback=" + attachCallback + + ", configRequest=" + configRequest + ", identityChangedListener=" + + identityChangedListener); } synchronized (mLock) { - mLooper = (handler == null) ? Looper.getMainLooper() : handler.getLooper(); + Looper looper = (handler == null) ? Looper.getMainLooper() : handler.getLooper(); try { - mClientId = mService.connect(mBinder, mContext.getOpPackageName(), - new WifiNanEventCallbackProxy(this, mLooper, callback), configRequest); + Binder binder = new Binder(); + mService.connect(binder, mContext.getOpPackageName(), + new WifiNanEventCallbackProxy(this, looper, binder, attachCallback, + identityChangedListener), configRequest, + identityChangedListener != null); } catch (RemoteException e) { - mClientId = INVALID_CLIENT_ID; - mLooper = null; throw e.rethrowFromSystemServer(); } } - - mCloseGuard.open("disconnect"); } - /** - * Disconnect from the Wi-Fi NAN service and, if no other applications are connected to NAN, - * also disconnect from the NAN cluster. This method destroys all outstanding operations - - * i.e. all publish and subscribes are terminated, and any outstanding data-links are - * shut-down. However, it is good practice to terminate these discovery sessions and - * connections explicitly before a disconnect. - * <p> - * An application may re-connect after a disconnect using - * {@link WifiNanManager#connect(Handler, WifiNanEventCallback)} . - */ - public void disconnect() { + /** @hide */ + public void disconnect(int clientId, Binder binder) { if (VDBG) Log.v(TAG, "disconnect()"); - IBinder binder; - int clientId; - synchronized (mLock) { - if (mClientId == INVALID_CLIENT_ID) { - Log.w(TAG, "disconnect(): called with invalid client ID - not connected first?"); - return; - } - - binder = mBinder; - clientId = mClientId; - - mLooper = null; - mClientId = INVALID_CLIENT_ID; - } - - mCloseGuard.close(); try { mService.disconnect(clientId, binder); } catch (RemoteException e) { @@ -432,78 +384,26 @@ public class WifiNanManager { } /** @hide */ - @Override - protected void finalize() throws Throwable { - try { - mCloseGuard.warnIfOpen(); - disconnect(); - } finally { - super.finalize(); - } - } - - /** - * Issue a request to the NAN service to create a new NAN publish discovery session, using - * the specified {@code publishConfig} configuration. The results of the publish operation - * are routed to the callbacks of {@link WifiNanSessionCallback}: - * <ul> - * <li>{@link WifiNanSessionCallback#onPublishStarted(WifiNanPublishSession)} is called - * when the publish session is created and provides a handle to the session. Further - * operations on the publish session can be executed on that object. - * <li>{@link WifiNanSessionCallback#onSessionConfigFail(int)} is called if the publish - * operation failed. - * </ul> - * <p> - * Other results of the publish session operations will also be routed to callbacks - * on the {@code callback} object. The resulting publish session can be modified using - * {@link WifiNanPublishSession#updatePublish(PublishConfig)}. - * <p> - * An application must use the {@link WifiNanSession#terminate()} to terminate the publish - * discovery session once it isn't needed. This will free resources as well terminate - * any on-air transmissions. - * - * @param publishConfig The {@link PublishConfig} specifying the - * configuration of the requested publish session. - * @param callback A {@link WifiNanSessionCallback} derived object to be used for session - * event callbacks. - */ - public void publish(@NonNull PublishConfig publishConfig, - @NonNull WifiNanSessionCallback callback) { - if (VDBG) Log.v(TAG, "publish(): config=" + publishConfig); + public void publish(int clientId, Looper looper, PublishConfig publishConfig, + WifiNanDiscoverySessionCallback callback) { + if (VDBG) Log.v(TAG, "publish(): clientId=" + clientId + ", config=" + publishConfig); - int clientId; - Looper looper; - synchronized (mLock) { - if (mLooper == null || mClientId == INVALID_CLIENT_ID) { - Log.e(TAG, "publish(): called with null looper or invalid client ID - " - + "not connected first?"); - return; - } - - clientId = mClientId; - looper = mLooper; - } try { mService.publish(clientId, publishConfig, - new WifiNanSessionCallbackProxy(this, looper, true, callback)); + new WifiNanDiscoverySessionCallbackProxy(this, looper, true, callback, + clientId)); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** @hide */ - public void updatePublish(int sessionId, PublishConfig publishConfig) { - if (VDBG) Log.v(TAG, "updatePublish(): config=" + publishConfig); - - int clientId; - synchronized (mLock) { - if (mClientId == INVALID_CLIENT_ID) { - Log.e(TAG, "updatePublish(): called with invalid client ID - not connected first?"); - return; - } - - clientId = mClientId; + public void updatePublish(int clientId, int sessionId, PublishConfig publishConfig) { + if (VDBG) { + Log.v(TAG, "updatePublish(): clientId=" + clientId + ",sessionId=" + sessionId + + ", config=" + publishConfig); } + try { mService.updatePublish(clientId, sessionId, publishConfig); } catch (RemoteException e) { @@ -511,73 +411,30 @@ public class WifiNanManager { } } - /** - * Issue a request to the NAN service to create a new NAN subscribe discovery session, using - * the specified {@code subscribeConfig} configuration. The results of the subscribe - * operation are routed to the callbacks of {@link WifiNanSessionCallback}: - * <ul> - * <li>{@link WifiNanSessionCallback#onSubscribeStarted(WifiNanSubscribeSession)} is called - * when the subscribe session is created and provides a handle to the session. Further - * operations on the subscribe session can be executed on that object. - * <li>{@link WifiNanSessionCallback#onSessionConfigFail(int)} is called if the subscribe - * operation failed. - * </ul> - * <p> - * Other results of the subscribe session operations will also be routed to callbacks - * on the {@code callback} object. The resulting subscribe session can be modified using - * {@link WifiNanSubscribeSession#updateSubscribe(SubscribeConfig)}. - * <p> - * An application must use the {@link WifiNanSession#terminate()} to terminate the - * subscribe discovery session once it isn't needed. This will free resources as well - * terminate any on-air transmissions. - * - * @param subscribeConfig The {@link SubscribeConfig} specifying the - * configuration of the requested subscribe session. - * @param callback A {@link WifiNanSessionCallback} derived object to be used for session - * event callbacks. - */ - public void subscribe(@NonNull SubscribeConfig subscribeConfig, - @NonNull WifiNanSessionCallback callback) { + /** @hide */ + public void subscribe(int clientId, Looper looper, SubscribeConfig subscribeConfig, + WifiNanDiscoverySessionCallback callback) { if (VDBG) { - Log.v(TAG, "subscribe(): config=" + subscribeConfig); - } - - int clientId; - Looper looper; - synchronized (mLock) { - if (mLooper == null || mClientId == INVALID_CLIENT_ID) { - Log.e(TAG, "subscribe(): called with null looper or invalid client ID - " - + "not connected first?"); - return; + if (VDBG) { + Log.v(TAG, + "subscribe(): clientId=" + clientId + ", config=" + subscribeConfig); } - - clientId = mClientId; - looper = mLooper; } try { mService.subscribe(clientId, subscribeConfig, - new WifiNanSessionCallbackProxy(this, looper, false, callback)); + new WifiNanDiscoverySessionCallbackProxy(this, looper, false, callback, + clientId)); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** @hide */ - public void updateSubscribe(int sessionId, SubscribeConfig subscribeConfig) { + public void updateSubscribe(int clientId, int sessionId, SubscribeConfig subscribeConfig) { if (VDBG) { - Log.v(TAG, "subscribe(): config=" + subscribeConfig); - } - - int clientId; - synchronized (mLock) { - if (mClientId == INVALID_CLIENT_ID) { - Log.e(TAG, - "updateSubscribe(): called with invalid client ID - not connected first?"); - return; - } - - clientId = mClientId; + Log.v(TAG, "updateSubscribe(): clientId=" + clientId + ",sessionId=" + sessionId + + ", config=" + subscribeConfig); } try { @@ -588,18 +445,10 @@ public class WifiNanManager { } /** @hide */ - public void terminateSession(int sessionId) { - if (DBG) Log.d(TAG, "Terminate NAN session #" + sessionId); - - int clientId; - synchronized (mLock) { - if (mClientId == INVALID_CLIENT_ID) { - Log.e(TAG, - "terminateSession(): called with invalid client ID - not connected first?"); - return; - } - - clientId = mClientId; + public void terminateSession(int clientId, int sessionId) { + if (VDBG) { + Log.d(TAG, + "terminateSession(): clientId=" + clientId + ", sessionId=" + sessionId); } try { @@ -610,46 +459,33 @@ public class WifiNanManager { } /** @hide */ - public void sendMessage(int sessionId, int peerId, byte[] message, int messageId, - int retryCount) { - if (VDBG) { - Log.v(TAG, "sendMessage(): sessionId=" + sessionId + ", peerId=" + peerId - + ", messageId=" + messageId + ", retryCount=" + retryCount); + public void sendMessage(int clientId, int sessionId, Object peerHandle, byte[] message, + int messageId, int retryCount) { + if (peerHandle == null) { + throw new IllegalArgumentException( + "sendMessage: invalid peerHandle - must be non-null"); } - int clientId; - synchronized (mLock) { - if (mClientId == INVALID_CLIENT_ID) { - Log.e(TAG, "sendMessage(): called with invalid client ID - not connected first?"); - return; - } - - clientId = mClientId; + if (VDBG) { + Log.v(TAG, "sendMessage(): clientId=" + clientId + ", sessionId=" + sessionId + + ", peerHandle=" + ((OpaquePeerHandle) peerHandle).peerId + ", messageId=" + + messageId + ", retryCount=" + retryCount); } try { - mService.sendMessage(clientId, sessionId, peerId, message, messageId, retryCount); + mService.sendMessage(clientId, sessionId, ((OpaquePeerHandle) peerHandle).peerId, + message, messageId, retryCount); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** @hide */ - public void startRanging(int sessionId, RttManager.RttParams[] params, + public void startRanging(int clientId, int sessionId, RttManager.RttParams[] params, RttManager.RttListener listener) { if (VDBG) { - Log.v(TAG, "startRanging: sessionId=" + sessionId + ", " + "params=" - + Arrays.toString(params) + ", listener=" + listener); - } - - int clientId; - synchronized (mLock) { - if (mClientId == INVALID_CLIENT_ID) { - Log.e(TAG, "startRanging(): called with invalid client ID - not connected first?"); - return; - } - - clientId = mClientId; + Log.v(TAG, "startRanging: clientId=" + clientId + ", sessionId=" + sessionId + ", " + + "params=" + Arrays.toString(params) + ", listener=" + listener); } int rangingKey = 0; @@ -666,19 +502,20 @@ public class WifiNanManager { } /** @hide */ - public String createNetworkSpecifier(@DataPathRole int role, int sessionId, int peerId, + public String createNetworkSpecifier(int clientId, int role, int sessionId, Object peerHandle, byte[] token) { if (VDBG) { Log.v(TAG, "createNetworkSpecifier: role=" + role + ", sessionId=" + sessionId - + ", peerId=" + peerId + ", token=" + token); + + ", peerHandle=" + ((peerHandle == null) ? peerHandle + : ((OpaquePeerHandle) peerHandle).peerId) + ", token=" + token); } int type; - if (token != null && peerId != 0) { + if (token != null && peerHandle != null) { type = NETWORK_SPECIFIER_TYPE_1A; - } else if (token == null && peerId != 0) { + } else if (token == null && peerHandle != null) { type = NETWORK_SPECIFIER_TYPE_1B; - } else if (token != null && peerId == 0) { + } else if (token != null && peerHandle == null) { type = NETWORK_SPECIFIER_TYPE_1C; } else { type = NETWORK_SPECIFIER_TYPE_1D; @@ -695,23 +532,11 @@ public class WifiNanManager { throw new IllegalArgumentException( "createNetworkSpecifier: Invalid null token - not permitted on INITIATOR"); } - if (peerId == 0) { + if (peerHandle == null) { throw new IllegalArgumentException( - "createNetworkSpecifier: Invalid peer ID (value of 0) - not permitted on " - + "INITIATOR"); - } - } - - int clientId; - synchronized (mLock) { - if (mClientId == INVALID_CLIENT_ID) { - Log.e(TAG, - "createNetworkSpecifier: called with invalid client ID - not connected " - + "first?"); - return null; + "createNetworkSpecifier: Invalid peer handle (value of null) - not " + + "permitted on INITIATOR"); } - - clientId = mClientId; } JSONObject json; @@ -721,8 +546,8 @@ public class WifiNanManager { json.put(NETWORK_SPECIFIER_KEY_ROLE, role); json.put(NETWORK_SPECIFIER_KEY_CLIENT_ID, clientId); json.put(NETWORK_SPECIFIER_KEY_SESSION_ID, sessionId); - if (peerId != 0) { - json.put(NETWORK_SPECIFIER_KEY_PEER_ID, peerId); + if (peerHandle != null) { + json.put(NETWORK_SPECIFIER_KEY_PEER_ID, ((OpaquePeerHandle) peerHandle).peerId); } if (token != null) { json.put(NETWORK_SPECIFIER_KEY_TOKEN, @@ -735,37 +560,9 @@ public class WifiNanManager { return json.toString(); } - /** - * Create a {@link NetworkRequest.Builder#setNetworkSpecifier(String)} for a - * WiFi NAN connection to the specified peer. The - * {@link NetworkRequest.Builder#addTransportType(int)} should be set to - * {@link android.net.NetworkCapabilities#TRANSPORT_WIFI_NAN}. - * <p> - * This API is targeted for applications which can obtain the peer MAC address using OOB - * (out-of-band) discovery. NAN discovery does not provide the MAC address of the peer - - * when using NAN discovery use the alternative network specifier method - - * {@link WifiNanSession#createNetworkSpecifier(int, int, byte[])}. - * - * @param role The role of this device: - * {@link WifiNanManager#WIFI_NAN_DATA_PATH_ROLE_INITIATOR} or - * {@link WifiNanManager#WIFI_NAN_DATA_PATH_ROLE_RESPONDER} - * @param peer The MAC address of the peer's NAN discovery interface. On a RESPONDER this - * value is used to gate the acceptance of a connection request from only that - * peer. A RESPONDER may specified a null - indicating that it will accept - * connection requests from any device. - * @param token An arbitrary token (message) to be used to match connection initiation request - * to a responder setup. A RESPONDER is set up with a {@code token} which must - * be matched by the token provided by the INITIATOR. A null token is permitted - * on the RESPONDER and matches any peer token. An empty ({@code ""}) token is - * not the same as a null token and requires the peer token to be empty as well. - * - * @return A string to be used to construct - * {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(String)} to pass to {@link - * android.net.ConnectivityManager#requestNetwork(NetworkRequest, ConnectivityManager.NetworkCallback)} - * [or other varieties of that API]. - */ - public String createNetworkSpecifier(@DataPathRole int role, @Nullable byte[] peer, - @Nullable byte[] token) { + /** @hide */ + public String createNetworkSpecifier(int clientId, @DataPathRole int role, + @Nullable byte[] peer, @Nullable byte[] token) { if (VDBG) { Log.v(TAG, "createNetworkSpecifier: role=" + role + ", token=" + token); } @@ -803,18 +600,6 @@ public class WifiNanManager { } } - int clientId; - synchronized (mLock) { - if (mClientId == INVALID_CLIENT_ID) { - Log.e(TAG, - "createNetworkSpecifier: called with invalid client ID - not connected " - + "first?"); - return null; - } - - clientId = mClientId; - } - JSONObject json; try { json = new JSONObject(); @@ -845,6 +630,8 @@ public class WifiNanManager { private final Handler mHandler; private final WeakReference<WifiNanManager> mNanManager; + private final Binder mBinder; + private final Looper mLooper; RttManager.RttListener getAndRemoveRangingListener(int rangingId) { WifiNanManager mgr = mNanManager.get(); @@ -861,14 +648,17 @@ public class WifiNanManager { } /** - * Constructs a {@link WifiNanEventCallback} using the specified looper. + * Constructs a {@link WifiNanAttachCallback} using the specified looper. * All callbacks will delivered on the thread of the specified looper. * * @param looper The looper on which to execute the callbacks. */ - WifiNanEventCallbackProxy(WifiNanManager mgr, Looper looper, - final WifiNanEventCallback originalCallback) { + WifiNanEventCallbackProxy(WifiNanManager mgr, Looper looper, Binder binder, + final WifiNanAttachCallback attachCallback, + final WifiNanIdentityChangedListener identityChangedListener) { mNanManager = new WeakReference<>(mgr); + mLooper = looper; + mBinder = binder; if (VDBG) Log.v(TAG, "WifiNanEventCallbackProxy ctor: looper=" + looper); mHandler = new Handler(looper) { @@ -886,18 +676,15 @@ public class WifiNanManager { switch (msg.what) { case CALLBACK_CONNECT_SUCCESS: - originalCallback.onConnectSuccess(); + attachCallback.onAttached( + new WifiNanSession(mgr, mBinder, msg.arg1)); break; case CALLBACK_CONNECT_FAIL: - synchronized (mgr.mLock) { - mgr.mLooper = null; - mgr.mClientId = INVALID_CLIENT_ID; - } mNanManager.clear(); - originalCallback.onConnectFail(msg.arg1); + attachCallback.onAttachFailed(); break; case CALLBACK_IDENTITY_CHANGED: - originalCallback.onIdentityChanged((byte[]) msg.obj); + identityChangedListener.onIdentityChanged((byte[]) msg.obj); break; case CALLBACK_RANGING_SUCCESS: { RttManager.RttListener listener = getAndRemoveRangingListener(msg.arg1); @@ -936,16 +723,17 @@ public class WifiNanManager { } @Override - public void onConnectSuccess() { + public void onConnectSuccess(int clientId) { if (VDBG) Log.v(TAG, "onConnectSuccess"); Message msg = mHandler.obtainMessage(CALLBACK_CONNECT_SUCCESS); + msg.arg1 = clientId; mHandler.sendMessage(msg); } @Override public void onConnectFail(int reason) { - if (VDBG) Log.v(TAG, "onConfigFailed: reason=" + reason); + if (VDBG) Log.v(TAG, "onConnectFail: reason=" + reason); Message msg = mHandler.obtainMessage(CALLBACK_CONNECT_FAIL); msg.arg1 = reason; @@ -999,7 +787,8 @@ public class WifiNanManager { } } - private static class WifiNanSessionCallbackProxy extends IWifiNanSessionCallback.Stub { + private static class WifiNanDiscoverySessionCallbackProxy extends + IWifiNanDiscoverySessionCallback.Stub { private static final int CALLBACK_SESSION_STARTED = 0; private static final int CALLBACK_SESSION_CONFIG_SUCCESS = 1; private static final int CALLBACK_SESSION_CONFIG_FAIL = 2; @@ -1014,18 +803,22 @@ public class WifiNanManager { private final WeakReference<WifiNanManager> mNanManager; private final boolean mIsPublish; - private final WifiNanSessionCallback mOriginalCallback; + private final WifiNanDiscoverySessionCallback mOriginalCallback; + private final int mClientId; private final Handler mHandler; - private WifiNanSession mSession; + private WifiNanDiscoveryBaseSession mSession; - WifiNanSessionCallbackProxy(WifiNanManager mgr, Looper looper, boolean isPublish, - WifiNanSessionCallback originalCallback) { + WifiNanDiscoverySessionCallbackProxy(WifiNanManager mgr, Looper looper, boolean isPublish, + WifiNanDiscoverySessionCallback originalCallback, int clientId) { mNanManager = new WeakReference<>(mgr); mIsPublish = isPublish; mOriginalCallback = originalCallback; + mClientId = clientId; - if (VDBG) Log.v(TAG, "WifiNanSessionCallbackProxy ctor: isPublish=" + isPublish); + if (VDBG) { + Log.v(TAG, "WifiNanDiscoverySessionCallbackProxy ctor: isPublish=" + isPublish); + } mHandler = new Handler(looper) { @Override @@ -1033,7 +826,7 @@ public class WifiNanManager { if (DBG) Log.d(TAG, "What=" + msg.what + ", msg=" + msg); if (mNanManager.get() == null) { - Log.w(TAG, "WifiNanSessionCallbackProxy: handleMessage post GC"); + Log.w(TAG, "WifiNanDiscoverySessionCallbackProxy: handleMessage post GC"); return; } @@ -1042,10 +835,10 @@ public class WifiNanManager { onProxySessionStarted(msg.arg1); break; case CALLBACK_SESSION_CONFIG_SUCCESS: - mOriginalCallback.onSessionConfigSuccess(); + mOriginalCallback.onSessionConfigUpdated(); break; case CALLBACK_SESSION_CONFIG_FAIL: - mOriginalCallback.onSessionConfigFail(msg.arg1); + mOriginalCallback.onSessionConfigFailed(); if (mSession == null) { /* * creation failed (as opposed to update @@ -1058,19 +851,20 @@ public class WifiNanManager { onProxySessionTerminated(msg.arg1); break; case CALLBACK_MATCH: - mOriginalCallback.onMatch( - msg.arg1, + mOriginalCallback.onServiceDiscovered( + new OpaquePeerHandle(msg.arg1), msg.getData().getByteArray(MESSAGE_BUNDLE_KEY_MESSAGE), msg.getData().getByteArray(MESSAGE_BUNDLE_KEY_MESSAGE2)); break; case CALLBACK_MESSAGE_SEND_SUCCESS: - mOriginalCallback.onMessageSendSuccess(msg.arg1); + mOriginalCallback.onMessageSent(msg.arg1); break; case CALLBACK_MESSAGE_SEND_FAIL: - mOriginalCallback.onMessageSendFail(msg.arg1, msg.arg2); + mOriginalCallback.onMessageSendFailed(msg.arg1); break; case CALLBACK_MESSAGE_RECEIVED: - mOriginalCallback.onMessageReceived(msg.arg1, (byte[]) msg.obj); + mOriginalCallback.onMessageReceived(new OpaquePeerHandle(msg.arg1), + (byte[]) msg.obj); break; } } @@ -1176,11 +970,13 @@ public class WifiNanManager { } if (mIsPublish) { - WifiNanPublishSession session = new WifiNanPublishSession(mgr, sessionId); + WifiNanPublishDiscoverySession session = new WifiNanPublishDiscoverySession(mgr, + mClientId, sessionId); mSession = session; mOriginalCallback.onPublishStarted(session); } else { - WifiNanSubscribeSession session = new WifiNanSubscribeSession(mgr, sessionId); + WifiNanSubscribeDiscoverySession + session = new WifiNanSubscribeDiscoverySession(mgr, mClientId, sessionId); mSession = session; mOriginalCallback.onSubscribeStarted(session); } @@ -1198,4 +994,13 @@ public class WifiNanManager { mOriginalCallback.onSessionTerminated(reason); } } + + /** @hide */ + public static class OpaquePeerHandle { + public OpaquePeerHandle(int peerId) { + this.peerId = peerId; + } + + public int peerId; + } } diff --git a/wifi/java/android/net/wifi/nan/WifiNanPublishSession.java b/wifi/java/android/net/wifi/nan/WifiNanPublishDiscoverySession.java index ccd7faee8476..75c6cb7da183 100644 --- a/wifi/java/android/net/wifi/nan/WifiNanPublishSession.java +++ b/wifi/java/android/net/wifi/nan/WifiNanPublishDiscoverySession.java @@ -21,32 +21,33 @@ import android.util.Log; /** * A class representing a NAN publish session. Created when - * {@link WifiNanManager#publish(PublishConfig, WifiNanSessionCallback)} is called and a - * discovery session is created and returned in - * {@link WifiNanSessionCallback#onPublishStarted(WifiNanPublishSession)}. See baseline - * functionality of all discovery sessions in {@link WifiNanSession}. This object allows updating - * an existing/running publish discovery session using {@link #updatePublish(PublishConfig)}. + * {@link WifiNanSession#publish(android.os.Handler, PublishConfig, WifiNanDiscoverySessionCallback)} + * is called and a discovery session is created and returned in + * {@link WifiNanDiscoverySessionCallback#onPublishStarted(WifiNanPublishDiscoverySession)}. See + * baseline functionality of all discovery sessions in {@link WifiNanDiscoveryBaseSession}. This + * object allows updating an existing/running publish discovery session using + * {@link #updatePublish(PublishConfig)}. * * @hide PROPOSED_NAN_API */ -public class WifiNanPublishSession extends WifiNanSession { - private static final String TAG = "WifiNanPublishSession"; +public class WifiNanPublishDiscoverySession extends WifiNanDiscoveryBaseSession { + private static final String TAG = "WifiNanPublishDiscSsn"; /** @hide */ - public WifiNanPublishSession(WifiNanManager manager, int sessionId) { - super(manager, sessionId); + public WifiNanPublishDiscoverySession(WifiNanManager manager, int clientId, int sessionId) { + super(manager, clientId, sessionId); } /** * Re-configure the currently active publish session. The - * {@link WifiNanSessionCallback} is not replaced - the same listener used + * {@link WifiNanDiscoverySessionCallback} is not replaced - the same listener used * at creation is still used. The results of the configuration are returned using - * {@link WifiNanSessionCallback}: + * {@link WifiNanDiscoverySessionCallback}: * <ul> - * <li>{@link WifiNanSessionCallback#onSessionConfigSuccess()}: configuration update - * succeeded. - * <li>{@link WifiNanSessionCallback#onSessionConfigFail(int)}: configuration update - * failed. The publish discovery session is still running using its previous + * <li>{@link WifiNanDiscoverySessionCallback#onSessionConfigUpdated()}: configuration + * update succeeded. + * <li>{@link WifiNanDiscoverySessionCallback#onSessionConfigFailed()}: configuration + * update failed. The publish discovery session is still running using its previous * configuration (i.e. update failure does not terminate the session). * </ul> * @@ -63,7 +64,7 @@ public class WifiNanPublishSession extends WifiNanSession { return; } - mgr.updatePublish(mSessionId, publishConfig); + mgr.updatePublish(mClientId, mSessionId, publishConfig); } } } diff --git a/wifi/java/android/net/wifi/nan/WifiNanSession.java b/wifi/java/android/net/wifi/nan/WifiNanSession.java index 005ca291cbf5..5fb2c066d9b9 100644 --- a/wifi/java/android/net/wifi/nan/WifiNanSession.java +++ b/wifi/java/android/net/wifi/nan/WifiNanSession.java @@ -16,9 +16,12 @@ package android.net.wifi.nan; +import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.SystemApi; -import android.net.wifi.RttManager; +import android.net.NetworkRequest; +import android.os.Binder; +import android.os.Handler; +import android.os.Looper; import android.util.Log; import dalvik.system.CloseGuard; @@ -26,18 +29,8 @@ import dalvik.system.CloseGuard; import java.lang.ref.WeakReference; /** - * A class representing a single publish or subscribe NAN session. This object - * will not be created directly - only its child classes are available: - * {@link WifiNanPublishSession} and {@link WifiNanSubscribeSession}. This class provides - * functionality common to both publish and subscribe discovery sessions: - * <ul> - * <li>Sending messages: {@link #sendMessage(int, byte[], int)} or - * {@link #sendMessage(int, byte[], int, int)} methods. - * <li>Creating a network-specifier when requesting a NAN connection: - * {@link #createNetworkSpecifier(int, int, byte[])}. - * </ul> - * The {@link #terminate()} method must be called to terminate discovery sessions once they are - * no longer needed. + * This class represents a Wi-Fi NAN session - an attachment to the Wi-Fi NAN service through + * which the app can execute discovery operations. * * @hide PROPOSED_NAN_API */ @@ -46,71 +39,42 @@ public class WifiNanSession { private static final boolean DBG = false; private static final boolean VDBG = false; // STOPSHIP if true - private static final int MAX_SEND_RETRY_COUNT = 5; - - /** @hide */ - protected WeakReference<WifiNanManager> mMgr; - /** @hide */ - protected final int mSessionId; - /** @hide */ - protected boolean mTerminated = false; + private final WeakReference<WifiNanManager> mMgr; + private final Binder mBinder; + private final int mClientId; + private boolean mTerminated = true; private final CloseGuard mCloseGuard = CloseGuard.get(); - /** - * Return the maximum permitted retry count when sending messages using - * {@link #sendMessage(int, byte[], int, int)}. - * - * @return Maximum retry count when sending messages. - */ - public static int getMaxSendRetryCount() { - return MAX_SEND_RETRY_COUNT; - } - /** @hide */ - public WifiNanSession(WifiNanManager manager, int sessionId) { - if (VDBG) Log.v(TAG, "New client created: manager=" + manager + ", sessionId=" + sessionId); + public WifiNanSession(WifiNanManager manager, Binder binder, int clientId) { + if (VDBG) Log.v(TAG, "New session created: manager=" + manager + ", clientId=" + clientId); mMgr = new WeakReference<>(manager); - mSessionId = sessionId; + mBinder = binder; + mClientId = clientId; + mTerminated = false; - mCloseGuard.open("terminate"); + mCloseGuard.open("destroy"); } /** - * Terminate the publish or subscribe session - free any resources, and stop - * transmitting packets on-air (for an active session) or listening for - * matches (for a passive session). The session may not be used for any - * additional operations after termination. + * Destroy the Wi-Fi NAN service session and, if no other applications are attached to NAN, + * also disable NAN. This method destroys all outstanding operations - i.e. all publish and + * subscribes are terminated, and any outstanding data-links are shut-down. However, it is + * good practice to destroy these discovery sessions and connections explicitly before a + * session-wide destroy. * <p> - * This operation must be done on a session which is no longer needed. Otherwise system - * resources will continue to be utilized until the application terminates. The only - * exception is a session for which we received a termination callback, - * {@link WifiNanSessionCallback#onSessionTerminated(int)}. + * An application may re-attach after a destroy using + * {@link WifiNanManager#attach(Handler, WifiNanAttachCallback)} . */ - public void terminate() { + public void destroy() { WifiNanManager mgr = mMgr.get(); if (mgr == null) { - Log.w(TAG, "terminate: called post GC on WifiNanManager"); - return; - } - mgr.terminateSession(mSessionId); - mTerminated = true; - mMgr.clear(); - mCloseGuard.close(); - } - - /** - * Sets the status of the session to terminated - i.e. an indication that - * already terminated rather than executing a termination. - * - * @hide - */ - public void setTerminated() { - if (mTerminated) { - Log.w(TAG, "terminate: already terminated."); + Log.w(TAG, "destroy: called post GC on WifiNanManager"); return; } + mgr.disconnect(mClientId, mBinder); mTerminated = true; mMgr.clear(); mCloseGuard.close(); @@ -122,7 +86,7 @@ public class WifiNanSession { try { if (!mTerminated) { mCloseGuard.warnIfOpen(); - terminate(); + destroy(); } } finally { super.finalize(); @@ -130,125 +94,108 @@ public class WifiNanSession { } /** - * Sends a message to the specified destination. NAN messages are transmitted in the context - * of a discovery session - executed subsequent to a publish/subscribe - * {@link WifiNanSessionCallback#onMatch(int, byte[], byte[])} event. + * Issue a request to the NAN service to create a new NAN publish discovery session, using + * the specified {@code publishConfig} configuration. The results of the publish operation + * are routed to the callbacks of {@link WifiNanDiscoverySessionCallback}: + * <ul> + * <li> + * {@link WifiNanDiscoverySessionCallback#onPublishStarted(WifiNanPublishDiscoverySession)} + * is called when the publish session is created and provides a handle to the session. + * Further operations on the publish session can be executed on that object. + * <li>{@link WifiNanDiscoverySessionCallback#onSessionConfigFailed()} is called if the + * publish operation failed. + * </ul> * <p> - * NAN messages are not guaranteed delivery. Callbacks on {@link WifiNanSessionCallback} - * indicate message was transmitted successfully, - * {@link WifiNanSessionCallback#onMessageSendSuccess(int)}, or transmission failed - * (possibly after several retries) - - * {@link WifiNanSessionCallback#onMessageSendFail(int, int)}. + * Other results of the publish session operations will also be routed to callbacks + * on the {@code callback} object. The resulting publish session can be modified using + * {@link WifiNanPublishDiscoverySession#updatePublish(PublishConfig)}. * <p> - * The peer will get a callback indicating a message was received using - * {@link WifiNanSessionCallback#onMessageReceived(int, byte[])}. + * An application must use the {@link WifiNanDiscoveryBaseSession#destroy()} to + * terminate the publish discovery session once it isn't needed. This will free + * resources as well terminate any on-air transmissions. * - * @param peerId The peer's ID for the message. Must be a result of an - * {@link WifiNanSessionCallback#onMatch(int, byte[], byte[])} or - * {@link WifiNanSessionCallback#onMessageReceived(int, byte[])} events. - * @param message The message to be transmitted. - * @param messageId An arbitrary integer used by the caller to identify the message. The same - * integer ID will be returned in the callbacks indicating message send success or - * failure. The {@code messageId} is not used internally by the NAN service - it - * can be arbitrary and non-unique. - * @param retryCount An integer specifying how many additional service-level (as opposed to PHY - * or MAC level) retries should be attempted if there is no ACK from the receiver - * (note: no retransmissions are attempted in other failure cases). A value of 0 - * indicates no retries. Max permitted value is {@link #getMaxSendRetryCount()}. + * @param handler The Handler on whose thread to execute the callbacks of the {@code + * callback} object. If a null is provided then the application's main thread will be used. + * @param publishConfig The {@link PublishConfig} specifying the + * configuration of the requested publish session. + * @param callback A {@link WifiNanDiscoverySessionCallback} derived object to be used for + * session event callbacks. */ - public void sendMessage(int peerId, @Nullable byte[] message, int messageId, int retryCount) { + public void publish(@Nullable Handler handler, @NonNull PublishConfig publishConfig, + @NonNull WifiNanDiscoverySessionCallback callback) { + WifiNanManager mgr = mMgr.get(); + if (mgr == null) { + Log.e(TAG, "publish: called post GC on WifiNanManager"); + return; + } if (mTerminated) { - Log.w(TAG, "sendMessage: called on terminated session"); + Log.e(TAG, "publish: called after termination"); return; - } else { - WifiNanManager mgr = mMgr.get(); - if (mgr == null) { - Log.w(TAG, "sendMessage: called post GC on WifiNanManager"); - return; - } - - mgr.sendMessage(mSessionId, peerId, message, messageId, retryCount); } + mgr.publish(mClientId, (handler == null) ? Looper.getMainLooper() : handler.getLooper(), + publishConfig, callback); } /** - * Sends a message to the specified destination. NAN messages are transmitted in the context - * of a discovery session - executed subsequent to a publish/subscribe - * {@link WifiNanSessionCallback#onMatch(int, byte[], byte[])} event. + * Issue a request to the NAN service to create a new NAN subscribe discovery session, using + * the specified {@code subscribeConfig} configuration. The results of the subscribe + * operation are routed to the callbacks of {@link WifiNanDiscoverySessionCallback}: + * <ul> + * <li> + * {@link WifiNanDiscoverySessionCallback#onSubscribeStarted(WifiNanSubscribeDiscoverySession)} + * is called when the subscribe session is created and provides a handle to the session. + * Further operations on the subscribe session can be executed on that object. + * <li>{@link WifiNanDiscoverySessionCallback#onSessionConfigFailed()} is called if the + * subscribe operation failed. + * </ul> * <p> - * NAN messages are not guaranteed delivery. Callbacks on {@link WifiNanSessionCallback} - * indicate message was transmitted successfully, - * {@link WifiNanSessionCallback#onMessageSendSuccess(int)}, or transmission failed - * (possibly after several retries) - - * {@link WifiNanSessionCallback#onMessageSendFail(int, int)}. + * Other results of the subscribe session operations will also be routed to callbacks + * on the {@code callback} object. The resulting subscribe session can be modified using + * {@link WifiNanSubscribeDiscoverySession#updateSubscribe(SubscribeConfig)}. * <p> - * The peer will get a callback indicating a message was received using - * {@link WifiNanSessionCallback#onMessageReceived(int, byte[])}. - * Equivalent to {@link #sendMessage(int, byte[], int, int)} with a {@code retryCount} of - * 0. + * An application must use the {@link WifiNanDiscoveryBaseSession#destroy()} to + * terminate the subscribe discovery session once it isn't needed. This will free + * resources as well terminate any on-air transmissions. * - * @param peerId The peer's ID for the message. Must be a result of an - * {@link WifiNanSessionCallback#onMatch(int, byte[], byte[])} or - * {@link WifiNanSessionCallback#onMessageReceived(int, byte[])} events. - * @param message The message to be transmitted. - * @param messageId An arbitrary integer used by the caller to identify the message. The same - * integer ID will be returned in the callbacks indicating message send success or - * failure. The {@code messageId} is not used internally by the NAN service - it - * can be arbitrary and non-unique. + * @param handler The Handler on whose thread to execute the callbacks of the {@code + * callback} object. If a null is provided then the application's main thread will be used. + * @param subscribeConfig The {@link SubscribeConfig} specifying the + * configuration of the requested subscribe session. + * @param callback A {@link WifiNanDiscoverySessionCallback} derived object to be used for + * session event callbacks. */ - public void sendMessage(int peerId, @Nullable byte[] message, int messageId) { - sendMessage(peerId, message, messageId, 0); - } - - /** - * Start a ranging operation with the specified peers. The peer IDs are obtained from an - * {@link WifiNanSessionCallback#onMatch(int, byte[], byte[])} or - * {@link WifiNanSessionCallback#onMessageReceived(int, byte[])} operation - can only - * range devices which are part of an ongoing discovery session. - * - * @param params RTT parameters - each corresponding to a specific peer ID (the array sizes - * must be identical). The - * {@link android.net.wifi.RttManager.RttParams#bssid} member must be set to - * a peer ID - not to a MAC address. - * @param listener The listener to receive the results of the ranging session. - * @hide PROPOSED_NAN_SYSTEM_API [TODO: b/28847998 - track RTT API & visilibity] - */ - public void startRanging(RttManager.RttParams[] params, RttManager.RttListener listener) { + public void subscribe(@Nullable Handler handler, @NonNull SubscribeConfig subscribeConfig, + @NonNull WifiNanDiscoverySessionCallback callback) { + WifiNanManager mgr = mMgr.get(); + if (mgr == null) { + Log.e(TAG, "publish: called post GC on WifiNanManager"); + return; + } if (mTerminated) { - Log.w(TAG, "startRanging: called on terminated session"); + Log.e(TAG, "publish: called after termination"); return; - } else { - WifiNanManager mgr = mMgr.get(); - if (mgr == null) { - Log.w(TAG, "startRanging: called post GC on WifiNanManager"); - return; - } - - mgr.startRanging(mSessionId, params, listener); } + mgr.subscribe(mClientId, (handler == null) ? Looper.getMainLooper() : handler.getLooper(), + subscribeConfig, callback); } /** - * Create a {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(String)} for a + * Create a {@link NetworkRequest.Builder#setNetworkSpecifier(String)} for a * WiFi NAN connection to the specified peer. The - * {@link android.net.NetworkRequest.Builder#addTransportType(int)} should be set to + * {@link NetworkRequest.Builder#addTransportType(int)} should be set to * {@link android.net.NetworkCapabilities#TRANSPORT_WIFI_NAN}. * <p> - * This method should be used when setting up a connection with a peer discovered through NAN - * discovery or communication (in such scenarios the MAC address of the peer is shielded by - * an opaque peer ID handle). If a NAN connection is needed to a peer discovered using other - * OOB (out-of-band) mechanism then use the alternative - * {@link WifiNanManager#createNetworkSpecifier(int, byte[], byte[])} method - which uses the - * peer's MAC address. + * This API is targeted for applications which can obtain the peer MAC address using OOB + * (out-of-band) discovery. NAN discovery does not provide the MAC address of the peer - + * when using NAN discovery use the alternative network specifier method - + * {@link WifiNanDiscoveryBaseSession#createNetworkSpecifier(int, Object, byte[])}. * - * @param role The role of this device: - * {@link WifiNanManager#WIFI_NAN_DATA_PATH_ROLE_INITIATOR} or - * {@link WifiNanManager#WIFI_NAN_DATA_PATH_ROLE_RESPONDER} - * @param peerId The peer ID obtained through - * {@link WifiNanSessionCallback#onMatch(int, byte[], byte[])} or - * {@link WifiNanSessionCallback#onMessageReceived(int, byte[])}. On a RESPONDER this + * @param role The role of this device: + * {@link WifiNanManager#WIFI_NAN_DATA_PATH_ROLE_INITIATOR} or + * {@link WifiNanManager#WIFI_NAN_DATA_PATH_ROLE_RESPONDER} + * @param peer The MAC address of the peer's NAN discovery interface. On a RESPONDER this * value is used to gate the acceptance of a connection request from only that - * peer. A RESPONDER may specified a 0 - indicating that it will accept + * peer. A RESPONDER may specified a null - indicating that it will accept * connection requests from any device. * @param token An arbitrary token (message) to be used to match connection initiation request * to a responder setup. A RESPONDER is set up with a {@code token} which must @@ -258,22 +205,20 @@ public class WifiNanSession { * * @return A string to be used to construct * {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(String)} to pass to - * {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest,android.net.ConnectivityManager.NetworkCallback)} + * {@link android.net.ConnectivityManager#requestNetwork(NetworkRequest, android.net.ConnectivityManager.NetworkCallback)} * [or other varieties of that API]. */ - public String createNetworkSpecifier(@WifiNanManager.DataPathRole int role, int peerId, + public String createNetworkSpecifier(@WifiNanManager.DataPathRole int role, @Nullable byte[] peer, @Nullable byte[] token) { + WifiNanManager mgr = mMgr.get(); + if (mgr == null) { + Log.e(TAG, "createNetworkSpecifier: called post GC on WifiNanManager"); + return ""; + } if (mTerminated) { - Log.w(TAG, "createNetworkSpecifier: called on terminated session"); - return null; - } else { - WifiNanManager mgr = mMgr.get(); - if (mgr == null) { - Log.w(TAG, "createNetworkSpecifier: called post GC on WifiNanManager"); - return null; - } - - return mgr.createNetworkSpecifier(role, mSessionId, peerId, token); + Log.e(TAG, "createNetworkSpecifier: called after termination"); + return ""; } + return mgr.createNetworkSpecifier(mClientId, role, peer, token); } } diff --git a/wifi/java/android/net/wifi/nan/WifiNanSessionCallback.java b/wifi/java/android/net/wifi/nan/WifiNanSessionCallback.java deleted file mode 100644 index 8433b99315ce..000000000000 --- a/wifi/java/android/net/wifi/nan/WifiNanSessionCallback.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (C) 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. - */ - -package android.net.wifi.nan; - -import android.annotation.IntDef; -import android.annotation.NonNull; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * Base class for NAN session events callbacks. Should be extended by - * applications wanting notifications. The callbacks are set when a - * publish or subscribe session is created using - * {@link WifiNanManager#publish(PublishConfig, WifiNanSessionCallback)} or - * {@link WifiNanManager#subscribe(SubscribeConfig, WifiNanSessionCallback)} . - * <p> - * A single callback is set at session creation - it cannot be replaced. - * - * @hide PROPOSED_NAN_API - */ -public class WifiNanSessionCallback { - /** @hide */ - @IntDef({ - REASON_NO_RESOURCES, REASON_INVALID_ARGS, REASON_NO_MATCH_SESSION, - REASON_TX_FAIL, REASON_OTHER }) - @Retention(RetentionPolicy.SOURCE) - public @interface SessionReasonCodes { - } - - /** @hide */ - @IntDef({ - TERMINATE_REASON_DONE, TERMINATE_REASON_FAIL }) - @Retention(RetentionPolicy.SOURCE) - public @interface SessionTerminateCodes { - } - - /** - * Indicates no resources to execute the requested operation. - * Failure reason flag for {@link WifiNanSessionCallback} callbacks. - */ - public static final int REASON_NO_RESOURCES = 0; - - /** - * Indicates invalid argument in the requested operation. - * Failure reason flag for {@link WifiNanSessionCallback} callbacks. - */ - public static final int REASON_INVALID_ARGS = 1; - - /** - * Indicates a message is transmitted without a match (a discovery) or received message - * from peer occurring first. - * Failure reason flag for {@link WifiNanSessionCallback} callbacks. - */ - public static final int REASON_NO_MATCH_SESSION = 2; - - /** - * Indicates transmission failure: this may be due to local transmission - * failure or to no ACK received - remote device didn't receive the - * sent message. Failure reason flag for - * {@link WifiNanSessionCallback#onMessageSendFail(int, int)} callback. - */ - public static final int REASON_TX_FAIL = 3; - - /** - * Indicates an unspecified error occurred during the operation. - * Failure reason flag for {@link WifiNanSessionCallback} callbacks. - */ - public static final int REASON_OTHER = 4; - - /** - * Indicates that publish or subscribe session is done - all the - * requested operations (per {@link PublishConfig} or - * {@link SubscribeConfig}) have been executed. Failure reason flag for - * {@link WifiNanSessionCallback#onSessionTerminated(int)} callback. - */ - public static final int TERMINATE_REASON_DONE = 100; - - /** - * Indicates that publish or subscribe session is terminated due to a - * failure. - * Failure reason flag for - * {@link WifiNanSessionCallback#onSessionTerminated(int)} callback. - */ - public static final int TERMINATE_REASON_FAIL = 101; - - /** - * Called when a publish operation is started successfully in response to a - * {@link WifiNanManager#publish(PublishConfig, WifiNanSessionCallback)} operation. - * - * @param session The {@link WifiNanPublishSession} used to control the - * discovery session. - */ - public void onPublishStarted(@NonNull WifiNanPublishSession session) { - /* empty */ - } - - /** - * Called when a subscribe operation is started successfully in response to a - * {@link WifiNanManager#subscribe(SubscribeConfig, WifiNanSessionCallback)} operation. - * - * @param session The {@link WifiNanSubscribeSession} used to control the - * discovery session. - */ - public void onSubscribeStarted(@NonNull WifiNanSubscribeSession session) { - /* empty */ - } - - /** - * Called when a publish or subscribe discovery session configuration is update request - * succeeds. Called in response to {@link WifiNanPublishSession#updatePublish(PublishConfig)} - * or {@link WifiNanSubscribeSession#updateSubscribe(SubscribeConfig)}. - */ - public void onSessionConfigSuccess() { - /* empty */ - } - - /** - * Called when a publish or subscribe discovery session cannot be created: - * {@link WifiNanManager#publish(PublishConfig, WifiNanSessionCallback)} or - * {@link WifiNanManager#subscribe(SubscribeConfig, WifiNanSessionCallback)}, - * or when a configuration update fails: - * {@link WifiNanPublishSession#updatePublish(PublishConfig)} or - * {@link WifiNanSubscribeSession#updateSubscribe(SubscribeConfig)}. - * <p> - * For discovery session updates failure leaves the session running with its previous - * configuration - the discovery session is not terminated. - * - * @param reason The failure reason using - * {@code WifiNanSessionCallback.REASON_*} codes. - */ - public void onSessionConfigFail(@SessionReasonCodes int reason) { - /* empty */ - } - - /** - * Called when a discovery session (publish or subscribe) terminates. Termination may be due - * to user-request (either directly through {@link WifiNanSession#terminate()} or - * application-specified expiration, e.g. {@link PublishConfig.Builder#setPublishCount(int)} - * or {@link SubscribeConfig.Builder#setTtlSec(int)}) or due to a failure. - * - * @param reason The termination reason using - * {@code WifiNanSessionCallback.TERMINATE_*} codes. - */ - public void onSessionTerminated(@SessionTerminateCodes int reason) { - /* empty */ - } - - /** - * Called when a discovery (publish or subscribe) operation results in a - * match - when a peer is discovered. - * - * @param peerId The ID of the peer matching our discovery operation. - * @param serviceSpecificInfo The service specific information (arbitrary - * byte array) provided by the peer as part of its discovery - * configuration. - * @param matchFilter The filter (Tx on advertiser and Rx on listener) which - * resulted in this match. - */ - public void onMatch(int peerId, byte[] serviceSpecificInfo, byte[] matchFilter) { - /* empty */ - } - - /** - * Called in response to {@link WifiNanSession#sendMessage(int, byte[], int)} when a message - * is transmitted successfully - when it was received successfully by the peer - * (corresponds to an ACK being received). - * <p> - * Note that either this callback or - * {@link WifiNanSessionCallback#onMessageSendFail(int, int)} will be - * received - never both. - * - * @param messageId The arbitrary message ID specified when sending the message. - */ - public void onMessageSendSuccess(@SuppressWarnings("unused") int messageId) { - /* empty */ - } - - /** - * Called when message transmission fails - when no ACK is received from the peer. - * Retries when ACKs are not received are done by hardware, MAC, and in the NAN stack (using - * the {@link WifiNanSession#sendMessage(int, byte[], int, int)} method) - this - * event is received after all retries are exhausted. - * <p> - * Note that either this callback or - * {@link WifiNanSessionCallback#onMessageSendSuccess(int)} will be received - * - never both. - * - * @param messageId The arbitrary message ID specified when sending the message. - * @param reason The failure reason using - * {@code WifiNanSessionCallback.REASON_*} codes. - */ - public void onMessageSendFail(@SuppressWarnings("unused") int messageId, - @SessionReasonCodes int reason) { - /* empty */ - } - - /** - * Called when a message is received from a discovery session peer - in response to the - * peer's {@link WifiNanSession#sendMessage(int, byte[], int)} or - * {@link WifiNanSession#sendMessage(int, byte[], int, int)}. - * - * @param peerId The ID of the peer sending the message. - * @param message A byte array containing the message. - */ - public void onMessageReceived(int peerId, byte[] message) { - /* empty */ - } -} diff --git a/wifi/java/android/net/wifi/nan/WifiNanSubscribeSession.java b/wifi/java/android/net/wifi/nan/WifiNanSubscribeDiscoverySession.java index d0e56c521525..f5b4c0ce2c4c 100644 --- a/wifi/java/android/net/wifi/nan/WifiNanSubscribeSession.java +++ b/wifi/java/android/net/wifi/nan/WifiNanSubscribeDiscoverySession.java @@ -21,34 +21,35 @@ import android.util.Log; /** * A class representing a NAN subscribe session. Created when - * {@link WifiNanManager#subscribe(SubscribeConfig, WifiNanSessionCallback)} is called and a - * discovery session is created and returned in - * {@link WifiNanSessionCallback#onSubscribeStarted(WifiNanSubscribeSession)}. See baseline - * functionality of all discovery sessions in {@link WifiNanSession}. This object allows updating - * an existing/running subscribe discovery session using {@link #updateSubscribe(SubscribeConfig)}. + * {@link WifiNanSession#subscribe(android.os.Handler, SubscribeConfig, WifiNanDiscoverySessionCallback)} + * is called and a discovery session is created and returned in + * {@link WifiNanDiscoverySessionCallback#onSubscribeStarted(WifiNanSubscribeDiscoverySession)}. + * See baseline functionality of all discovery sessions in {@link WifiNanDiscoveryBaseSession}. + * This object allows updating an existing/running subscribe discovery session using + * {@link #updateSubscribe(SubscribeConfig)}. * * @hide PROPOSED_NAN_API */ -public class WifiNanSubscribeSession extends WifiNanSession { - private static final String TAG = "WifiNanSubscribeSession"; +public class WifiNanSubscribeDiscoverySession extends WifiNanDiscoveryBaseSession { + private static final String TAG = "WifiNanSubscribeDiscSsn"; /** * {@hide} */ - public WifiNanSubscribeSession(WifiNanManager manager, int sessionId) { - super(manager, sessionId); + public WifiNanSubscribeDiscoverySession(WifiNanManager manager, int clientId, int sessionId) { + super(manager, clientId, sessionId); } /** * Re-configure the currently active subscribe session. The - * {@link WifiNanSessionCallback} is not replaced - the same listener used + * {@link WifiNanDiscoverySessionCallback} is not replaced - the same listener used * at creation is still used. The results of the configuration are returned using - * {@link WifiNanSessionCallback}: + * {@link WifiNanDiscoverySessionCallback}: * <ul> - * <li>{@link WifiNanSessionCallback#onSessionConfigSuccess()}: configuration update - * succeeded. - * <li>{@link WifiNanSessionCallback#onSessionConfigFail(int)}: configuration update - * failed. The subscribe discovery session is still running using its previous + * <li>{@link WifiNanDiscoverySessionCallback#onSessionConfigUpdated()}: configuration + * update succeeded. + * <li>{@link WifiNanDiscoverySessionCallback#onSessionConfigFailed()}: configuration + * update failed. The subscribe discovery session is still running using its previous * configuration (i.e. update failure does not terminate the session). * </ul> * @@ -66,7 +67,7 @@ public class WifiNanSubscribeSession extends WifiNanSession { return; } - mgr.updateSubscribe(mSessionId, subscribeConfig); + mgr.updateSubscribe(mClientId, mSessionId, subscribeConfig); } } } diff --git a/wifi/tests/Android.mk b/wifi/tests/Android.mk new file mode 100644 index 000000000000..5850feee004a --- /dev/null +++ b/wifi/tests/Android.mk @@ -0,0 +1,61 @@ +# Copyright (C) 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. + +LOCAL_PATH:= $(call my-dir) + +# Make test APK +# ============================================================ +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := tests + +LOCAL_SRC_FILES := $(call all-subdir-java-files) + +# This list is generated from the java source files in this module +# The list is a comma separated list of class names with * matching zero or more characters. +# Example: +# Input files: src/com/android/server/wifi/Test.java src/com/android/server/wifi/AnotherTest.java +# Generated exclude list: com.android.server.wifi.Test*,com.android.server.wifi.AnotherTest* + +# Filter all src files to just java files +local_java_files := $(filter %.java,$(LOCAL_SRC_FILES)) +# Transform java file names into full class names. +# This only works if the class name matches the file name and the directory structure +# matches the package. +local_classes := $(subst /,.,$(patsubst src/%.java,%,$(local_java_files))) +# Utility variables to allow replacing a space with a comma +comma:= , +empty:= +space:= $(empty) $(empty) +# Convert class name list to jacoco exclude list +# This appends a * to all classes and replace the space separators with commas. +# These patterns will match all classes in this module and their inner classes. +jacoco_exclude := $(subst $(space),$(comma),$(patsubst %,%*,$(local_classes))) + +jacoco_include := android.net.wifi.* + +LOCAL_JACK_COVERAGE_INCLUDE_FILTER := $(jacoco_include) +LOCAL_JACK_COVERAGE_EXCLUDE_FILTER := $(jacoco_exclude) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android-support-test \ + mockito-target-minus-junit4 \ + frameworks-base-testutils \ + +LOCAL_JAVA_LIBRARIES := \ + android.test.runner \ + +LOCAL_PACKAGE_NAME := FrameworksWifiApiTests + +include $(BUILD_PACKAGE) diff --git a/wifi/tests/AndroidManifest.xml b/wifi/tests/AndroidManifest.xml new file mode 100644 index 000000000000..4eaca2b98a1d --- /dev/null +++ b/wifi/tests/AndroidManifest.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- + ~ Copyright (C) 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 + --> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="android.net.wifi.test"> + + <application> + <uses-library android:name="android.test.runner" /> + <activity android:label="WifiTestDummyLabel" + android:name="WifiTestDummyName"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER"/> + </intent-filter> + </activity> + </application> + + <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner" + android:targetPackage="android.net.wifi.test" + android:label="Frameworks Wifi API Tests"> + </instrumentation> + +</manifest> diff --git a/wifi/tests/README.md b/wifi/tests/README.md new file mode 100644 index 000000000000..b418abd5e46b --- /dev/null +++ b/wifi/tests/README.md @@ -0,0 +1,50 @@ +# Wifi Unit Tests +This package contains unit tests for the android wifi framework APIs based on the +[Android Testing Support Library](http://developer.android.com/tools/testing-support-library/index.html). +The test cases are built using the [JUnit](http://junit.org/) and [Mockito](http://mockito.org/) +libraries. + +## Running Tests +The easiest way to run tests is simply run + +``` +frameworks/base/wifi/tests/runtests.sh +``` + +`runtests.sh` will build the test project and all of its dependencies and push the APK to the +connected device. It will then run the tests on the device. + +To pick up changes in framework/base, you will need to: +1. rebuild the framework library 'make -j32' +2. sync over the updated library to the device 'adb sync' +3. restart framework on the device 'adb shell stop' then 'adb shell start' + +To enable syncing data to the device for first time after clean reflash: +1. adb disable-verity +2. adb reboot +3. adb remount + +See below for a few example of options to limit which tests are run. +See the +[AndroidJUnitRunner Documentation](https://developer.android.com/reference/android/support/test/runner/AndroidJUnitRunner.html) +for more details on the supported options. + +``` +runtests.sh -e package android.net.wifi +runtests.sh -e class android.net.wifi.WifiScannerTest +``` + +If you manually build and push the test APK to the device you can run tests using + +``` +adb shell am instrument -w 'android.net.wifi.test/android.support.test.runner.AndroidJUnitRunner' +``` + +## Adding Tests +Tests can be added by adding classes to the src directory. JUnit4 style test cases can +be written by simply annotating test methods with `org.junit.Test`. + +## Debugging Tests +If you are trying to debug why tests are not doing what you expected, you can add android log +statements and use logcat to view them. The beginning and end of every tests is automatically logged +with the tag `TestRunner`. diff --git a/wifi/tests/runtests.sh b/wifi/tests/runtests.sh new file mode 100755 index 000000000000..ebcc2a2f34a2 --- /dev/null +++ b/wifi/tests/runtests.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +if [ -z $ANDROID_BUILD_TOP ]; then + echo "You need to source and lunch before you can use this script" + exit 1 +fi + +echo "Running tests" + +set -e # fail early + +echo "+ mmma -j32 $ANDROID_BUILD_TOP/frameworks/base/wifi/tests" +# NOTE Don't actually run the command above since this shell doesn't inherit functions from the +# caller. +make -j32 -C $ANDROID_BUILD_TOP -f build/core/main.mk MODULES-IN-frameworks-base-wifi-tests + +set -x # print commands + +adb root +adb wait-for-device + +adb install -r -g "$OUT/data/app/FrameworksWifiApiTests/FrameworksWifiApiTests.apk" + +adb shell am instrument -w "$@" 'android.net.wifi.test/android.support.test.runner.AndroidJUnitRunner' diff --git a/wifi/tests/src/android/net/wifi/FakeKeys.java b/wifi/tests/src/android/net/wifi/FakeKeys.java new file mode 100644 index 000000000000..0c730705b039 --- /dev/null +++ b/wifi/tests/src/android/net/wifi/FakeKeys.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 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 + */ + +package android.net.wifi; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; + +/** + * A class containing test certificates. + */ +public class FakeKeys { + private static final String CA_CERT0_STRING = "-----BEGIN CERTIFICATE-----\n" + + "MIIDKDCCAhCgAwIBAgIJAILlFdwzLVurMA0GCSqGSIb3DQEBCwUAMBIxEDAOBgNV\n" + + "BAMTB0VBUCBDQTEwHhcNMTYwMTEyMTE1MDE1WhcNMjYwMTA5MTE1MDE1WjASMRAw\n" + + "DgYDVQQDEwdFQVAgQ0ExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n" + + "znAPUz26Msae4ws43czR41/J2QtrSIZUKmVUsVumDbYHrPNvTXKSMXAcewORDQYX\n" + + "RqvHvpn8CscB1+oGXZvHwxj4zV0WKoK2zeXkau3vcyl3HIKupJfq2TEACefVjj0t\n" + + "JW+X35PGWp9/H5zIUNVNVjS7Ums84IvKhRB8512PB9UyHagXYVX5GWpAcVpyfrlR\n" + + "FI9Qdhh+Pbk0uyktdbf/CdfgHOoebrTtwRljM0oDtX+2Cv6j0wBK7hD8pPvf1+uy\n" + + "GzczigAU/4Kw7eZqydf9B+5RupR+IZipX41xEiIrKRwqi517WWzXcjaG2cNbf451\n" + + "xpH5PnV3i1tq04jMGQUzFwIDAQABo4GAMH4wHQYDVR0OBBYEFIwX4vs8BiBcScod\n" + + "5noZHRM8E4+iMEIGA1UdIwQ7MDmAFIwX4vs8BiBcScod5noZHRM8E4+ioRakFDAS\n" + + "MRAwDgYDVQQDEwdFQVAgQ0ExggkAguUV3DMtW6swDAYDVR0TBAUwAwEB/zALBgNV\n" + + "HQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAFfQqOTA7Rv7K+luQ7pnas4BYwHE\n" + + "9GEP/uohv6KOy0TGQFbrRTjFoLVNB9BZ1ymMDZ0/TIwIUc7wi7a8t5mEqYH153wW\n" + + "aWooiSjyLLhuI4sNrNCOtisdBq2r2MFXt6h0mAQYOPv8R8K7/fgSxGFqzhyNmmVL\n" + + "1qBJldx34SpwsTALQVPb4hGwJzZfr1PcpEQx6xMnTl8xEWZE3Ms99uaUxbQqIwRu\n" + + "LgAOkNCmY2m89VhzaHJ1uV85AdM/tD+Ysmlnnjt9LRCejbBipjIGjOXrg1JP+lxV\n" + + "muM4vH+P/mlmxsPPz0d65b+EGmJZpoLkO/tdNNvCYzjJpTEWpEsO6NMhKYo=\n" + + "-----END CERTIFICATE-----\n"; + public static final X509Certificate CA_CERT0 = loadCertificate(CA_CERT0_STRING); + + private static final String CA_CERT1_STRING = "-----BEGIN CERTIFICATE-----\n" + + "MIIDKDCCAhCgAwIBAgIJAOM5SzKO2pzCMA0GCSqGSIb3DQEBCwUAMBIxEDAOBgNV\n" + + "BAMTB0VBUCBDQTAwHhcNMTYwMTEyMDAxMDQ3WhcNMjYwMTA5MDAxMDQ3WjASMRAw\n" + + "DgYDVQQDEwdFQVAgQ0EwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n" + + "89ug+IEKVQXnJGKg5g4uVHg6J/8iRUxR5k2eH5o03hrJNMfN2D+cBe/wCiZcnWbI\n" + + "GbGZACWm2nQth2wy9Zgm2LOd3b4ocrHYls3XLq6Qb5Dd7a0JKU7pdGufiNVEkrmF\n" + + "EB+N64wgwH4COTvCiN4erp5kyJwkfqAl2xLkZo0C464c9XoyQOXbmYD9A8v10wZu\n" + + "jyNsEo7Nr2USyw+qhjWSbFbEirP77Tvx+7pJQJwdtk1V9Tn73T2dGF2WHYejei9S\n" + + "mcWpdIUqsu9etYH+zDmtu7I1xlkwiaVsNr2+D+qaCJyOYqrDTKVNK5nmbBPXDWZc\n" + + "NoDbTOoqquX7xONpq9M6jQIDAQABo4GAMH4wHQYDVR0OBBYEFAZ3A2S4qJZZwuNY\n" + + "wkJ6mAdc0gVdMEIGA1UdIwQ7MDmAFAZ3A2S4qJZZwuNYwkJ6mAdc0gVdoRakFDAS\n" + + "MRAwDgYDVQQDEwdFQVAgQ0EwggkA4zlLMo7anMIwDAYDVR0TBAUwAwEB/zALBgNV\n" + + "HQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAHmdMwEhtys4d0E+t7owBmoVR+lU\n" + + "hMCcRtWs8YKX5WIM2kTweT0h/O1xwE1mWmRv/IbDAEb8od4BjAQLhIcolStr2JaO\n" + + "9ZzyxjOnNzqeErh/1DHDbb/moPpqfeJ8YiEz7nH/YU56Q8iCPO7TsgS0sNNE7PfN\n" + + "IUsBW0yHRgpQ4OxWmiZG2YZWiECRzAC0ecPzo59N5iH4vLQIMTMYquiDeMPQnn1e\n" + + "NDGxG8gCtDKIaS6tMg3a28MvWB094pr2ETou8O1C8Ji0Y4hE8QJmSdT7I4+GZjgW\n" + + "g94DZ5RiL7sdp3vC48CXOmeT61YBIvhGUsE1rPhXqkpqQ3Z3C4TFF0jXZZc=\n" + + "-----END CERTIFICATE-----\n"; + public static final X509Certificate CA_CERT1 = loadCertificate(CA_CERT1_STRING); + + + private static X509Certificate loadCertificate(String blob) { + try { + final CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + InputStream stream = new ByteArrayInputStream(blob.getBytes(StandardCharsets.UTF_8)); + + return (X509Certificate) certFactory.generateCertificate(stream); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/wifi/tests/src/android/net/wifi/WifiEnterpriseConfigTest.java b/wifi/tests/src/android/net/wifi/WifiEnterpriseConfigTest.java new file mode 100644 index 000000000000..0d964b7c92d7 --- /dev/null +++ b/wifi/tests/src/android/net/wifi/WifiEnterpriseConfigTest.java @@ -0,0 +1,282 @@ +/* + * Copyright (C) 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 + */ + +package android.net.wifi; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertNull; + +import android.net.wifi.WifiEnterpriseConfig.Eap; +import android.net.wifi.WifiEnterpriseConfig.Phase2; +import android.os.Parcel; +import android.security.Credentials; +import android.test.suitebuilder.annotation.SmallTest; + +import org.junit.Before; +import org.junit.Test; + +import java.security.cert.X509Certificate; + + +/** + * Unit tests for {@link android.net.wifi.WifiEnterpriseConfig}. + */ +@SmallTest +public class WifiEnterpriseConfigTest { + // Maintain a ground truth of the keystore uri prefix which is expected by wpa_supplicant. + public static final String KEYSTORE_URI = "keystore://"; + public static final String CA_CERT_PREFIX = KEYSTORE_URI + Credentials.CA_CERTIFICATE; + public static final String KEYSTORES_URI = "keystores://"; + + private WifiEnterpriseConfig mEnterpriseConfig; + + @Before + public void setUp() throws Exception { + mEnterpriseConfig = new WifiEnterpriseConfig(); + } + + @Test + public void testGetEmptyCaCertificate() { + // A newly-constructed WifiEnterpriseConfig object should have no CA certificate. + assertNull(mEnterpriseConfig.getCaCertificate()); + assertNull(mEnterpriseConfig.getCaCertificates()); + // Setting CA certificate to null explicitly. + mEnterpriseConfig.setCaCertificate(null); + assertNull(mEnterpriseConfig.getCaCertificate()); + // Setting CA certificate to null using setCaCertificates(). + mEnterpriseConfig.setCaCertificates(null); + assertNull(mEnterpriseConfig.getCaCertificates()); + // Setting CA certificate to zero-length array. + mEnterpriseConfig.setCaCertificates(new X509Certificate[0]); + assertNull(mEnterpriseConfig.getCaCertificates()); + } + + @Test + public void testSetGetSingleCaCertificate() { + X509Certificate cert0 = FakeKeys.CA_CERT0; + mEnterpriseConfig.setCaCertificate(cert0); + assertEquals(mEnterpriseConfig.getCaCertificate(), cert0); + } + + @Test + public void testSetGetMultipleCaCertificates() { + X509Certificate cert0 = FakeKeys.CA_CERT0; + X509Certificate cert1 = FakeKeys.CA_CERT1; + mEnterpriseConfig.setCaCertificates(new X509Certificate[] {cert0, cert1}); + X509Certificate[] result = mEnterpriseConfig.getCaCertificates(); + assertEquals(result.length, 2); + assertTrue(result[0] == cert0 && result[1] == cert1); + } + + @Test + public void testSaveSingleCaCertificateAlias() { + final String alias = "single_alias 0"; + mEnterpriseConfig.setCaCertificateAliases(new String[] {alias}); + assertEquals(getCaCertField(), CA_CERT_PREFIX + alias); + } + + @Test + public void testLoadSingleCaCertificateAlias() { + final String alias = "single_alias 1"; + setCaCertField(CA_CERT_PREFIX + alias); + String[] aliases = mEnterpriseConfig.getCaCertificateAliases(); + assertEquals(aliases.length, 1); + assertEquals(aliases[0], alias); + } + + @Test + public void testSaveMultipleCaCertificates() { + final String alias0 = "single_alias 0"; + final String alias1 = "single_alias 1"; + mEnterpriseConfig.setCaCertificateAliases(new String[] {alias0, alias1}); + assertEquals(getCaCertField(), String.format("%s%s %s", + KEYSTORES_URI, + WifiEnterpriseConfig.encodeCaCertificateAlias(Credentials.CA_CERTIFICATE + alias0), + WifiEnterpriseConfig.encodeCaCertificateAlias(Credentials.CA_CERTIFICATE + alias1))); + } + + @Test + public void testLoadMultipleCaCertificates() { + final String alias0 = "single_alias 0"; + final String alias1 = "single_alias 1"; + setCaCertField(String.format("%s%s %s", + KEYSTORES_URI, + WifiEnterpriseConfig.encodeCaCertificateAlias(Credentials.CA_CERTIFICATE + alias0), + WifiEnterpriseConfig.encodeCaCertificateAlias(Credentials.CA_CERTIFICATE + alias1))); + String[] aliases = mEnterpriseConfig.getCaCertificateAliases(); + assertEquals(aliases.length, 2); + assertEquals(aliases[0], alias0); + assertEquals(aliases[1], alias1); + } + + private String getCaCertField() { + return mEnterpriseConfig.getFieldValue(WifiEnterpriseConfig.CA_CERT_KEY); + } + + private void setCaCertField(String value) { + mEnterpriseConfig.setFieldValue(WifiEnterpriseConfig.CA_CERT_KEY, value); + } + + // Retrieves the value for a specific key supplied to wpa_supplicant. + private class SupplicantConfigExtractor implements WifiEnterpriseConfig.SupplicantSaver { + private String mValue = null; + private String mKey; + + SupplicantConfigExtractor(String key) { + mKey = key; + } + + @Override + public boolean saveValue(String key, String value) { + if (key.equals(mKey)) { + mValue = value; + } + return true; + } + + public String getValue() { + return mValue; + } + } + + private String getSupplicantEapMethod() { + SupplicantConfigExtractor entryExtractor = new SupplicantConfigExtractor( + WifiEnterpriseConfig.EAP_KEY); + mEnterpriseConfig.saveToSupplicant(entryExtractor); + return entryExtractor.getValue(); + } + + private String getSupplicantPhase2Method() { + SupplicantConfigExtractor entryExtractor = new SupplicantConfigExtractor( + WifiEnterpriseConfig.PHASE2_KEY); + mEnterpriseConfig.saveToSupplicant(entryExtractor); + return entryExtractor.getValue(); + } + + /** Verifies the default value for EAP outer and inner methods */ + @Test + public void eapInnerDefault() { + assertEquals(null, getSupplicantEapMethod()); + assertEquals(null, getSupplicantPhase2Method()); + } + + /** Verifies that the EAP inner method is reset when we switch to TLS */ + @Test + public void eapPhase2MethodForTls() { + // Initially select an EAP method that supports an phase2. + mEnterpriseConfig.setEapMethod(Eap.PEAP); + mEnterpriseConfig.setPhase2Method(Phase2.MSCHAPV2); + assertEquals("PEAP", getSupplicantEapMethod()); + assertEquals("\"auth=MSCHAPV2\"", getSupplicantPhase2Method()); + + // Change the EAP method to another type which supports a phase2. + mEnterpriseConfig.setEapMethod(Eap.TTLS); + assertEquals("TTLS", getSupplicantEapMethod()); + assertEquals("\"auth=MSCHAPV2\"", getSupplicantPhase2Method()); + + // Change the EAP method to TLS which does not support a phase2. + mEnterpriseConfig.setEapMethod(Eap.TLS); + assertEquals(null, getSupplicantPhase2Method()); + } + + /** Verfies that the EAP inner method is reset when we switch phase2 to NONE */ + @Test + public void eapPhase2None() { + // Initially select an EAP method that supports an phase2. + mEnterpriseConfig.setEapMethod(Eap.PEAP); + mEnterpriseConfig.setPhase2Method(Phase2.MSCHAPV2); + assertEquals("PEAP", getSupplicantEapMethod()); + assertEquals("\"auth=MSCHAPV2\"", getSupplicantPhase2Method()); + + // Change the phase2 method to NONE and ensure the value is cleared. + mEnterpriseConfig.setPhase2Method(Phase2.NONE); + assertEquals(null, getSupplicantPhase2Method()); + } + + /** Verfies that the correct "autheap" parameter is supplied for TTLS/GTC. */ + @Test + public void peapGtcToTtls() { + mEnterpriseConfig.setEapMethod(Eap.PEAP); + mEnterpriseConfig.setPhase2Method(Phase2.GTC); + assertEquals("PEAP", getSupplicantEapMethod()); + assertEquals("\"auth=GTC\"", getSupplicantPhase2Method()); + + mEnterpriseConfig.setEapMethod(Eap.TTLS); + assertEquals("TTLS", getSupplicantEapMethod()); + assertEquals("\"autheap=GTC\"", getSupplicantPhase2Method()); + } + + /** Verfies that the correct "auth" parameter is supplied for PEAP/GTC. */ + @Test + public void ttlsGtcToPeap() { + mEnterpriseConfig.setEapMethod(Eap.TTLS); + mEnterpriseConfig.setPhase2Method(Phase2.GTC); + assertEquals("TTLS", getSupplicantEapMethod()); + assertEquals("\"autheap=GTC\"", getSupplicantPhase2Method()); + + mEnterpriseConfig.setEapMethod(Eap.PEAP); + assertEquals("PEAP", getSupplicantEapMethod()); + assertEquals("\"auth=GTC\"", getSupplicantPhase2Method()); + } + + /** Verfies that the copy constructor preseves the inner method information. */ + @Test + public void copyConstructor() { + WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); + enterpriseConfig.setEapMethod(Eap.TTLS); + enterpriseConfig.setPhase2Method(Phase2.GTC); + mEnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig); + assertEquals("TTLS", getSupplicantEapMethod()); + assertEquals("\"autheap=GTC\"", getSupplicantPhase2Method()); + } + + /** Verfies that parceling a WifiEnterpriseConfig preseves method information. */ + @Test + public void parcelConstructor() { + WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); + enterpriseConfig.setEapMethod(Eap.TTLS); + enterpriseConfig.setPhase2Method(Phase2.GTC); + Parcel parcel = Parcel.obtain(); + enterpriseConfig.writeToParcel(parcel, 0); + parcel.setDataPosition(0); // Allow parcel to be read from the beginning. + mEnterpriseConfig = WifiEnterpriseConfig.CREATOR.createFromParcel(parcel); + assertEquals("TTLS", getSupplicantEapMethod()); + assertEquals("\"autheap=GTC\"", getSupplicantPhase2Method()); + } + + /** Verifies proper operation of the getKeyId() method. */ + @Test + public void getKeyId() { + assertEquals("NULL", mEnterpriseConfig.getKeyId(null)); + WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); + enterpriseConfig.setEapMethod(Eap.TTLS); + enterpriseConfig.setPhase2Method(Phase2.GTC); + assertEquals("TTLS_GTC", mEnterpriseConfig.getKeyId(enterpriseConfig)); + mEnterpriseConfig.setEapMethod(Eap.PEAP); + mEnterpriseConfig.setPhase2Method(Phase2.MSCHAPV2); + assertEquals("PEAP_MSCHAPV2", mEnterpriseConfig.getKeyId(enterpriseConfig)); + } + + /** Verifies that passwords are not displayed in toString. */ + @Test + public void passwordNotInToString() { + String password = "supersecret"; + mEnterpriseConfig.setPassword(password); + assertFalse(mEnterpriseConfig.toString().contains(password)); + } +} diff --git a/wifi/tests/src/android/net/wifi/WifiScannerTest.java b/wifi/tests/src/android/net/wifi/WifiScannerTest.java new file mode 100644 index 000000000000..a829eb933b59 --- /dev/null +++ b/wifi/tests/src/android/net/wifi/WifiScannerTest.java @@ -0,0 +1,111 @@ +/* + * Copyright (C) 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. + */ + +package android.net.wifi; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.validateMockitoUsage; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.net.wifi.WifiScanner.BssidInfo; +import android.net.wifi.WifiScanner.BssidListener; +import android.os.Handler; +import android.os.Message; +import android.os.test.TestLooper; +import android.test.suitebuilder.annotation.SmallTest; + +import com.android.internal.util.test.BidirectionalAsyncChannelServer; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +/** + * Unit tests for {@link android.net.wifi.WifiScanner}. + */ +@SmallTest +public class WifiScannerTest { + @Mock + private Context mContext; + @Mock + private IWifiScanner mService; + @Mock + private BssidListener mBssidListener; + + private WifiScanner mWifiScanner; + private TestLooper mLooper; + private Handler mHandler; + + /** + * Setup before tests. + */ + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + mLooper = new TestLooper(); + mHandler = mock(Handler.class); + BidirectionalAsyncChannelServer server = new BidirectionalAsyncChannelServer( + mContext, mLooper.getLooper(), mHandler); + when(mService.getMessenger()).thenReturn(server.getMessenger()); + mWifiScanner = new WifiScanner(mContext, mService, mLooper.getLooper()); + mLooper.dispatchAll(); + } + + /** + * Clean up after tests. + */ + @After + public void cleanup() { + validateMockitoUsage(); + } + + private void verifySetHotlistMessage(Handler handler) { + ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); + verify(handler, atLeastOnce()).handleMessage(messageCaptor.capture()); + assertEquals("message.what is not CMD_SET_HOTLIST", + WifiScanner.CMD_SET_HOTLIST, + messageCaptor.getValue().what); + } + + /** + * Test duplicate listeners for bssid tracking. + */ + @Test + public void testStartTrackingBssidsDuplicateListeners() throws Exception { + BssidInfo[] bssids = new BssidInfo[] { + new BssidInfo() + }; + + // First start tracking succeeds. + mWifiScanner.startTrackingBssids(bssids, -100, mBssidListener); + mLooper.dispatchAll(); + verifySetHotlistMessage(mHandler); + + // Second start tracking should fail. + mWifiScanner.startTrackingBssids(bssids, -100, mBssidListener); + mLooper.dispatchAll(); + verify(mBssidListener).onFailure(eq(WifiScanner.REASON_DUPLICATE_REQEUST), anyString()); + } +} |